~ubuntu-branches/debian/sid/gcc-4.8/sid

« back to all changes in this revision

Viewing changes to .svn/pristine/7a/7a61f4831e73d831ac414bb5311845da04736f5f.svn-base

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2014-12-19 19:48:34 UTC
  • Revision ID: package-import@ubuntu.com-20141219194834-4dz1q7rrn5pad823
Tags: 4.8.4-1
* GCC 4.8.4 release.
  - Fix PR target/61407 (darwin), PR middle-end/58624 (ice),
    PR sanitizer/64265 (wrong code).
* Require recent binutils to pass go test failures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# DP: Changes for the Linaro 4.8-2013.10 release.
 
2
 
 
3
LANG=C svn diff svn://gcc.gnu.org/svn/gcc/branches/gcc-4_8-branch@203510 \
 
4
    svn://gcc.gnu.org/svn/gcc/branches/linaro/gcc-4_8-branch@203615 \
 
5
 | filterdiff --remove-timestamps --addoldprefix=a/src/ --addnewprefix=b/src/
 
6
 
 
7
--- a/src/libitm/ChangeLog.linaro
 
8
+++ b/src/libitm/ChangeLog.linaro
 
9
@@ -0,0 +1,27 @@
 
10
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11
+
 
12
+        GCC Linaro 4.8-2013.09 released.
 
13
+
 
14
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
15
+
 
16
+       GCC Linaro 4.8-2013.08 released.
 
17
+
 
18
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
19
+
 
20
+        GCC Linaro 4.8-2013.07-1 released.
 
21
+
 
22
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
23
+
 
24
+       GCC Linaro 4.8-2013.07 released.
 
25
+
 
26
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
27
+
 
28
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
29
+
 
30
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
31
+
 
32
+       GCC Linaro 4.8-2013.05 released.
 
33
+
 
34
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
35
+
 
36
+       * GCC Linaro 4.8-2013.04 released.
 
37
--- a/src/libgomp/ChangeLog.linaro
 
38
+++ b/src/libgomp/ChangeLog.linaro
 
39
@@ -0,0 +1,35 @@
 
40
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
41
+
 
42
+        GCC Linaro 4.8-2013.09 released.
 
43
+
 
44
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
45
+
 
46
+       GCC Linaro 4.8-2013.08 released.
 
47
+
 
48
+2013-07-22  Yvan Roux  <yvan.roux@linaro.org>
 
49
+
 
50
+       Backport from trunk r200521.
 
51
+       2013-06-28  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
52
+
 
53
+       * testsuite/libgomp.fortran/strassen.f90:
 
54
+       Add dg-skip-if aarch64_tiny.
 
55
+
 
56
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
57
+
 
58
+        GCC Linaro 4.8-2013.07-1 released.
 
59
+
 
60
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
61
+
 
62
+       GCC Linaro 4.8-2013.07 released.
 
63
+
 
64
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
65
+
 
66
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
67
+
 
68
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
69
+
 
70
+       GCC Linaro 4.8-2013.05 released.
 
71
+
 
72
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
73
+
 
74
+       * GCC Linaro 4.8-2013.04 released.
 
75
--- a/src/libgomp/testsuite/libgomp.fortran/strassen.f90
 
76
+++ b/src/libgomp/testsuite/libgomp.fortran/strassen.f90
 
77
@@ -1,4 +1,5 @@
 
78
 ! { dg-options "-O2" }
 
79
+! { dg-skip-if "AArch64 tiny code model does not support programs larger than 1MiB" {aarch64_tiny} {"*"} {""} }
 
80
 
 
81
 program strassen_matmul
 
82
   use omp_lib
 
83
--- a/src/libquadmath/ChangeLog.linaro
 
84
+++ b/src/libquadmath/ChangeLog.linaro
 
85
@@ -0,0 +1,27 @@
 
86
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
87
+
 
88
+        GCC Linaro 4.8-2013.09 released.
 
89
+
 
90
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
91
+
 
92
+       GCC Linaro 4.8-2013.08 released.
 
93
+
 
94
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
95
+
 
96
+        GCC Linaro 4.8-2013.07-1 released.
 
97
+
 
98
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
99
+
 
100
+       GCC Linaro 4.8-2013.07 released.
 
101
+
 
102
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
103
+
 
104
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
105
+
 
106
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
107
+
 
108
+       GCC Linaro 4.8-2013.05 released.
 
109
+
 
110
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
111
+
 
112
+       * GCC Linaro 4.8-2013.04 released.
 
113
--- a/src/libsanitizer/sanitizer_common/sanitizer_linux.cc
 
114
+++ b/src/libsanitizer/sanitizer_common/sanitizer_linux.cc
 
115
@@ -410,7 +410,9 @@
 
116
   CHECK_EQ(*current_++, ' ');
 
117
   while (IsDecimal(*current_))
 
118
     current_++;
 
119
-  CHECK_EQ(*current_++, ' ');
 
120
+  // Qemu may lack the trailing space.
 
121
+  // http://code.google.com/p/address-sanitizer/issues/detail?id=160
 
122
+  // CHECK_EQ(*current_++, ' ');
 
123
   // Skip spaces.
 
124
   while (current_ < next_line && *current_ == ' ')
 
125
     current_++;
 
126
--- a/src/libsanitizer/ChangeLog.linaro
 
127
+++ b/src/libsanitizer/ChangeLog.linaro
 
128
@@ -0,0 +1,42 @@
 
129
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
130
+
 
131
+        GCC Linaro 4.8-2013.09 released.
 
132
+
 
133
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
134
+
 
135
+       GCC Linaro 4.8-2013.08 released.
 
136
+
 
137
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
138
+
 
139
+        GCC Linaro 4.8-2013.07-1 released.
 
140
+
 
141
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
142
+
 
143
+       GCC Linaro 4.8-2013.07 released.
 
144
+
 
145
+2013-06-20  Christophe Lyon  <christophe.lyon@linaro.org>
 
146
+
 
147
+       Backport from trunk r198683.
 
148
+       2013-05-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
149
+
 
150
+       * configure.tgt: Add ARM pattern.
 
151
+
 
152
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
153
+
 
154
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
155
+
 
156
+2013-06-04  Christophe Lyon  <christophe.lyon@linaro.org>
 
157
+
 
158
+       Backport from trunk r199606.
 
159
+       2013-06-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
160
+
 
161
+       * sanitizer_common/sanitizer_linux.cc (MemoryMappingLayout::Next):
 
162
+       Cherry pick upstream r182922.
 
163
+
 
164
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
165
+
 
166
+       GCC Linaro 4.8-2013.05 released.
 
167
+
 
168
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
169
+
 
170
+       * GCC Linaro 4.8-2013.04 released.
 
171
--- a/src/libsanitizer/configure.tgt
 
172
+++ b/src/libsanitizer/configure.tgt
 
173
@@ -29,6 +29,8 @@
 
174
        ;;
 
175
   sparc*-*-linux*)
 
176
        ;;
 
177
+  arm*-*-linux*)
 
178
+       ;;
 
179
   x86_64-*-darwin[1]* | i?86-*-darwin[1]*)
 
180
        TSAN_SUPPORTED=no
 
181
        ;;
 
182
--- a/src/zlib/ChangeLog.linaro
 
183
+++ b/src/zlib/ChangeLog.linaro
 
184
@@ -0,0 +1,27 @@
 
185
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
186
+
 
187
+        GCC Linaro 4.8-2013.09 released.
 
188
+
 
189
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
190
+
 
191
+       GCC Linaro 4.8-2013.08 released.
 
192
+
 
193
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
194
+
 
195
+        GCC Linaro 4.8-2013.07-1 released.
 
196
+
 
197
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
198
+
 
199
+       GCC Linaro 4.8-2013.07 released.
 
200
+
 
201
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
202
+
 
203
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
204
+
 
205
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
206
+
 
207
+       GCC Linaro 4.8-2013.05 released.
 
208
+
 
209
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
210
+
 
211
+       * GCC Linaro 4.8-2013.04 released.
 
212
--- a/src/libstdc++-v3/ChangeLog.linaro
 
213
+++ b/src/libstdc++-v3/ChangeLog.linaro
 
214
@@ -0,0 +1,27 @@
 
215
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
216
+
 
217
+        GCC Linaro 4.8-2013.09 released.
 
218
+
 
219
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
220
+
 
221
+       GCC Linaro 4.8-2013.08 released.
 
222
+
 
223
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
224
+
 
225
+        GCC Linaro 4.8-2013.07-1 released.
 
226
+
 
227
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
228
+
 
229
+       GCC Linaro 4.8-2013.07 released.
 
230
+
 
231
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
232
+
 
233
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
234
+
 
235
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
236
+
 
237
+       GCC Linaro 4.8-2013.05 released.
 
238
+
 
239
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
240
+
 
241
+       * GCC Linaro 4.8-2013.04 released.
 
242
--- a/src/intl/ChangeLog.linaro
 
243
+++ b/src/intl/ChangeLog.linaro
 
244
@@ -0,0 +1,27 @@
 
245
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
246
+
 
247
+        GCC Linaro 4.8-2013.09 released.
 
248
+
 
249
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
250
+
 
251
+       GCC Linaro 4.8-2013.08 released.
 
252
+
 
253
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
254
+
 
255
+        GCC Linaro 4.8-2013.07-1 released.
 
256
+
 
257
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
258
+
 
259
+       GCC Linaro 4.8-2013.07 released.
 
260
+
 
261
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
262
+
 
263
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
264
+
 
265
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
266
+
 
267
+       GCC Linaro 4.8-2013.05 released.
 
268
+
 
269
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
270
+
 
271
+       * GCC Linaro 4.8-2013.04 released.
 
272
--- a/src/ChangeLog.linaro
 
273
+++ b/src/ChangeLog.linaro
 
274
@@ -0,0 +1,37 @@
 
275
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
276
+
 
277
+        GCC Linaro 4.8-2013.09 released.
 
278
+
 
279
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
280
+
 
281
+       GCC Linaro 4.8-2013.08 released.
 
282
+
 
283
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
284
+
 
285
+        GCC Linaro 4.8-2013.07-1 released.
 
286
+
 
287
+2013-07-09  Christophe Lyon  <christophe.lyon@linaro.org>
 
288
+
 
289
+       gcc/
 
290
+        * LINARO-VERSION: Bump version.
 
291
+
 
292
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
293
+
 
294
+       GCC Linaro 4.8-2013.07 released.
 
295
+
 
296
+2013-06-18  Rob Savoye  <rob.savoye@linaro.org>
 
297
+
 
298
+       gcc/
 
299
+        * LINARO-VERSION: Bump version.
 
300
+
 
301
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
302
+
 
303
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
304
+
 
305
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
306
+
 
307
+       GCC Linaro 4.8-2013.05 released.
 
308
+
 
309
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
310
+
 
311
+       * GCC Linaro 4.8-2013.04 released.
 
312
--- a/src/libmudflap/ChangeLog.linaro
 
313
+++ b/src/libmudflap/ChangeLog.linaro
 
314
@@ -0,0 +1,27 @@
 
315
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
316
+
 
317
+        GCC Linaro 4.8-2013.09 released.
 
318
+
 
319
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
320
+
 
321
+       GCC Linaro 4.8-2013.08 released.
 
322
+
 
323
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
324
+
 
325
+        GCC Linaro 4.8-2013.07-1 released.
 
326
+
 
327
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
328
+
 
329
+       GCC Linaro 4.8-2013.07 released.
 
330
+
 
331
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
332
+
 
333
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
334
+
 
335
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
336
+
 
337
+       GCC Linaro 4.8-2013.05 released.
 
338
+
 
339
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
340
+
 
341
+       * GCC Linaro 4.8-2013.04 released.
 
342
--- a/src/boehm-gc/ChangeLog.linaro
 
343
+++ b/src/boehm-gc/ChangeLog.linaro
 
344
@@ -0,0 +1,40 @@
 
345
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
346
+
 
347
+        GCC Linaro 4.8-2013.09 released.
 
348
+
 
349
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
350
+
 
351
+       GCC Linaro 4.8-2013.08 released.
 
352
+
 
353
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
354
+
 
355
+        GCC Linaro 4.8-2013.07-1 released.
 
356
+
 
357
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
358
+
 
359
+       GCC Linaro 4.8-2013.07 released.
 
360
+
 
361
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
362
+
 
363
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
364
+
 
365
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
366
+
 
367
+       GCC Linaro 4.8-2013.05 released.
 
368
+
 
369
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
370
+
 
371
+       Backport from trunk r197770.
 
372
+
 
373
+       2013-03-16  Yvan Roux <yvan.roux@linaro.org>
 
374
+
 
375
+       * include/private/gcconfig.h (AARCH64): New macro (defined only if
 
376
+       __aarch64__).
 
377
+       (mach_type_known): Update comment adding ARM AArch64 target.
 
378
+       (NOSYS, mach_type_known,CPP_WORDSZ, MACH_TYPE, ALIGNMENT, HBLKSIZE,
 
379
+       OS_TYPE, LINUX_STACKBOTTOM, USE_GENERIC_PUSH_REGS, DYNAMIC_LOADING,
 
380
+       DATASTART, DATAEND, STACKBOTTOM): Define for AArch64.
 
381
+
 
382
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
383
+
 
384
+       * GCC Linaro 4.8-2013.04 released.
 
385
--- a/src/boehm-gc/include/private/gcconfig.h
 
386
+++ b/src/boehm-gc/include/private/gcconfig.h
 
387
@@ -60,6 +60,13 @@
 
388
 # endif
 
389
 
 
390
 /* Determine the machine type: */
 
391
+#if defined(__aarch64__)
 
392
+#    define AARCH64
 
393
+#    if !defined(LINUX)
 
394
+#      define NOSYS
 
395
+#      define mach_type_known
 
396
+#    endif
 
397
+# endif
 
398
 # if defined(__arm__) || defined(__thumb__)
 
399
 #    define ARM32
 
400
 #    if !defined(LINUX) && !defined(NETBSD)
 
401
@@ -239,6 +246,10 @@
 
402
 #    define IA64
 
403
 #    define mach_type_known
 
404
 # endif
 
405
+# if defined(LINUX) && defined(__aarch64__)
 
406
+#    define AARCH64
 
407
+#    define mach_type_known
 
408
+# endif
 
409
 # if defined(LINUX) && defined(__arm__)
 
410
 #    define ARM32
 
411
 #    define mach_type_known
 
412
@@ -500,6 +511,7 @@
 
413
                    /*                  running Amdahl UTS4             */
 
414
                     /*             S390       ==> 390-like machine      */
 
415
                    /*                  running LINUX                   */
 
416
+                    /*             AARCH64    ==> ARM AArch64           */
 
417
                    /*             ARM32      ==> Intel StrongARM       */
 
418
                    /*             IA64       ==> Intel IPF             */
 
419
                    /*                            (e.g. Itanium)        */
 
420
@@ -1833,6 +1845,32 @@
 
421
 #   define HEURISTIC1
 
422
 # endif
 
423
 
 
424
+# ifdef AARCH64
 
425
+#   define CPP_WORDSZ 64
 
426
+#   define MACH_TYPE "AARCH64"
 
427
+#   define ALIGNMENT 8
 
428
+#   ifndef HBLKSIZE
 
429
+#     define HBLKSIZE 4096
 
430
+#   endif
 
431
+#   ifdef LINUX
 
432
+#     define OS_TYPE "LINUX"
 
433
+#     define LINUX_STACKBOTTOM
 
434
+#     define USE_GENERIC_PUSH_REGS
 
435
+#     define DYNAMIC_LOADING
 
436
+      extern int __data_start[];
 
437
+#     define DATASTART ((ptr_t)__data_start)
 
438
+      extern char _end[];
 
439
+#     define DATAEND ((ptr_t)(&_end))
 
440
+#   endif
 
441
+#   ifdef NOSYS
 
442
+      /* __data_start is usually defined in the target linker script.   */
 
443
+      extern int __data_start[];
 
444
+#     define DATASTART ((ptr_t)__data_start)
 
445
+      extern void *__stack_base__;
 
446
+#     define STACKBOTTOM ((ptr_t)__stack_base__)
 
447
+#   endif
 
448
+# endif
 
449
+
 
450
 # ifdef ARM32
 
451
 #   define CPP_WORDSZ 32
 
452
 #   define MACH_TYPE "ARM32"
 
453
--- a/src/include/ChangeLog.linaro
 
454
+++ b/src/include/ChangeLog.linaro
 
455
@@ -0,0 +1,27 @@
 
456
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
457
+
 
458
+        GCC Linaro 4.8-2013.09 released.
 
459
+
 
460
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
461
+
 
462
+       GCC Linaro 4.8-2013.08 released.
 
463
+
 
464
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
465
+
 
466
+        GCC Linaro 4.8-2013.07-1 released.
 
467
+
 
468
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
469
+
 
470
+       GCC Linaro 4.8-2013.07 released.
 
471
+
 
472
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
473
+
 
474
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
475
+
 
476
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
477
+
 
478
+       GCC Linaro 4.8-2013.05 released.
 
479
+
 
480
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
481
+
 
482
+       * GCC Linaro 4.8-2013.04 released.
 
483
--- a/src/libiberty/ChangeLog.linaro
 
484
+++ b/src/libiberty/ChangeLog.linaro
 
485
@@ -0,0 +1,27 @@
 
486
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
487
+
 
488
+        GCC Linaro 4.8-2013.09 released.
 
489
+
 
490
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
491
+
 
492
+       GCC Linaro 4.8-2013.08 released.
 
493
+
 
494
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
495
+
 
496
+        GCC Linaro 4.8-2013.07-1 released.
 
497
+
 
498
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
499
+
 
500
+       GCC Linaro 4.8-2013.07 released.
 
501
+
 
502
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
503
+
 
504
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
505
+
 
506
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
507
+
 
508
+       GCC Linaro 4.8-2013.05 released.
 
509
+
 
510
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
511
+
 
512
+       * GCC Linaro 4.8-2013.04 released.
 
513
--- a/src/lto-plugin/ChangeLog.linaro
 
514
+++ b/src/lto-plugin/ChangeLog.linaro
 
515
@@ -0,0 +1,27 @@
 
516
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
517
+
 
518
+        GCC Linaro 4.8-2013.09 released.
 
519
+
 
520
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
521
+
 
522
+       GCC Linaro 4.8-2013.08 released.
 
523
+
 
524
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
525
+
 
526
+        GCC Linaro 4.8-2013.07-1 released.
 
527
+
 
528
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
529
+
 
530
+       GCC Linaro 4.8-2013.07 released.
 
531
+
 
532
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
533
+
 
534
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
535
+
 
536
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
537
+
 
538
+       GCC Linaro 4.8-2013.05 released.
 
539
+
 
540
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
541
+
 
542
+       * GCC Linaro 4.8-2013.04 released.
 
543
--- a/src/contrib/regression/ChangeLog.linaro
 
544
+++ b/src/contrib/regression/ChangeLog.linaro
 
545
@@ -0,0 +1,27 @@
 
546
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
547
+
 
548
+        GCC Linaro 4.8-2013.09 released.
 
549
+
 
550
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
551
+
 
552
+       GCC Linaro 4.8-2013.08 released.
 
553
+
 
554
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
555
+
 
556
+        GCC Linaro 4.8-2013.07-1 released.
 
557
+
 
558
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
559
+
 
560
+       GCC Linaro 4.8-2013.07 released.
 
561
+
 
562
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
563
+
 
564
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
565
+
 
566
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
567
+
 
568
+       GCC Linaro 4.8-2013.05 released.
 
569
+
 
570
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
571
+
 
572
+       * GCC Linaro 4.8-2013.04 released.
 
573
--- a/src/contrib/config-list.mk
 
574
+++ b/src/contrib/config-list.mk
 
575
@@ -11,7 +11,8 @@
 
576
 # nohup nice make -j25 -l36 -f ../gcc/contrib/config-list.mk > make.out 2>&1 &
 
577
 #
 
578
 # v850e1-elf is rejected by config.sub
 
579
-LIST = alpha-linux-gnu alpha-freebsd6 alpha-netbsd alpha-openbsd \
 
580
+LIST = aarch64-elf aarch64-linux-gnu \
 
581
+  alpha-linux-gnu alpha-freebsd6 alpha-netbsd alpha-openbsd \
 
582
   alpha64-dec-vms alpha-dec-vms am33_2.0-linux \
 
583
   arm-wrs-vxworks arm-netbsdelf \
 
584
   arm-linux-androideabi arm-uclinux_eabi arm-eabi \
 
585
--- a/src/contrib/ChangeLog.linaro
 
586
+++ b/src/contrib/ChangeLog.linaro
 
587
@@ -0,0 +1,34 @@
 
588
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
589
+
 
590
+        GCC Linaro 4.8-2013.09 released.
 
591
+
 
592
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
593
+
 
594
+       GCC Linaro 4.8-2013.08 released.
 
595
+
 
596
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
597
+
 
598
+        GCC Linaro 4.8-2013.07-1 released.
 
599
+
 
600
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
601
+
 
602
+       GCC Linaro 4.8-2013.07 released.
 
603
+
 
604
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
605
+
 
606
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
607
+
 
608
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
609
+
 
610
+       GCC Linaro 4.8-2013.05 released.
 
611
+
 
612
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
613
+
 
614
+       Backport from trunk r198443.
 
615
+       2013-04-22  Sofiane Naci  <sofiane.naci@arm.com>
 
616
+
 
617
+       * config-list.mk (LIST): Add aarch64-elf and aarch64-linux-gnu.
 
618
+
 
619
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
620
+
 
621
+       * GCC Linaro 4.8-2013.04 released.
 
622
--- a/src/contrib/reghunt/ChangeLog.linaro
 
623
+++ b/src/contrib/reghunt/ChangeLog.linaro
 
624
@@ -0,0 +1,27 @@
 
625
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
626
+
 
627
+        GCC Linaro 4.8-2013.09 released.
 
628
+
 
629
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
630
+
 
631
+       GCC Linaro 4.8-2013.08 released.
 
632
+
 
633
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
634
+
 
635
+        GCC Linaro 4.8-2013.07-1 released.
 
636
+
 
637
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
638
+
 
639
+       GCC Linaro 4.8-2013.07 released.
 
640
+
 
641
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
642
+
 
643
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
644
+
 
645
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
646
+
 
647
+       GCC Linaro 4.8-2013.05 released.
 
648
+
 
649
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
650
+
 
651
+       * GCC Linaro 4.8-2013.04 released.
 
652
--- a/src/libatomic/ChangeLog.linaro
 
653
+++ b/src/libatomic/ChangeLog.linaro
 
654
@@ -0,0 +1,27 @@
 
655
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
656
+
 
657
+        GCC Linaro 4.8-2013.09 released.
 
658
+
 
659
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
660
+
 
661
+       GCC Linaro 4.8-2013.08 released.
 
662
+
 
663
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
664
+
 
665
+        GCC Linaro 4.8-2013.07-1 released.
 
666
+
 
667
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
668
+
 
669
+       GCC Linaro 4.8-2013.07 released.
 
670
+
 
671
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
672
+
 
673
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
674
+
 
675
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
676
+
 
677
+       GCC Linaro 4.8-2013.05 released.
 
678
+
 
679
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
680
+
 
681
+       * GCC Linaro 4.8-2013.04 released.
 
682
--- a/src/config/ChangeLog.linaro
 
683
+++ b/src/config/ChangeLog.linaro
 
684
@@ -0,0 +1,27 @@
 
685
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
686
+
 
687
+        GCC Linaro 4.8-2013.09 released.
 
688
+
 
689
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
690
+
 
691
+       GCC Linaro 4.8-2013.08 released.
 
692
+
 
693
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
694
+
 
695
+        GCC Linaro 4.8-2013.07-1 released.
 
696
+
 
697
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
698
+
 
699
+       GCC Linaro 4.8-2013.07 released.
 
700
+
 
701
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
702
+
 
703
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
704
+
 
705
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
706
+
 
707
+       GCC Linaro 4.8-2013.05 released.
 
708
+
 
709
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
710
+
 
711
+       * GCC Linaro 4.8-2013.04 released.
 
712
--- a/src/libbacktrace/ChangeLog.linaro
 
713
+++ b/src/libbacktrace/ChangeLog.linaro
 
714
@@ -0,0 +1,27 @@
 
715
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
716
+
 
717
+        GCC Linaro 4.8-2013.09 released.
 
718
+
 
719
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
720
+
 
721
+       GCC Linaro 4.8-2013.08 released.
 
722
+
 
723
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
724
+
 
725
+        GCC Linaro 4.8-2013.07-1 released.
 
726
+
 
727
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
728
+
 
729
+       GCC Linaro 4.8-2013.07 released.
 
730
+
 
731
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
732
+
 
733
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
734
+
 
735
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
736
+
 
737
+       GCC Linaro 4.8-2013.05 released.
 
738
+
 
739
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
740
+
 
741
+       * GCC Linaro 4.8-2013.04 released.
 
742
--- a/src/libjava/libltdl/ChangeLog.linaro
 
743
+++ b/src/libjava/libltdl/ChangeLog.linaro
 
744
@@ -0,0 +1,27 @@
 
745
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
746
+
 
747
+        GCC Linaro 4.8-2013.09 released.
 
748
+
 
749
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
750
+
 
751
+       GCC Linaro 4.8-2013.08 released.
 
752
+
 
753
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
754
+
 
755
+        GCC Linaro 4.8-2013.07-1 released.
 
756
+
 
757
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
758
+
 
759
+       GCC Linaro 4.8-2013.07 released.
 
760
+
 
761
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
762
+
 
763
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
764
+
 
765
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
766
+
 
767
+       GCC Linaro 4.8-2013.05 released.
 
768
+
 
769
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
770
+
 
771
+       * GCC Linaro 4.8-2013.04 released.
 
772
--- a/src/libjava/ChangeLog.linaro
 
773
+++ b/src/libjava/ChangeLog.linaro
 
774
@@ -0,0 +1,27 @@
 
775
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
776
+
 
777
+        GCC Linaro 4.8-2013.09 released.
 
778
+
 
779
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
780
+
 
781
+       GCC Linaro 4.8-2013.08 released.
 
782
+
 
783
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
784
+
 
785
+        GCC Linaro 4.8-2013.07-1 released.
 
786
+
 
787
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
788
+
 
789
+       GCC Linaro 4.8-2013.07 released.
 
790
+
 
791
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
792
+
 
793
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
794
+
 
795
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
796
+
 
797
+       GCC Linaro 4.8-2013.05 released.
 
798
+
 
799
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
800
+
 
801
+       * GCC Linaro 4.8-2013.04 released.
 
802
--- a/src/libjava/classpath/ChangeLog.linaro
 
803
+++ b/src/libjava/classpath/ChangeLog.linaro
 
804
@@ -0,0 +1,27 @@
 
805
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
806
+
 
807
+        GCC Linaro 4.8-2013.09 released.
 
808
+
 
809
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
810
+
 
811
+       GCC Linaro 4.8-2013.08 released.
 
812
+
 
813
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
814
+
 
815
+        GCC Linaro 4.8-2013.07-1 released.
 
816
+
 
817
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
818
+
 
819
+       GCC Linaro 4.8-2013.07 released.
 
820
+
 
821
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
822
+
 
823
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
824
+
 
825
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
826
+
 
827
+       GCC Linaro 4.8-2013.05 released.
 
828
+
 
829
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
830
+
 
831
+       * GCC Linaro 4.8-2013.04 released.
 
832
--- a/src/gnattools/ChangeLog.linaro
 
833
+++ b/src/gnattools/ChangeLog.linaro
 
834
@@ -0,0 +1,27 @@
 
835
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
836
+
 
837
+        GCC Linaro 4.8-2013.09 released.
 
838
+
 
839
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
840
+
 
841
+       GCC Linaro 4.8-2013.08 released.
 
842
+
 
843
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
844
+
 
845
+        GCC Linaro 4.8-2013.07-1 released.
 
846
+
 
847
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
848
+
 
849
+       GCC Linaro 4.8-2013.07 released.
 
850
+
 
851
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
852
+
 
853
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
854
+
 
855
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
856
+
 
857
+       GCC Linaro 4.8-2013.05 released.
 
858
+
 
859
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
860
+
 
861
+       * GCC Linaro 4.8-2013.04 released.
 
862
--- a/src/maintainer-scripts/ChangeLog.linaro
 
863
+++ b/src/maintainer-scripts/ChangeLog.linaro
 
864
@@ -0,0 +1,27 @@
 
865
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
866
+
 
867
+        GCC Linaro 4.8-2013.09 released.
 
868
+
 
869
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
870
+
 
871
+       GCC Linaro 4.8-2013.08 released.
 
872
+
 
873
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
874
+
 
875
+        GCC Linaro 4.8-2013.07-1 released.
 
876
+
 
877
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
878
+
 
879
+       GCC Linaro 4.8-2013.07 released.
 
880
+
 
881
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
882
+
 
883
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
884
+
 
885
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
886
+
 
887
+       GCC Linaro 4.8-2013.05 released.
 
888
+
 
889
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
890
+
 
891
+       * GCC Linaro 4.8-2013.04 released.
 
892
--- a/src/libgcc/ChangeLog.linaro
 
893
+++ b/src/libgcc/ChangeLog.linaro
 
894
@@ -0,0 +1,37 @@
 
895
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
896
+
 
897
+        GCC Linaro 4.8-2013.09 released.
 
898
+
 
899
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
900
+
 
901
+       GCC Linaro 4.8-2013.08 released.
 
902
+
 
903
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
904
+
 
905
+        GCC Linaro 4.8-2013.07-1 released.
 
906
+
 
907
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
908
+
 
909
+       GCC Linaro 4.8-2013.07 released.
 
910
+
 
911
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
912
+
 
913
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
914
+
 
915
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
916
+
 
917
+       GCC Linaro 4.8-2013.05 released.
 
918
+
 
919
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
920
+
 
921
+       Backport from trunk r198090.
 
922
+       2013-04-19  Yufeng Zhang  <yufeng.zhang@arm.com>
 
923
+
 
924
+       * config/aarch64/sfp-machine.h (_FP_W_TYPE): Change to define
 
925
+       as 'unsigned long long' instead of 'unsigned long'.
 
926
+       (_FP_WS_TYPE): Change to define as 'signed long long' instead of
 
927
+       'signed long'.
 
928
+
 
929
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
930
+
 
931
+       * GCC Linaro 4.8-2013.04 released.
 
932
--- a/src/libgcc/config/aarch64/sfp-machine.h
 
933
+++ b/src/libgcc/config/aarch64/sfp-machine.h
 
934
@@ -24,8 +24,8 @@
 
935
 <http://www.gnu.org/licenses/>.  */
 
936
 
 
937
 #define _FP_W_TYPE_SIZE                64
 
938
-#define _FP_W_TYPE             unsigned long
 
939
-#define _FP_WS_TYPE            signed long
 
940
+#define _FP_W_TYPE             unsigned long long
 
941
+#define _FP_WS_TYPE            signed long long
 
942
 #define _FP_I_TYPE             int
 
943
 
 
944
 typedef int TItype __attribute__ ((mode (TI)));
 
945
--- a/src/libgcc/config/libbid/ChangeLog.linaro
 
946
+++ b/src/libgcc/config/libbid/ChangeLog.linaro
 
947
@@ -0,0 +1,27 @@
 
948
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
949
+
 
950
+        GCC Linaro 4.8-2013.09 released.
 
951
+
 
952
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
953
+
 
954
+       GCC Linaro 4.8-2013.08 released.
 
955
+
 
956
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
957
+
 
958
+        GCC Linaro 4.8-2013.07-1 released.
 
959
+
 
960
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
961
+
 
962
+       GCC Linaro 4.8-2013.07 released.
 
963
+
 
964
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
965
+
 
966
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
967
+
 
968
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
969
+
 
970
+       GCC Linaro 4.8-2013.05 released.
 
971
+
 
972
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
973
+
 
974
+       * GCC Linaro 4.8-2013.04 released.
 
975
--- a/src/libdecnumber/ChangeLog.linaro
 
976
+++ b/src/libdecnumber/ChangeLog.linaro
 
977
@@ -0,0 +1,27 @@
 
978
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
979
+
 
980
+        GCC Linaro 4.8-2013.09 released.
 
981
+
 
982
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
983
+
 
984
+       GCC Linaro 4.8-2013.08 released.
 
985
+
 
986
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
987
+
 
988
+        GCC Linaro 4.8-2013.07-1 released.
 
989
+
 
990
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
991
+
 
992
+       GCC Linaro 4.8-2013.07 released.
 
993
+
 
994
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
995
+
 
996
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
997
+
 
998
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
999
+
 
1000
+       GCC Linaro 4.8-2013.05 released.
 
1001
+
 
1002
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1003
+
 
1004
+       * GCC Linaro 4.8-2013.04 released.
 
1005
--- a/src/gcc/LINARO-VERSION
 
1006
+++ b/src/gcc/LINARO-VERSION
 
1007
@@ -0,0 +1 @@
 
1008
+release=4.8-2013.09-1~dev
 
1009
--- a/src/gcc/hooks.c
 
1010
+++ b/src/gcc/hooks.c
 
1011
@@ -147,6 +147,14 @@
 
1012
   return false;
 
1013
 }
 
1014
 
 
1015
+/* Generic hook that takes (gimple_stmt_iterator *) and returns
 
1016
+   false.  */
 
1017
+bool
 
1018
+hook_bool_gsiptr_false (gimple_stmt_iterator *a ATTRIBUTE_UNUSED)
 
1019
+{
 
1020
+  return false;
 
1021
+}
 
1022
+
 
1023
 /* Used for the TARGET_ASM_CAN_OUTPUT_MI_THUNK hook.  */
 
1024
 bool
 
1025
 hook_bool_const_tree_hwi_hwi_const_tree_false (const_tree a ATTRIBUTE_UNUSED,
 
1026
--- a/src/gcc/hooks.h
 
1027
+++ b/src/gcc/hooks.h
 
1028
@@ -42,6 +42,7 @@
 
1029
 extern bool hook_bool_const_tree_false (const_tree);
 
1030
 extern bool hook_bool_tree_true (tree);
 
1031
 extern bool hook_bool_const_tree_true (const_tree);
 
1032
+extern bool hook_bool_gsiptr_false (gimple_stmt_iterator *);
 
1033
 extern bool hook_bool_const_tree_hwi_hwi_const_tree_false (const_tree,
 
1034
                                                           HOST_WIDE_INT,
 
1035
                                                           HOST_WIDE_INT,
 
1036
--- a/src/gcc/c-family/ChangeLog.linaro
 
1037
+++ b/src/gcc/c-family/ChangeLog.linaro
 
1038
@@ -0,0 +1,27 @@
 
1039
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1040
+
 
1041
+        GCC Linaro 4.8-2013.09 released.
 
1042
+
 
1043
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
1044
+
 
1045
+       GCC Linaro 4.8-2013.08 released.
 
1046
+
 
1047
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1048
+
 
1049
+        GCC Linaro 4.8-2013.07-1 released.
 
1050
+
 
1051
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1052
+
 
1053
+       GCC Linaro 4.8-2013.07 released.
 
1054
+
 
1055
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
1056
+
 
1057
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
1058
+
 
1059
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1060
+
 
1061
+       GCC Linaro 4.8-2013.05 released.
 
1062
+
 
1063
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1064
+
 
1065
+       * GCC Linaro 4.8-2013.04 released.
 
1066
--- a/src/gcc/java/ChangeLog.linaro
 
1067
+++ b/src/gcc/java/ChangeLog.linaro
 
1068
@@ -0,0 +1,27 @@
 
1069
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1070
+
 
1071
+        GCC Linaro 4.8-2013.09 released.
 
1072
+
 
1073
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
1074
+
 
1075
+       GCC Linaro 4.8-2013.08 released.
 
1076
+
 
1077
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1078
+
 
1079
+        GCC Linaro 4.8-2013.07-1 released.
 
1080
+
 
1081
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1082
+
 
1083
+       GCC Linaro 4.8-2013.07 released.
 
1084
+
 
1085
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
1086
+
 
1087
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
1088
+
 
1089
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1090
+
 
1091
+       GCC Linaro 4.8-2013.05 released.
 
1092
+
 
1093
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1094
+
 
1095
+       * GCC Linaro 4.8-2013.04 released.
 
1096
--- a/src/gcc/c/ChangeLog.linaro
 
1097
+++ b/src/gcc/c/ChangeLog.linaro
 
1098
@@ -0,0 +1,27 @@
 
1099
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1100
+
 
1101
+        GCC Linaro 4.8-2013.09 released.
 
1102
+
 
1103
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
1104
+
 
1105
+       GCC Linaro 4.8-2013.08 released.
 
1106
+
 
1107
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1108
+
 
1109
+        GCC Linaro 4.8-2013.07-1 released.
 
1110
+
 
1111
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1112
+
 
1113
+       GCC Linaro 4.8-2013.07 released.
 
1114
+
 
1115
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
1116
+
 
1117
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
1118
+
 
1119
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1120
+
 
1121
+       GCC Linaro 4.8-2013.05 released.
 
1122
+
 
1123
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1124
+
 
1125
+       * GCC Linaro 4.8-2013.04 released.
 
1126
--- a/src/gcc/target.def
 
1127
+++ b/src/gcc/target.def
 
1128
@@ -1289,13 +1289,24 @@
 
1129
  "",
 
1130
  tree, (unsigned int /*location_t*/ loc, tree fndecl, void *arglist), NULL)
 
1131
 
 
1132
-/* Fold a target-specific builtin.  */
 
1133
+/* Fold a target-specific builtin to a tree valid for both GIMPLE
 
1134
+   and GENERIC.  */
 
1135
 DEFHOOK
 
1136
 (fold_builtin,
 
1137
  "",
 
1138
  tree, (tree fndecl, int n_args, tree *argp, bool ignore),
 
1139
  hook_tree_tree_int_treep_bool_null)
 
1140
 
 
1141
+/* Fold a target-specific builtin to a valid GIMPLE tree.  */
 
1142
+DEFHOOK
 
1143
+(gimple_fold_builtin,
 
1144
+ "Fold a call to a machine specific built-in function that was set up\n\
 
1145
+by @samp{TARGET_INIT_BUILTINS}.  @var{gsi} points to the gimple\n\
 
1146
+statement holding the function call.  Returns true if any change\n\
 
1147
+was made to the GIMPLE stream.",
 
1148
+ bool, (gimple_stmt_iterator *gsi),
 
1149
+ hook_bool_gsiptr_false)
 
1150
+
 
1151
 /* Target hook is used to compare the target attributes in two functions to
 
1152
    determine which function's features get higher priority.  This is used
 
1153
    during function multi-versioning to figure out the order in which two
 
1154
--- a/src/gcc/rtlanal.c
 
1155
+++ b/src/gcc/rtlanal.c
 
1156
@@ -1199,6 +1199,10 @@
 
1157
   if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
 
1158
     return 0;
 
1159
 
 
1160
+  /* Check the code to be executed for COND_EXEC.  */
 
1161
+  if (GET_CODE (pat) == COND_EXEC)
 
1162
+    pat = COND_EXEC_CODE (pat);
 
1163
+
 
1164
   if (GET_CODE (pat) == SET && set_noop_p (pat))
 
1165
     return 1;
 
1166
 
 
1167
--- a/src/gcc/configure
 
1168
+++ b/src/gcc/configure
 
1169
@@ -1658,7 +1658,8 @@
 
1170
                           use sysroot as the system root during the build
 
1171
   --with-sysroot[=DIR]    search for usr/lib, usr/include, et al, within DIR
 
1172
   --with-specs=SPECS      add SPECS to driver command-line processing
 
1173
-  --with-pkgversion=PKG   Use PKG in the version string in place of "GCC"
 
1174
+  --with-pkgversion=PKG   Use PKG in the version string in place of "Linaro
 
1175
+                          GCC `cat $srcdir/LINARO-VERSION`"
 
1176
   --with-bugurl=URL       Direct users to URL to report a bug
 
1177
   --with-multilib-list    select multilibs (SH and x86-64 only)
 
1178
   --with-gnu-ld           assume the C compiler uses GNU ld default=no
 
1179
@@ -7327,7 +7328,7 @@
 
1180
       *)   PKGVERSION="($withval) " ;;
 
1181
      esac
 
1182
 else
 
1183
-  PKGVERSION="(GCC) "
 
1184
+  PKGVERSION="(Linaro GCC `cat $srcdir/LINARO-VERSION`) "
 
1185
 
 
1186
 fi
 
1187
 
 
1188
@@ -25913,8 +25914,9 @@
 
1189
 # ??? Once 2.11 is released, probably need to add first known working
 
1190
 # version to the per-target configury.
 
1191
 case "$cpu_type" in
 
1192
-  alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze | mips \
 
1193
-  | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 | xtensa)
 
1194
+  aarch64 | alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze \
 
1195
+  | mips | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 \
 
1196
+  | xtensa)
 
1197
     insn="nop"
 
1198
     ;;
 
1199
   ia64 | s390)
 
1200
--- a/src/gcc/gensupport.c
 
1201
+++ b/src/gcc/gensupport.c
 
1202
@@ -1717,6 +1717,21 @@
 
1203
          XVECEXP (insn, 1, 0) = pattern;
 
1204
        }
 
1205
 
 
1206
+       if (XVEC (ce_elem->data, 3) != NULL)
 
1207
+       {
 
1208
+         rtvec attributes = rtvec_alloc (XVECLEN (insn, 4)
 
1209
+                                         + XVECLEN (ce_elem->data, 3));
 
1210
+         int i = 0;
 
1211
+         int j = 0;
 
1212
+         for (i = 0; i < XVECLEN (insn, 4); i++)
 
1213
+           RTVEC_ELT (attributes, i) = XVECEXP (insn, 4, i);
 
1214
+
 
1215
+         for (j = 0; j < XVECLEN (ce_elem->data, 3); j++, i++)
 
1216
+           RTVEC_ELT (attributes, i) = XVECEXP (ce_elem->data, 3, j);
 
1217
+
 
1218
+         XVEC (insn, 4) = attributes;
 
1219
+       }
 
1220
+
 
1221
       XSTR (insn, 2) = alter_test_for_insn (ce_elem, insn_elem);
 
1222
       XTMPL (insn, 3) = alter_output_for_insn (ce_elem, insn_elem,
 
1223
                                              alternatives, max_operand);
 
1224
--- a/src/gcc/fold-const.c
 
1225
+++ b/src/gcc/fold-const.c
 
1226
@@ -2474,9 +2474,13 @@
 
1227
     }
 
1228
 
 
1229
   if (TREE_CODE (arg0) != TREE_CODE (arg1)
 
1230
-      /* This is needed for conversions and for COMPONENT_REF.
 
1231
-        Might as well play it safe and always test this.  */
 
1232
-      || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
 
1233
+      /* NOP_EXPR and CONVERT_EXPR are considered equal.  */
 
1234
+      && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1)))
 
1235
+    return 0;
 
1236
+
 
1237
+  /* This is needed for conversions and for COMPONENT_REF.
 
1238
+     Might as well play it safe and always test this.  */
 
1239
+  if (TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
 
1240
       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
 
1241
       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
 
1242
     return 0;
 
1243
--- a/src/gcc/objc/ChangeLog.linaro
 
1244
+++ b/src/gcc/objc/ChangeLog.linaro
 
1245
@@ -0,0 +1,27 @@
 
1246
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1247
+
 
1248
+        GCC Linaro 4.8-2013.09 released.
 
1249
+
 
1250
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
1251
+
 
1252
+       GCC Linaro 4.8-2013.08 released.
 
1253
+
 
1254
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1255
+
 
1256
+        GCC Linaro 4.8-2013.07-1 released.
 
1257
+
 
1258
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1259
+
 
1260
+       GCC Linaro 4.8-2013.07 released.
 
1261
+
 
1262
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
1263
+
 
1264
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
1265
+
 
1266
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1267
+
 
1268
+       GCC Linaro 4.8-2013.05 released.
 
1269
+
 
1270
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1271
+
 
1272
+       * GCC Linaro 4.8-2013.04 released.
 
1273
--- a/src/gcc/ChangeLog.linaro
 
1274
+++ b/src/gcc/ChangeLog.linaro
 
1275
@@ -0,0 +1,2631 @@
 
1276
+2013-10-09  Christophe Lyon  <christophe.lyon@linaro.org>
 
1277
+
 
1278
+       Backport from trunk r198526,198527,200020,200595.
 
1279
+       2013-05-02  Ian Bolton  <ian.bolton@arm.com>
 
1280
+
 
1281
+       * config/aarch64/aarch64.md (*and_one_cmpl<mode>3_compare0):
 
1282
+       New pattern.
 
1283
+       (*and_one_cmplsi3_compare0_uxtw): Likewise.
 
1284
+       (*and_one_cmpl_<SHIFT:optab><mode>3_compare0): Likewise.
 
1285
+       (*and_one_cmpl_<SHIFT:optab>si3_compare0_uxtw): Likewise.
 
1286
+
 
1287
+       2013-05-02  Ian Bolton  <ian.bolton@arm.com>
 
1288
+
 
1289
+       * config/aarch64/aarch64.md (movsi_aarch64): Only allow to/from
 
1290
+       S reg when fp attribute set.
 
1291
+       (movdi_aarch64): Only allow to/from D reg when fp attribute set.
 
1292
+
 
1293
+       2013-06-12  Sofiane Naci  <sofiane.naci@arm.com>
 
1294
+
 
1295
+       * config/aarch64/aarch64-simd.md (aarch64_combine<mode>): convert to split.
 
1296
+       (aarch64_simd_combine<mode>): New instruction expansion.
 
1297
+       * config/aarch64/aarch64-protos.h (aarch64_split_simd_combine): New
 
1298
+       function prototype.
 
1299
+       * config/aarch64/aarch64.c (aarch64_split_combine): New function.
 
1300
+       * config/aarch64/iterators.md (Vdbl): Add entry for DF.
 
1301
+
 
1302
+       2013-07-02  Ian Bolton  <ian.bolton@arm.com>
 
1303
+
 
1304
+       * config/aarch64/aarch64.md (*extr_insv_reg<mode>): New pattern.
 
1305
+
 
1306
+2013-10-09  Christophe Lyon  <christophe.lyon@linaro.org>
 
1307
+
 
1308
+       Backport from trunk r201879.
 
1309
+       2013-08-20  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
1310
+
 
1311
+       * config/arm/linux-elf.h (MULTILIB_DEFAULTS): Remove definition.
 
1312
+       * config/arm/t-linux-eabi (MULTILIB_OPTIONS): Document association
 
1313
+       with MULTLIB_DEFAULTS.
 
1314
+
 
1315
+2013-10-09  Christophe Lyon  <christophe.lyon@linaro.org>
 
1316
+
 
1317
+       Backport from trunk r201871.
 
1318
+       2013-08-20  Pavel Chupin  <pavel.v.chupin@intel.com>
 
1319
+
 
1320
+       Fix LIB_SPEC for systems without libpthread.
 
1321
+
 
1322
+       * config/gnu-user.h: Introduce GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC.
 
1323
+       * config/arm/linux-eabi.h: Use GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC
 
1324
+       for Android.
 
1325
+       * config/i386/linux-common.h: Likewise.
 
1326
+       * config/mips/linux-common.h: Likewise.
 
1327
+
 
1328
+2013-10-08  Christophe Lyon  <christophe.lyon@linaro.org>
 
1329
+
 
1330
+       Backport from trunk r202702.
 
1331
+       2013-09-18  Richard Earnshaw  <rearnsha@arm.com>
 
1332
+
 
1333
+       * arm.c (arm_get_frame_offsets): Validate architecture supports
 
1334
+       LDRD/STRD before accepting the tuning preference.
 
1335
+       (arm_expand_prologue): Likewise.
 
1336
+       (arm_expand_epilogue): Likewise.
 
1337
+
 
1338
+2013-10-04  Venkataramanan.Kumar  <venkataramanan.kumar@linaro.org>
 
1339
+
 
1340
+       Backport from trunk r203028.
 
1341
+       2013-09-30  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
1342
+
 
1343
+       * config/aarch64/aarch64.h (MCOUNT_NAME): Define.
 
1344
+       (NO_PROFILE_COUNTERS): Likewise.
 
1345
+       (PROFILE_HOOK): Likewise.
 
1346
+       (FUNCTION_PROFILER): Likewise.
 
1347
+       * config/aarch64/aarch64.c (aarch64_function_profiler): Remove.
 
1348
+
 
1349
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1350
+
 
1351
+       Backport from trunk r201923,201927.
 
1352
+       2013-08-22  Julian Brown  <julian@codesourcery.com>
 
1353
+
 
1354
+       * configure.ac: Add aarch64 to list of arches which use "nop" in
 
1355
+       debug_line test.
 
1356
+       * configure: Regenerate.
 
1357
+
 
1358
+       2013-08-22  Paolo Carlini  <paolo.carlini@oracle.com>
 
1359
+
 
1360
+       * configure.ac: Add backslashes missing from the last change.
 
1361
+       * configure: Regenerate.
 
1362
+
 
1363
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1364
+
 
1365
+       Backport from trunk r202023,202108.
 
1366
+       2013-08-27  Tejas Belagod  <tejas.belagod@arm.com>
 
1367
+
 
1368
+       * config/aarch64/arm_neon.h: Replace all inline asm implementations
 
1369
+       of vget_low_* with implementations in terms of other intrinsics.
 
1370
+
 
1371
+       2013-08-30  Tejas Belagod  <tejas.belagod@arm.com>
 
1372
+
 
1373
+       * config/aarch64/arm_neon.h (__AARCH64_UINT64_C, __AARCH64_INT64_C): New
 
1374
+       arm_neon.h's internal macros to specify 64-bit constants. Avoid using
 
1375
+       stdint.h's macros.
 
1376
+
 
1377
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1378
+
 
1379
+       Backport from trunk r201260,202400.
 
1380
+       2013-07-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1381
+            Richard Earnshaw  <richard.earnshaw@arm.com>
 
1382
+
 
1383
+       * combine.c (simplify_comparison): Re-canonicalize operands
 
1384
+       where appropriate.
 
1385
+       * config/arm/arm.md (movcond_addsi): New splitter.
 
1386
+
 
1387
+       2013-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1388
+
 
1389
+       * config/aarch64/aarch64.c (aarch64_select_cc_mode): Return CC_SWP for
 
1390
+       comparison with negated operand.
 
1391
+       * config/aarch64/aarch64.md (compare_neg<mode>): Match canonical
 
1392
+       RTL form.
 
1393
+
 
1394
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1395
+
 
1396
+       Backport from trunk r202164.
 
1397
+       2013-09-02  Bin Cheng  <bin.cheng@arm.com>
 
1398
+
 
1399
+       * tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
 
1400
+       Find auto-increment use both before and after candidate.
 
1401
+
 
1402
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1403
+
 
1404
+       Backport from trunk r202279.
 
1405
+       2013-09-05  Richard Earnshaw  <rearnsha@arm.com>
 
1406
+
 
1407
+       * arm.c (thumb2_emit_strd_push): Rewrite to use pre-decrement on
 
1408
+       initial store.
 
1409
+       * thumb2.md (thumb2_storewb_parisi): New pattern.
 
1410
+
 
1411
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
1412
+
 
1413
+       Backport from trunk r202275.
 
1414
+       2013-09-05  Yufeng Zhang  <yufeng.zhang@arm.com>
 
1415
+
 
1416
+       * config/aarch64/aarch64-option-extensions.def: Add
 
1417
+       AARCH64_OPT_EXTENSION of 'crc'.
 
1418
+       * config/aarch64/aarch64.h (AARCH64_FL_CRC): New define.
 
1419
+       (AARCH64_ISA_CRC): Ditto.
 
1420
+       * doc/invoke.texi (-march and -mcpu feature modifiers): Add
 
1421
+       description of the CRC extension.
 
1422
+
 
1423
+2013-10-01  Christophe Lyon  <christophe.lyon@linaro.org>
 
1424
+
 
1425
+       Backport from trunk r201250.
 
1426
+       2013-07-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1427
+
 
1428
+       * config/arm/arm.md (arm_addsi3, addsi3_carryin_<optab>,
 
1429
+       addsi3_carryin_alt2_<optab>): Correct output template.
 
1430
+
 
1431
+2013-10-01  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
1432
+
 
1433
+       Backport from trunk r203059,203116.
 
1434
+       2013-10-01  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
1435
+
 
1436
+       PR target/58578
 
1437
+       Revert
 
1438
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
1439
+       * config/arm/arm.md (arm_ashldi3_1bit):  define_insn into
 
1440
+       define_insn_and_split.
 
1441
+       (arm_ashrdi3_1bit,arm_lshrdi3_1bit): Likewise.
 
1442
+       (shiftsi3_compare): New pattern.
 
1443
+       (rrx): New pattern.
 
1444
+       * config/arm/unspecs.md (UNSPEC_RRX): New.
 
1445
+
 
1446
+2013-09-11  Christophe Lyon  <christophe.lyon@linaro.org>
 
1447
+
 
1448
+       * LINARO-VERSION: Bump version.
 
1449
+
 
1450
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1451
+
 
1452
+        GCC Linaro 4.8-2013.09 released.
 
1453
+
 
1454
+2013-09-10  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
1455
+
 
1456
+       Backport from trunk r200197, 201411.
 
1457
+       2013-06-19  Richard Earnshaw  <rearnsha@arm.com>
 
1458
+
 
1459
+       arm.md (split for eq(reg, 0)): Add variants for ARMv5 and Thumb2.
 
1460
+       (peepholes for eq(reg, not-0)): Ensure condition register is dead after
 
1461
+       pattern.  Use more efficient sequences on ARMv5 and Thumb2.
 
1462
+
 
1463
+       2013-08-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1464
+
 
1465
+       * config/arm/arm.md (peepholes for eq (reg1) (reg2/imm)):
 
1466
+       Generate canonical plus rtx with negated immediate instead of minus
 
1467
+       where appropriate.
 
1468
+       * config/arm/arm.c (thumb2_reorg): Handle ADCS <Rd>, <Rn> case.
 
1469
+
 
1470
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
1471
+
 
1472
+       Backport from trunk r200593,201024,201025,201122,201124,201126.
 
1473
+       2013-07-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1474
+
 
1475
+       * config/arm/arm.md (arm_andsi3_insn): Add alternatives for 16-bit
 
1476
+       encoding.
 
1477
+       (iorsi3_insn): Likewise.
 
1478
+       (arm_xorsi3): Likewise.
 
1479
+
 
1480
+       2013-07-18  Sofiane Naci  <sofiane.naci@arm.com>
 
1481
+
 
1482
+       * config/arm/arm.md (attribute "type"): Rename "simple_alu_imm" to
 
1483
+       "arlo_imm".  Rename "alu_reg" to "arlo_reg".  Rename "simple_alu_shift" to
 
1484
+       "extend".  Split "alu_shift" into "shift" and "arlo_shift".  Split
 
1485
+       "alu_shift_reg" into "shift_reg" and "arlo_shift_reg".  List types
 
1486
+       in alphabetical order.
 
1487
+       (attribute "core_cycles"): Update for attribute changes.
 
1488
+       (arm_addsi3): Likewise.
 
1489
+       (addsi3_compare0): Likewise.
 
1490
+       (addsi3_compare0_scratch): Likewise.
 
1491
+       (addsi3_compare_op1): Likewise.
 
1492
+       (addsi3_compare_op2): Likewise.
 
1493
+       (compare_addsi2_op0): Likewise.
 
1494
+       (compare_addsi2_op1): Likewise.
 
1495
+       (addsi3_carryin_shift_<optab>): Likewise.
 
1496
+       (subsi3_carryin_shift): Likewise.
 
1497
+       (rsbsi3_carryin_shift): Likewise.
 
1498
+       (arm_subsi3_insn): Likewise.
 
1499
+       (subsi3_compare0): Likewise.
 
1500
+       (subsi3_compare): Likewise.
 
1501
+       (arm_andsi3_insn): Likewise.
 
1502
+       (thumb1_andsi3_insn): Likewise.
 
1503
+       (andsi3_compare0): Likewise.
 
1504
+       (andsi3_compare0_scratch): Likewise.
 
1505
+       (zeroextractsi_compare0_scratch
 
1506
+       (andsi_not_shiftsi_si): Likewise.
 
1507
+       (iorsi3_insn): Likewise.
 
1508
+       (iorsi3_compare0): Likewise.
 
1509
+       (iorsi3_compare0_scratch): Likewise.
 
1510
+       (arm_xorsi3): Likewise.
 
1511
+       (thumb1_xorsi3_insn): Likewise.
 
1512
+       (xorsi3_compare0): Likewise.
 
1513
+       (xorsi3_compare0_scratch): Likewise.
 
1514
+       (satsi_<SAT:code>_shift): Likewise.
 
1515
+       (rrx): Likewise.
 
1516
+       (arm_shiftsi3): Likewise.
 
1517
+       (shiftsi3_compare0): Likewise.
 
1518
+       (not_shiftsi): Likewise.
 
1519
+       (not_shiftsi_compare0): Likewise.
 
1520
+       (not_shiftsi_compare0_scratch): Likewise.
 
1521
+       (arm_one_cmplsi2): Likewise.
 
1522
+       (thumb_one_complsi2): Likewise.
 
1523
+       (notsi_compare0): Likewise.
 
1524
+       (notsi_compare0_scratch): Likewise.
 
1525
+       (thumb1_zero_extendhisi2): Likewise.
 
1526
+       (arm_zero_extendhisi2): Likewise.
 
1527
+       (arm_zero_extendhisi2_v6): Likewise.
 
1528
+       (arm_zero_extendhisi2addsi): Likewise.
 
1529
+       (thumb1_zero_extendqisi2): Likewise.
 
1530
+       (thumb1_zero_extendqisi2_v6): Likewise.
 
1531
+       (arm_zero_extendqisi2): Likewise.
 
1532
+       (arm_zero_extendqisi2_v6): Likewise.
 
1533
+       (arm_zero_extendqisi2addsi): Likewise.
 
1534
+       (thumb1_extendhisi2): Likewise.
 
1535
+       (arm_extendhisi2): Likewise.
 
1536
+       (arm_extendhisi2_v6): Likewise.
 
1537
+       (arm_extendqisi): Likewise.
 
1538
+       (arm_extendqisi_v6): Likewise.
 
1539
+       (arm_extendqisi2addsi): Likewise.
 
1540
+       (thumb1_extendqisi2): Likewise.
 
1541
+       (thumb1_movdi_insn): Likewise.
 
1542
+       (arm_movsi_insn): Likewise.
 
1543
+       (movsi_compare0): Likewise.
 
1544
+       (movhi_insn_arch4): Likewise.
 
1545
+       (movhi_bytes): Likewise.
 
1546
+       (arm_movqi_insn): Likewise.
 
1547
+       (thumb1_movqi_insn): Likewise.
 
1548
+       (arm32_movhf): Likewise.
 
1549
+       (thumb1_movhf): Likewise.
 
1550
+       (arm_movsf_soft_insn): Likewise.
 
1551
+       (thumb1_movsf_insn): Likewise.
 
1552
+       (movdf_soft_insn): Likewise.
 
1553
+       (thumb_movdf_insn): Likewise.
 
1554
+       (arm_cmpsi_insn): Likewise.
 
1555
+       (cmpsi_shiftsi): Likewise.
 
1556
+       (cmpsi_shiftsi_swp): Likewise.
 
1557
+       (arm_cmpsi_negshiftsi_si): Likewise.
 
1558
+       (movsicc_insn): Likewise.
 
1559
+       (movsfcc_soft_insn): Likewise.
 
1560
+       (arith_shiftsi): Likewise.
 
1561
+       (arith_shiftsi_compare0
 
1562
+       (arith_shiftsi_compare0_scratch
 
1563
+       (sub_shiftsi): Likewise.
 
1564
+       (sub_shiftsi_compare0
 
1565
+       (sub_shiftsi_compare0_scratch
 
1566
+       (and_scc): Likewise.
 
1567
+       (cond_move): Likewise.
 
1568
+       (if_plus_move): Likewise.
 
1569
+       (if_move_plus): Likewise.
 
1570
+       (if_move_not): Likewise.
 
1571
+       (if_not_move): Likewise.
 
1572
+       (if_shift_move): Likewise.
 
1573
+       (if_move_shift): Likewise.
 
1574
+       (if_shift_shift): Likewise.
 
1575
+       (if_not_arith): Likewise.
 
1576
+       (if_arith_not): Likewise.
 
1577
+       (cond_move_not): Likewise.
 
1578
+       (thumb1_ashlsi3): Set type attribute.
 
1579
+       (thumb1_ashrsi3): Likewise.
 
1580
+       (thumb1_lshrsi3): Likewise.
 
1581
+       (thumb1_rotrsi3): Likewise.
 
1582
+       (shiftsi3_compare0_scratch): Likewise.
 
1583
+       * config/arm/neon.md (neon_mov<mode>): Update for attribute changes.
 
1584
+       (neon_mov<mode>): Likewise.
 
1585
+       * config/arm/thumb2.md (thumb_andsi_not_shiftsi_si): Update for attribute
 
1586
+       changes.
 
1587
+       (thumb2_movsi_insn): Likewise.
 
1588
+       (thumb2_cmpsi_neg_shiftsi): Likewise.
 
1589
+       (thumb2_extendqisi_v6): Likewise.
 
1590
+       (thumb2_zero_extendhisi2_v6): Likewise.
 
1591
+       (thumb2_zero_extendqisi2_v6): Likewise.
 
1592
+       (thumb2_shiftsi3_short): Likewise.
 
1593
+       (thumb2_addsi3_compare0_scratch): Likewise.
 
1594
+       (orsi_not_shiftsi_si): Likewise.
 
1595
+       * config/arm/vfp.md (arm_movsi_vfp): Update for attribute changes.
 
1596
+       * config/arm/arm-fixed.md (arm_ssatsihi_shift): Update for attribute
 
1597
+       changes.
 
1598
+       * config/arm/arm1020e.md (1020alu_op): Update for attribute changes.
 
1599
+       (1020alu_shift_op): Likewise.
 
1600
+       (1020alu_shift_reg_op): Likewise.
 
1601
+       * config/arm/arm1026ejs.md (alu_op): Update for attribute changes.
 
1602
+       (alu_shift_op): Likewise.
 
1603
+       (alu_shift_reg_op): Likewise.
 
1604
+       * config/arm/arm1136jfs.md (11_alu_op): Update for attribute changes.
 
1605
+       (11_alu_shift_op): Likewise.
 
1606
+       (11_alu_shift_reg_op): Likewise.
 
1607
+       * config/arm/arm926ejs.md (9_alu_op): Update for attribute changes.
 
1608
+       (9_alu_shift_reg_op): Likewise.
 
1609
+       * config/arm/cortex-a15.md (cortex_a15_alu): Update for attribute changes.
 
1610
+       (cortex_a15_alu_shift): Likewise.
 
1611
+       (cortex_a15_alu_shift_reg): Likewise.
 
1612
+       * config/arm/cortex-a5.md (cortex_a5_alu): Update for attribute changes.
 
1613
+       (cortex_a5_alu_shift): Likewise.
 
1614
+       * config/arm/cortex-a53.md (cortex_a53_alu) : Update for attribute
 
1615
+       changes.
 
1616
+       (cortex_a53_alu_shift): Likewise.
 
1617
+       * config/arm/cortex-a7.md (cortex_a7_alu_imm): Update for attribute
 
1618
+       changes.
 
1619
+       (cortex_a7_alu_reg): Likewise.
 
1620
+       (cortex_a7_alu_shift): Likewise.
 
1621
+       * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute changes.
 
1622
+       (cortex_a8_alu_shift): Likewise.
 
1623
+       (cortex_a8_alu_shift_reg): Likewise.
 
1624
+       (cortex_a8_mov): Likewise.
 
1625
+       * config/arm/cortex-a9.md (cortex_a9_dp): Update for attribute changes.
 
1626
+       (cortex_a9_dp_shift): Likewise.
 
1627
+       * config/arm/cortex-m4.md (cortex_m4_alu): Update for attribute changes.
 
1628
+       * config/arm/cortex-r4.md (cortex_r4_alu): Update for attribute changes.
 
1629
+       (cortex_r4_mov): Likewise.
 
1630
+       (cortex_r4_alu_shift): Likewise.
 
1631
+       (cortex_r4_alu_shift_reg): Likewise.
 
1632
+       * config/arm/fa526.md (526_alu_op): Update for attribute changes.
 
1633
+       (526_alu_shift_op): Likewise.
 
1634
+       * config/arm/fa606te.md (606te_alu_op): Update for attribute changes.
 
1635
+       * config/arm/fa626te.md (626te_alu_op): Update for attribute changes.
 
1636
+       (626te_alu_shift_op): Likewise.
 
1637
+       * config/arm/fa726te.md (726te_shift_op): Update for attribute changes.
 
1638
+       (726te_alu_op): Likewise.
 
1639
+       (726te_alu_shift_op): Likewise.
 
1640
+       (726te_alu_shift_reg_op): Likewise.
 
1641
+       * config/arm/fmp626.md (mp626_alu_op): Update for attribute changes.
 
1642
+       (mp626_alu_shift_op): Likewise.
 
1643
+       * config/arm/marvell-pj4.md (pj4_alu_e1): Update for attribute changes.
 
1644
+       (pj4_alu_e1_conds): Likewise.
 
1645
+       (pj4_alu): Likewise.
 
1646
+       (pj4_alu_conds): Likewise.
 
1647
+       (pj4_shift): Likewise.
 
1648
+       (pj4_shift_conds): Likewise.
 
1649
+       (pj4_alu_shift): Likewise.
 
1650
+       (pj4_alu_shift_conds): Likewise.
 
1651
+       * config/arm/arm.c (xscale_sched_adjust_cost): Update for attribute changes.
 
1652
+       (cortexa7_older_only): Likewise.
 
1653
+       (cortexa7_younger): Likewise.
 
1654
+
 
1655
+       2013-07-18  Sofiane Naci  <sofiane.naci@arm.com>
 
1656
+
 
1657
+       * config/arm/arm.md (attribute "insn"): Delete values "mrs", "msr",
 
1658
+       "xtab" and "sat".  Move value "clz" from here to ...
 
1659
+       (attriubte "type"): ... here.
 
1660
+       (satsi_<SAT:code>): Delete "insn" attribute.
 
1661
+       (satsi_<SAT:code>_shift): Likewise.
 
1662
+       (arm_zero_extendqisi2addsi): Likewise.
 
1663
+       (arm_extendqisi2addsi): Likewise.
 
1664
+       (clzsi2): Update for attribute changes.
 
1665
+       (rbitsi2): Likewise.
 
1666
+       * config/arm/arm-fixed.md (arm_ssatsihi_shift): Delete "insn" attribute.
 
1667
+       (arm_usatsihi): Likewise.
 
1668
+       * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute change.
 
1669
+
 
1670
+       2013-07-22  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1671
+
 
1672
+       * config/arm/predicates.md (shiftable_operator_strict_it):
 
1673
+       New predicate.
 
1674
+       * config/arm/thumb2.md (thumb_andsi_not_shiftsi_si):
 
1675
+       Disable cond_exec version for arm_restrict_it.
 
1676
+       (thumb2_smaxsi3): Convert to generate cond_exec.
 
1677
+       (thumb2_sminsi3): Likewise.
 
1678
+       (thumb32_umaxsi3): Likewise.
 
1679
+       (thumb2_uminsi3): Likewise.
 
1680
+       (thumb2_abssi2): Adjust constraints for arm_restrict_it.
 
1681
+       (thumb2_neg_abssi2): Likewise.
 
1682
+       (thumb2_mov_scc): Add alternative for 16-bit encoding.
 
1683
+       (thumb2_movsicc_insn): Adjust alternatives.
 
1684
+       (thumb2_mov_negscc): Disable for arm_restrict_it.
 
1685
+       (thumb2_mov_negscc_strict_it): New pattern.
 
1686
+       (thumb2_mov_notscc_strict_it): New pattern.
 
1687
+       (thumb2_mov_notscc): Disable for arm_restrict_it.
 
1688
+       (thumb2_ior_scc): Likewise.
 
1689
+       (thumb2_ior_scc_strict_it): New pattern.
 
1690
+       (thumb2_cond_move): Adjust for arm_restrict_it.
 
1691
+       (thumb2_cond_arith): Disable for arm_restrict_it.
 
1692
+       (thumb2_cond_arith_strict_it): New pattern.
 
1693
+       (thumb2_cond_sub): Adjust for arm_restrict_it.
 
1694
+       (thumb2_movcond): Likewise.
 
1695
+       (thumb2_extendqisi_v6): Disable cond_exec variant for arm_restrict_it.
 
1696
+       (thumb2_zero_extendhisi2_v6): Likewise.
 
1697
+       (thumb2_zero_extendqisi2_v6): Likewise.
 
1698
+       (orsi_notsi_si): Likewise.
 
1699
+       (orsi_not_shiftsi_si): Likewise.
 
1700
+
 
1701
+       2013-07-22  Sofiane Naci  <sofiane.naci@arm.com>
 
1702
+
 
1703
+       * config/arm/arm.md (attribute "insn"): Delete.
 
1704
+       (attribute "type"): Add "mov_imm", "mov_reg", "mov_shift",
 
1705
+       "mov_shift_reg", "mvn_imm", "mvn_reg", "mvn_shift" and "mvn_shift_reg".
 
1706
+       (not_shiftsi): Update for attribute change.
 
1707
+       (not_shiftsi_compare0): Likewise.
 
1708
+       (not_shiftsi_compare0_scratch): Likewise.
 
1709
+       (arm_one_cmplsi2): Likewise.
 
1710
+       (thumb1_one_cmplsi2): Likewise.
 
1711
+       (notsi_compare0): Likewise.
 
1712
+       (notsi_compare0_scratch): Likewise.
 
1713
+       (thumb1_movdi_insn): Likewise.
 
1714
+       (arm_movsi_insn): Likewise.
 
1715
+       (movhi_insn_arch4): Likewise.
 
1716
+       (movhi_bytes): Likewise.
 
1717
+       (arm_movqi_insn): Likewise.
 
1718
+       (thumb1_movqi_insn): Likewise.
 
1719
+       (arm32_movhf): Likewise.
 
1720
+       (thumb1_movhf): Likewise.
 
1721
+       (arm_movsf_soft_insn): Likewise.
 
1722
+       (thumb1_movsf_insn): Likewise.
 
1723
+       (thumb_movdf_insn): Likewise.
 
1724
+       (movsicc_insn): Likewise.
 
1725
+       (movsfcc_soft_insn): Likewise.
 
1726
+       (and_scc): Likewise.
 
1727
+       (cond_move): Likewise.
 
1728
+       (if_move_not): Likewise.
 
1729
+       (if_not_move): Likewise.
 
1730
+       (if_shift_move): Likewise.
 
1731
+       (if_move_shift): Likewise.
 
1732
+       (if_shift_shift): Likewise.
 
1733
+       (if_not_arith): Likewise.
 
1734
+       (if_arith_not): Likewise.
 
1735
+       (cond_move_not): Likewise.
 
1736
+       * config/arm/neon.md (neon_mov<mode>): Update for attribute change.
 
1737
+       (neon_mov<mode>): Likewise.
 
1738
+       * config/arm/vfp.md (arm_movsi_vfp): Update for attribute change.
 
1739
+       (thumb2_movsi_vfp): Likewise.
 
1740
+       (movsf_vfp): Likewise.
 
1741
+       (thumb2_movsf_vfp): Likewise.
 
1742
+       * config/arm/arm.c (xscale_sched_adjust_cost): Update for attribute change.
 
1743
+       (cortexa7_older_only): Likewise.
 
1744
+       (cortexa7_younger): Likewise.
 
1745
+       * config/arm/arm1020e.md (1020alu_op): Update for attribute change.
 
1746
+       (1020alu_shift_op): Likewise.
 
1747
+       (1020alu_shift_reg_op): Likewise.
 
1748
+       * config/arm/arm1026ejs.md (alu_op): Update for attribute change.
 
1749
+       (alu_shift_op): Likewise.
 
1750
+       (alu_shift_reg_op): Likewise.
 
1751
+       * config/arm/arm1136jfs.md (11_alu_op): Update for attribute change.
 
1752
+       (11_alu_shift_op): Likewise.
 
1753
+       (11_alu_shift_reg_op): Likewise.
 
1754
+       * config/arm/arm926ejs.md (9_alu_op): Update for attribute change.
 
1755
+       (9_alu_shift_reg_op): Likewise.
 
1756
+       * config/arm/cortex-a15.md (cortex_a15_alu): Update for attribute change.
 
1757
+       (cortex_a15_alu_shift): Likewise.
 
1758
+       (cortex_a15_alu_shift_reg): Likewise.
 
1759
+       * config/arm/cortex-a5.md (cortex_a5_alu): Update for attribute change.
 
1760
+       (cortex_a5_alu_shift): Likewise.
 
1761
+       * config/arm/cortex-a53.md (cortex_a53_alu): Update for attribute change.
 
1762
+       (cortex_a53_alu_shift): Likewise.
 
1763
+       * config/arm/cortex-a7.md (cortex_a7_alu_imm): Update for attribute change.
 
1764
+       (cortex_a7_alu_reg): Likewise.
 
1765
+       (cortex_a7_alu_shift): Likewise.
 
1766
+       * config/arm/cortex-a8.md (cortex_a8_alu): Update for attribute change.
 
1767
+       (cortex_a8_alu_shift): Likewise.
 
1768
+       (cortex_a8_alu_shift_reg): Likewise.
 
1769
+       (cortex_a8_mov): Likewise.
 
1770
+       * config/arm/cortex-a9.md (cortex_a9_dp): Update for attribute change.
 
1771
+       (cortex_a9_dp_shift): Likewise.
 
1772
+       * config/arm/cortex-m4.md (cortex_m4_alu): Update for attribute change.
 
1773
+       * config/arm/cortex-r4.md (cortex_r4_alu): Update for attribute change.
 
1774
+       (cortex_r4_mov): Likewise.
 
1775
+       (cortex_r4_alu_shift): Likewise.
 
1776
+       (cortex_r4_alu_shift_reg): Likewise.
 
1777
+       * config/arm/fa526.md (526_alu_op): Update for attribute change.
 
1778
+       (526_alu_shift_op): Likewise.
 
1779
+       * config/arm/fa606te.md (606te_alu_op): Update for attribute change.
 
1780
+       * config/arm/fa626te.md (626te_alu_op): Update for attribute change.
 
1781
+       (626te_alu_shift_op): Likewise.
 
1782
+       * config/arm/fa726te.md (726te_shift_op): Update for attribute change.
 
1783
+       (726te_alu_op): Likewise.
 
1784
+       (726te_alu_shift_op): Likewise.
 
1785
+       (726te_alu_shift_reg_op): Likewise.
 
1786
+       * config/arm/fmp626.md (mp626_alu_op): Update for attribute change.
 
1787
+       (mp626_alu_shift_op): Likewise.
 
1788
+       * config/arm/marvell-pj4.md (pj4_alu_e1): Update for attribute change.
 
1789
+       (pj4_alu_e1_conds): Likewise.
 
1790
+       (pj4_alu): Likewise.
 
1791
+       (pj4_alu_conds): Likewise.
 
1792
+       (pj4_shift): Likewise.
 
1793
+       (pj4_shift_conds): Likewise.
 
1794
+       (pj4_alu_shift): Likewise.
 
1795
+       (pj4_alu_shift_conds): Likewise.
 
1796
+
 
1797
+       2013-07-22  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1798
+
 
1799
+       * config/arm/constraints.md (Pd): Allow TARGET_THUMB
 
1800
+       instead of TARGET_THUMB1.
 
1801
+       (Pz): New constraint.
 
1802
+       * config/arm/arm.md (arm_addsi3): Add alternatives for 16-bit
 
1803
+       encodings.
 
1804
+       (compare_negsi_si): Likewise.
 
1805
+       (compare_addsi2_op0): Likewise.
 
1806
+       (compare_addsi2_op1): Likewise.
 
1807
+       (addsi3_carryin_<optab>): Likewise.
 
1808
+       (addsi3_carryin_alt2_<optab>): Likewise.
 
1809
+       (addsi3_carryin_shift_<optab>): Disable cond_exec variant
 
1810
+       for arm_restrict_it.
 
1811
+       (subsi3_carryin): Likewise.
 
1812
+       (arm_subsi3_insn): Add alternatives for 16-bit encoding.
 
1813
+       (minmax_arithsi): Disable for arm_restrict_it.
 
1814
+       (minmax_arithsi_non_canon): Adjust for arm_restrict_it.
 
1815
+       (satsi_<SAT:code>): Disable cond_exec variant for arm_restrict_it.
 
1816
+       (satsi_<SAT:code>_shift): Likewise.
 
1817
+       (arm_shiftsi3): Add alternative for 16-bit encoding.
 
1818
+       (arm32_movhf): Disable for arm_restrict_it.
 
1819
+       (arm_cmpdi_unsigned): Add alternatives for 16-bit encoding.
 
1820
+       (arm_movtas_ze): Disable cond_exec variant for arm_restrict_it.
 
1821
+
 
1822
+2013-09-09  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
1823
+
 
1824
+       Backport from trunk r201412.
 
1825
+       2013-08-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1826
+
 
1827
+       * config/arm/arm.md (minmax_arithsi_non_canon): Emit canonical RTL form
 
1828
+       when subtracting a constant.
 
1829
+
 
1830
+2013-09-05  Yvan Roux  <yvan.roux@linaro.org>
 
1831
+
 
1832
+       Backport from trunk r201249.
 
1833
+       2013-07-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1834
+
 
1835
+       * config/arm/arm-fixed.md (ssmulsa3, usmulusa3):
 
1836
+       Adjust for arm_restrict_it.
 
1837
+       Remove trailing whitespace.
 
1838
+
 
1839
+2013-09-05  Yvan Roux  <yvan.roux@linaro.org>
 
1840
+
 
1841
+       Backport from trunk r201342.
 
1842
+       2013-07-30  Richard Earnshaw  <rearnsha@arm.com>
 
1843
+
 
1844
+       * config.gcc (arm): Require 64-bit host-wide-int for all ARM target
 
1845
+       configs.
 
1846
+
 
1847
+2013-09-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1848
+
 
1849
+       Backport from trunk r199527,199792,199814.
 
1850
+       2013-05-31  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1851
+
 
1852
+       PR target/56315
 
1853
+       * config/arm/arm.c (const_ok_for_dimode_op): Handle IOR.
 
1854
+       * config/arm/arm.md (*iordi3_insn): Change to insn_and_split.
 
1855
+       * config/arm/neon.md (iordi3_neon): Remove.
 
1856
+       (neon_vorr<mode>): Generate iordi3 instead of iordi3_neon.
 
1857
+       * config/arm/predicates.md (imm_for_neon_logic_operand):
 
1858
+       Move to earlier in the file.
 
1859
+       (neon_logic_op2): Likewise.
 
1860
+       (arm_iordi_operand_neon): New predicate.
 
1861
+
 
1862
+       2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1863
+
 
1864
+       * config/arm/constraints.md (Df): New constraint.
 
1865
+       * config/arm/arm.md (iordi3_insn): Use Df constraint instead of De.
 
1866
+       Correct length attribute for last two alternatives.
 
1867
+
 
1868
+       2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
1869
+
 
1870
+       PR target/56315
 
1871
+       * config/arm/arm.md (*xordi3_insn): Change to insn_and_split.
 
1872
+       (xordi3): Change operand 2 constraint to arm_xordi_operand.
 
1873
+       * config/arm/arm.c (const_ok_for_dimode_op): Handle XOR.
 
1874
+       * config/arm/constraints.md (Dg): New constraint.
 
1875
+       * config/arm/neon.md (xordi3_neon): Remove.
 
1876
+       (neon_veor<mode>): Generate xordi3 instead of xordi3_neon.
 
1877
+       * config/arm/predicates.md (arm_xordi_operand): New predicate.
 
1878
+
 
1879
+2013-09-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1880
+
 
1881
+       Backport from trunk r201599.
 
1882
+       2013-08-08  Richard Earnshaw  <rearnsha@arm.com>
 
1883
+
 
1884
+       PR target/57431
 
1885
+       * arm/neon.md (neon_vld1_dupdi): New expand pattern.
 
1886
+       (neon_vld1_dup<mode> VD iterator): Iterate over VD not VDX.
 
1887
+
 
1888
+2013-09-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
1889
+
 
1890
+       Backport from trunk r201589.
 
1891
+       2013-08-08  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
1892
+
 
1893
+       PR target/58065
 
1894
+       * config/arm/arm.h (MALLOC_ABI_ALIGNMENT): Define.
 
1895
+
 
1896
+2013-09-03  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
1897
+
 
1898
+       Backport from trunk
 
1899
+       r201624, r201666.
 
1900
+       2013-08-09  James Greenhalgh  <james.greenhalgh@arm.com>
 
1901
+
 
1902
+       * config/aarch64/aarch64-simd-builtins.def (get_lane_signed): Remove.
 
1903
+       (get_lane_unsigned): Likewise.
 
1904
+       (dup_lane_scalar): Likewise.
 
1905
+       (get_lane): enable for VALL.
 
1906
+       * config/aarch64/aarch64-simd.md
 
1907
+       (aarch64_dup_lane_scalar<mode>): Remove.
 
1908
+       (aarch64_get_lane_signed<mode>): Likewise.
 
1909
+       (aarch64_get_lane_unsigned<mode>): Likewise.
 
1910
+       (aarch64_get_lane_extend<GPI:mode><VDQQH:mode>): New.
 
1911
+       (aarch64_get_lane_zero_extendsi<mode>): Likewise.
 
1912
+       (aarch64_get_lane<mode>): Enable for all vector modes.
 
1913
+       (aarch64_get_lanedi): Remove misleading constraints.
 
1914
+       * config/aarch64/arm_neon.h
 
1915
+       (__aarch64_vget_lane_any): Define.
 
1916
+       (__aarch64_vget<q>_lane_<fpsu><8,16,32,64>): Likewise.
 
1917
+       (vget<q>_lane_<fpsu><8,16,32,64>): Use __aarch64_vget_lane macros.
 
1918
+       (vdup<bhsd>_lane_<su><8,16,32,64>): Likewise.
 
1919
+        * config/aarch64/iterators.md (VDQQH): New.
 
1920
+       (VDQQHS): Likewise.
 
1921
+       (vwcore): Likewise.
 
1922
+
 
1923
+       2013-08-12  James Greenhalgh  <james.greenhalgh@arm.com>
 
1924
+
 
1925
+       * config/aarch64/arm_none.h
 
1926
+       (vdup<bhsd>_lane_<su><8,16,32,64>): Fix macro call.
 
1927
+
 
1928
+2013-08-26  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
1929
+
 
1930
+       Backport from trunk r201341.
 
1931
+       2013-07-30  Richard Earnshaw  <rearnsha@arm.com>
 
1932
+
 
1933
+       * arm.md (mulhi3): New expand pattern.
 
1934
+
 
1935
+2013-08-16  Christophe Lyon  <christophe.lyon@linaro.org>
 
1936
+
 
1937
+       * LINARO-VERSION: Bump version.
 
1938
+
 
1939
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
1940
+
 
1941
+       GCC Linaro 4.8-2013.08 released.
 
1942
+
 
1943
+2013-08-08  Christophe Lyon  <christophe.lyon@linaro.org>
 
1944
+
 
1945
+       Backport from trunk
 
1946
+       r198489,200167,200199,200510,200513,200515,200576.
 
1947
+       2013-05-01  Greta Yorsh  <Greta.Yorsh@arm.com>
 
1948
+
 
1949
+       * config/arm/thumb2.md (thumb2_smaxsi3,thumb2_sminsi3): Convert
 
1950
+       define_insn to define_insn_and_split.
 
1951
+       (thumb32_umaxsi3,thumb2_uminsi3): Likewise.
 
1952
+       (thumb2_negdi2,thumb2_abssi2,thumb2_neg_abssi2): Likewise.
 
1953
+       (thumb2_mov_scc,thumb2_mov_negscc,thumb2_mov_notscc): Likewise.
 
1954
+       (thumb2_movsicc_insn,thumb2_and_scc,thumb2_ior_scc): Likewise.
 
1955
+       (thumb2_negscc): Likewise.
 
1956
+
 
1957
+       2013-06-18  Sofiane Naci  <sofiane.naci@arm.com>
 
1958
+
 
1959
+       * config/arm/arm.md (attribute "insn"): Move multiplication and division
 
1960
+       attributes to...
 
1961
+       (attribute "type"): ... here.  Remove mult.
 
1962
+       (attribute "mul32"): New attribute.
 
1963
+       (attribute "mul64"): Add umaal.
 
1964
+       (*arm_mulsi3): Update attributes.
 
1965
+       (*arm_mulsi3_v6): Likewise.
 
1966
+       (*thumb_mulsi3): Likewise.
 
1967
+       (*thumb_mulsi3_v6): Likewise.
 
1968
+       (*mulsi3_compare0): Likewise.
 
1969
+       (*mulsi3_compare0_v6): Likewise.
 
1970
+       (*mulsi_compare0_scratch): Likewise.
 
1971
+       (*mulsi_compare0_scratch_v6): Likewise.
 
1972
+       (*mulsi3addsi): Likewise.
 
1973
+       (*mulsi3addsi_v6): Likewise.
 
1974
+       (*mulsi3addsi_compare0): Likewise.
 
1975
+       (*mulsi3addsi_compare0_v6): Likewise.
 
1976
+       (*mulsi3addsi_compare0_scratch): Likewise.
 
1977
+       (*mulsi3addsi_compare0_scratch_v6): Likewise.
 
1978
+       (*mulsi3subsi): Likewise.
 
1979
+       (*mulsidi3adddi): Likewise.
 
1980
+       (*mulsi3addsi_v6): Likewise.
 
1981
+       (*mulsidi3adddi_v6): Likewise.
 
1982
+       (*mulsidi3_nov6): Likewise.
 
1983
+       (*mulsidi3_v6): Likewise.
 
1984
+       (*umulsidi3_nov6): Likewise.
 
1985
+       (*umulsidi3_v6): Likewise.
 
1986
+       (*umulsidi3adddi): Likewise.
 
1987
+       (*umulsidi3adddi_v6): Likewise.
 
1988
+       (*smulsi3_highpart_nov6): Likewise.
 
1989
+       (*smulsi3_highpart_v6): Likewise.
 
1990
+       (*umulsi3_highpart_nov6): Likewise.
 
1991
+       (*umulsi3_highpart_v6): Likewise.
 
1992
+       (mulhisi3): Likewise.
 
1993
+       (*mulhisi3tb): Likewise.
 
1994
+       (*mulhisi3bt): Likewise.
 
1995
+       (*mulhisi3tt): Likewise.
 
1996
+       (maddhisi4): Likewise.
 
1997
+       (*maddhisi4tb): Likewise.
 
1998
+       (*maddhisi4tt): Likewise.
 
1999
+       (maddhidi4): Likewise.
 
2000
+       (*maddhidi4tb): Likewise.
 
2001
+       (*maddhidi4tt): Likewise.
 
2002
+       (divsi3): Likewise.
 
2003
+       (udivsi3): Likewise.
 
2004
+       * config/arm/thumb2.md (thumb2_mulsi_short): Update attributes.
 
2005
+       (thumb2_mulsi_short_compare0): Likewise.
 
2006
+       (thumb2_mulsi_short_compare0_scratch): Likewise.
 
2007
+       * config/arm/arm1020e.md (1020mult1): Update attribute change.
 
2008
+       (1020mult2): Likewise.
 
2009
+       (1020mult3): Likewise.
 
2010
+       (1020mult4): Likewise.
 
2011
+       (1020mult5): Likewise.
 
2012
+       (1020mult6): Likewise.
 
2013
+       * config/arm/cortex-a15.md (cortex_a15_mult32): Update attribute change.
 
2014
+       (cortex_a15_mult64): Likewise.
 
2015
+       (cortex_a15_sdiv): Likewise.
 
2016
+       (cortex_a15_udiv): Likewise.
 
2017
+       * config/arm/arm1026ejs.md (mult1): Update attribute change.
 
2018
+       (mult2): Likewise.
 
2019
+       (mult3): Likewise.
 
2020
+       (mult4): Likewise.
 
2021
+       (mult5): Likewise.
 
2022
+       (mult6): Likewise.
 
2023
+       * config/arm/marvell-pj4.md (pj4_ir_mul): Update attribute change.
 
2024
+       (pj4_ir_div): Likewise.
 
2025
+       * config/arm/arm1136jfs.md (11_mult1): Update attribute change.
 
2026
+       (11_mult2): Likewise.
 
2027
+       (11_mult3): Likewise.
 
2028
+       (11_mult4): Likewise.
 
2029
+       (11_mult5): Likewise.
 
2030
+       (11_mult6): Likewise.
 
2031
+       (11_mult7): Likewise.
 
2032
+       * config/arm/cortex-a8.md (cortex_a8_mul): Update attribute change.
 
2033
+       (cortex_a8_mla): Likewise.
 
2034
+       (cortex_a8_mull): Likewise.
 
2035
+       (cortex_a8_smulwy): Likewise.
 
2036
+       (cortex_a8_smlald): Likewise.
 
2037
+       * config/arm/cortex-m4.md (cortex_m4_alu): Update attribute change.
 
2038
+       * config/arm/cortex-r4.md (cortex_r4_mul_4): Update attribute change.
 
2039
+       (cortex_r4_mul_3): Likewise.
 
2040
+       (cortex_r4_mla_4): Likewise.
 
2041
+       (cortex_r4_mla_3): Likewise.
 
2042
+       (cortex_r4_smlald): Likewise.
 
2043
+       (cortex_r4_mull): Likewise.
 
2044
+       (cortex_r4_sdiv): Likewise.
 
2045
+       (cortex_r4_udiv): Likewise.
 
2046
+       * config/arm/cortex-a7.md (cortex_a7_mul): Update attribute change.
 
2047
+       (cortex_a7_idiv): Likewise.
 
2048
+       * config/arm/arm926ejs.md (9_mult1): Update attribute change.
 
2049
+       (9_mult2): Likewise.
 
2050
+       (9_mult3): Likewise.
 
2051
+       (9_mult4): Likewise.
 
2052
+       (9_mult5): Likewise.
 
2053
+       (9_mult6): Likewise.
 
2054
+       * config/arm/cortex-a53.md (cortex_a53_mul): Update attribute change.
 
2055
+       (cortex_a53_sdiv): Likewise.
 
2056
+       (cortex_a53_udiv): Likewise.
 
2057
+       * config/arm/fa726te.md (726te_mult_op): Update attribute change.
 
2058
+       * config/arm/fmp626.md (mp626_mult1): Update attribute change.
 
2059
+       (mp626_mult2): Likewise.
 
2060
+       (mp626_mult3): Likewise.
 
2061
+       (mp626_mult4): Likewise.
 
2062
+       * config/arm/fa526.md (526_mult1): Update attribute change.
 
2063
+       (526_mult2): Likewise.
 
2064
+       * config/arm/arm-generic.md (mult): Update attribute change.
 
2065
+       (mult_ldsched_strongarm): Likewise.
 
2066
+       (mult_ldsched): Likewise.
 
2067
+       (multi_cycle): Likewise.
 
2068
+       * config/arm/cortex-a5.md (cortex_a5_mul): Update attribute change.
 
2069
+       * config/arm/fa606te.md (606te_mult1): Update attribute change.
 
2070
+       (606te_mult2): Likewise.
 
2071
+       (606te_mult3): Likewise.
 
2072
+       (606te_mult4): Likewise.
 
2073
+       * config/arm/cortex-a9.md (cortex_a9_mult16): Update attribute change.
 
2074
+       (cortex_a9_mac16): Likewise.
 
2075
+       (cortex_a9_multiply): Likewise.
 
2076
+       (cortex_a9_mac): Likewise.
 
2077
+       (cortex_a9_multiply_long): Likewise.
 
2078
+       * config/arm/fa626te.md (626te_mult1): Update attribute change.
 
2079
+       (626te_mult2): Likewise.
 
2080
+       (626te_mult3): Likewise.
 
2081
+       (626te_mult4): Likewise.
 
2082
+
 
2083
+       2013-06-19  Sofiane Naci  <sofiane.naci@arm.com>
 
2084
+
 
2085
+       * config/arm/vfp.md: Move VFP instruction classification documentation
 
2086
+       to ...
 
2087
+       * config/arm/arm.md: ... here.  Update instruction classification
 
2088
+       documentation.
 
2089
+
 
2090
+       2013-06-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2091
+
 
2092
+       * config/arm/predicates.md (arm_cond_move_operator): New predicate.
 
2093
+       * config/arm/arm.md (movsfcc): Use arm_cond_move_operator predicate.
 
2094
+       (movdfcc): Likewise.
 
2095
+       * config/arm/vfp.md (*thumb2_movsf_vfp):
 
2096
+       Disable predication for arm_restrict_it.
 
2097
+       (*thumb2_movsfcc_vfp): Disable for arm_restrict_it.
 
2098
+       (*thumb2_movdfcc_vfp): Likewise.
 
2099
+       (*abssf2_vfp, *absdf2_vfp, *negsf2_vfp, *negdf2_vfp,*addsf3_vfp,
 
2100
+       *adddf3_vfp, *subsf3_vfp, *subdf3_vfpc, *divsf3_vfp,*divdf3_vfp,
 
2101
+       *mulsf3_vfp, *muldf3_vfp, *mulsf3negsf_vfp, *muldf3negdf_vfp,
 
2102
+       *mulsf3addsf_vfp, *muldf3adddf_vfp, *mulsf3subsf_vfp,
 
2103
+       *muldf3subdf_vfp, *mulsf3negsfaddsf_vfp, *fmuldf3negdfadddf_vfp,
 
2104
+       *mulsf3negsfsubsf_vfp, *muldf3negdfsubdf_vfp, *fma<SDF:mode>4,
 
2105
+       *fmsub<SDF:mode>4, *fnmsub<SDF:mode>4, *fnmadd<SDF:mode>4,
 
2106
+       *extendsfdf2_vfp, *truncdfsf2_vfp, *extendhfsf2, *truncsfhf2,
 
2107
+       *truncsisf2_vfp, *truncsidf2_vfp, fixuns_truncsfsi2, fixuns_truncdfsi2,
 
2108
+       *floatsisf2_vfp, *floatsidf2_vfp, floatunssisf2, floatunssidf2,
 
2109
+       *sqrtsf2_vfp, *sqrtdf2_vfp, *cmpsf_vfp, *cmpsf_trap_vfp, *cmpdf_vfp,
 
2110
+       *cmpdf_trap_vfp, <vrint_pattern><SDF:mode>2):
 
2111
+       Disable predication for arm_restrict_it.
 
2112
+
 
2113
+       2013-06-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2114
+
 
2115
+       * config/arm/arm.md (arm_mulsi3_v6): Add alternative for 16-bit
 
2116
+       encoding.
 
2117
+       (mulsi3addsi_v6): Disable predicable variant for arm_restrict_it.
 
2118
+       (mulsi3subsi): Likewise.
 
2119
+       (mulsidi3adddi): Likewise.
 
2120
+       (mulsidi3_v6): Likewise.
 
2121
+       (umulsidi3_v6): Likewise.
 
2122
+       (umulsidi3adddi_v6): Likewise.
 
2123
+       (smulsi3_highpart_v6): Likewise.
 
2124
+       (umulsi3_highpart_v6): Likewise.
 
2125
+       (mulhisi3tb): Likewise.
 
2126
+       (mulhisi3bt): Likewise.
 
2127
+       (mulhisi3tt): Likewise.
 
2128
+       (maddhisi4): Likewise.
 
2129
+       (maddhisi4tb): Likewise.
 
2130
+       (maddhisi4tt): Likewise.
 
2131
+       (maddhidi4): Likewise.
 
2132
+       (maddhidi4tb): Likewise.
 
2133
+       (maddhidi4tt): Likewise.
 
2134
+       (zeroextractsi_compare0_scratch): Likewise.
 
2135
+       (insv_zero): Likewise.
 
2136
+       (insv_t2): Likewise.
 
2137
+       (anddi_notzesidi_di): Likewise.
 
2138
+       (anddi_notsesidi_di): Likewise.
 
2139
+       (andsi_notsi_si): Likewise.
 
2140
+       (iordi_zesidi_di): Likewise.
 
2141
+       (xordi_zesidi_di): Likewise.
 
2142
+       (andsi_iorsi3_notsi): Likewise.
 
2143
+       (smax_0): Likewise.
 
2144
+       (smax_m1): Likewise.
 
2145
+       (smin_0): Likewise.
 
2146
+       (not_shiftsi): Likewise.
 
2147
+       (unaligned_loadsi): Likewise.
 
2148
+       (unaligned_loadhis): Likewise.
 
2149
+       (unaligned_loadhiu): Likewise.
 
2150
+       (unaligned_storesi): Likewise.
 
2151
+       (unaligned_storehi): Likewise.
 
2152
+       (extv_reg): Likewise.
 
2153
+       (extzv_t2): Likewise.
 
2154
+       (divsi3): Likewise.
 
2155
+       (udivsi3): Likewise.
 
2156
+       (arm_zero_extendhisi2addsi): Likewise.
 
2157
+       (arm_zero_extendqisi2addsi): Likewise.
 
2158
+       (compareqi_eq0): Likewise.
 
2159
+       (arm_extendhisi2_v6): Likewise.
 
2160
+       (arm_extendqisi2addsi): Likewise.
 
2161
+       (arm_movt): Likewise.
 
2162
+       (thumb2_ldrd): Likewise.
 
2163
+       (thumb2_ldrd_base): Likewise.
 
2164
+       (thumb2_ldrd_base_neg): Likewise.
 
2165
+       (thumb2_strd): Likewise.
 
2166
+       (thumb2_strd_base): Likewise.
 
2167
+       (thumb2_strd_base_neg): Likewise.
 
2168
+       (arm_negsi2): Add alternative for 16-bit encoding.
 
2169
+       (arm_one_cmplsi2): Likewise.
 
2170
+
 
2171
+       2013-06-28  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2172
+
 
2173
+       * config/arm/constraints.md (Ts): New constraint.
 
2174
+       * config/arm/arm.md (arm_movqi_insn): Add alternatives for
 
2175
+       16-bit encodings.
 
2176
+       (compare_scc): Use "Ts" constraint for operand 0.
 
2177
+       (ior_scc_scc): Likewise.
 
2178
+       (and_scc_scc): Likewise.
 
2179
+       (and_scc_scc_nodom): Likewise.
 
2180
+       (ior_scc_scc_cmp): Likewise for operand 7.
 
2181
+       (and_scc_scc_cmp): Likewise.
 
2182
+       * config/arm/thumb2.md (thumb2_movsi_insn):
 
2183
+       Add alternatives for 16-bit encodings.
 
2184
+       (thumb2_movhi_insn): Likewise.
 
2185
+       (thumb2_movsicc_insn): Likewise.
 
2186
+       (thumb2_and_scc): Take 'and' outside cond_exec.  Use "Ts" constraint.
 
2187
+       (thumb2_negscc): Use "Ts" constraint.
 
2188
+       Move mvn instruction outside cond_exec block.
 
2189
+       * config/arm/vfp.md (thumb2_movsi_vfp): Add alternatives
 
2190
+       for 16-bit encodings.
 
2191
+
 
2192
+       2013-07-01  Sofiane Naci  <sofiane.naci@arm.com>
 
2193
+
 
2194
+       * arm.md (attribute "wtype"): Delete.  Move attribute values from here
 
2195
+       to ...
 
2196
+       (attribute "type"): ... here, and prefix with "wmmx_".
 
2197
+       (attribute "core_cycles"): Update for attribute changes.
 
2198
+       * iwmmxt.md (tbcstv8qi): Update for attribute changes.
 
2199
+       (tbcstv4hi): Likewise.
 
2200
+       (tbcstv2si): Likewise.
 
2201
+       (iwmmxt_iordi3): Likewise.
 
2202
+       (iwmmxt_xordi3): Likewise.
 
2203
+       (iwmmxt_anddi3): Likewise.
 
2204
+       (iwmmxt_nanddi3): Likewise.
 
2205
+       (iwmmxt_arm_movdi): Likewise.
 
2206
+       (iwmmxt_movsi_insn): Likewise.
 
2207
+       (mov<mode>_internal): Likewise.
 
2208
+       (and<mode>3_iwmmxt): Likewise.
 
2209
+       (ior<mode>3_iwmmxt): Likewise.
 
2210
+       (xor<mode>3_iwmmxt): Likewise.
 
2211
+       (add<mode>3_iwmmxt): Likewise.
 
2212
+       (ssaddv8qi3): Likewise.
 
2213
+       (ssaddv4hi3): Likewise.
 
2214
+       (ssaddv2si3): Likewise.
 
2215
+       (usaddv8qi3): Likewise.
 
2216
+       (usaddv4hi3): Likewise.
 
2217
+       (usaddv2si3): Likewise.
 
2218
+       (sub<mode>3_iwmmxt): Likewise.
 
2219
+       (sssubv8qi3): Likewise.
 
2220
+       (sssubv4hi3): Likewise.
 
2221
+       (sssubv2si3): Likewise.
 
2222
+       (ussubv8qi3): Likewise.
 
2223
+       (ussubv4hi3): Likewise.
 
2224
+       (ussubv2si3): Likewise.
 
2225
+       (mulv4hi3_iwmmxt): Likewise.
 
2226
+       (smulv4hi3_highpart): Likewise.
 
2227
+       (umulv4hi3_highpart): Likewise.
 
2228
+       (iwmmxt_wmacs): Likewise.
 
2229
+       (iwmmxt_wmacsz): Likewise.
 
2230
+       (iwmmxt_wmacu): Likewise.
 
2231
+       (iwmmxt_wmacuz): Likewise.
 
2232
+       (iwmmxt_clrdi): Likewise.
 
2233
+       (iwmmxt_clrv8qi): Likewise.
 
2234
+       (iwmmxt_clr4hi): Likewise.
 
2235
+       (iwmmxt_clr2si): Likewise.
 
2236
+       (iwmmxt_uavgrndv8qi3): Likewise.
 
2237
+       (iwmmxt_uavgrndv4hi3): Likewise.
 
2238
+       (iwmmxt_uavgv8qi3): Likewise.
 
2239
+       (iwmmxt_uavgv4hi3): Likewise.
 
2240
+       (iwmmxt_tinsrb): Likewise.
 
2241
+       (iwmmxt_tinsrh): Likewise.
 
2242
+       (iwmmxt_tinsrw): Likewise.
 
2243
+       (iwmmxt_textrmub): Likewise.
 
2244
+       (iwmmxt_textrmsb): Likewise.
 
2245
+       (iwmmxt_textrmuh): Likewise.
 
2246
+       (iwmmxt_textrmsh): Likewise.
 
2247
+       (iwmmxt_textrmw): Likewise.
 
2248
+       (iwmxxt_wshufh): Likewise.
 
2249
+       (eqv8qi3): Likewise.
 
2250
+       (eqv4hi3): Likewise.
 
2251
+       (eqv2si3): Likewise.
 
2252
+       (gtuv8qi3): Likewise.
 
2253
+       (gtuv4hi3): Likewise.
 
2254
+       (gtuv2si3): Likewise.
 
2255
+       (gtv8qi3): Likewise.
 
2256
+       (gtv4hi3): Likewise.
 
2257
+       (gtv2si3): Likewise.
 
2258
+       (smax<mode>3_iwmmxt): Likewise.
 
2259
+       (umax<mode>3_iwmmxt): Likewise.
 
2260
+       (smin<mode>3_iwmmxt): Likewise.
 
2261
+       (umin<mode>3_iwmmxt): Likewise.
 
2262
+       (iwmmxt_wpackhss): Likewise.
 
2263
+       (iwmmxt_wpackwss): Likewise.
 
2264
+       (iwmmxt_wpackdss): Likewise.
 
2265
+       (iwmmxt_wpackhus): Likewise.
 
2266
+       (iwmmxt_wpackwus): Likewise.
 
2267
+       (iwmmxt_wpackdus): Likewise.
 
2268
+       (iwmmxt_wunpckihb): Likewise.
 
2269
+       (iwmmxt_wunpckihh): Likewise.
 
2270
+       (iwmmxt_wunpckihw): Likewise.
 
2271
+       (iwmmxt_wunpckilb): Likewise.
 
2272
+       (iwmmxt_wunpckilh): Likewise.
 
2273
+       (iwmmxt_wunpckilw): Likewise.
 
2274
+       (iwmmxt_wunpckehub): Likewise.
 
2275
+       (iwmmxt_wunpckehuh): Likewise.
 
2276
+       (iwmmxt_wunpckehuw): Likewise.
 
2277
+       (iwmmxt_wunpckehsb): Likewise.
 
2278
+       (iwmmxt_wunpckehsh): Likewise.
 
2279
+       (iwmmxt_wunpckehsw): Likewise.
 
2280
+       (iwmmxt_wunpckelub): Likewise.
 
2281
+       (iwmmxt_wunpckeluh): Likewise.
 
2282
+       (iwmmxt_wunpckeluw): Likewise.
 
2283
+       (iwmmxt_wunpckelsb): Likewise.
 
2284
+       (iwmmxt_wunpckelsh): Likewise.
 
2285
+       (iwmmxt_wunpckelsw): Likewise.
 
2286
+       (ror<mode>3): Likewise.
 
2287
+       (ashr<mode>3_iwmmxt): Likewise.
 
2288
+       (lshr<mode>3_iwmmxt): Likewise.
 
2289
+       (ashl<mode>3_iwmmxt): Likewise.
 
2290
+       (ror<mode>3_di): Likewise.
 
2291
+       (ashr<mode>3_di): Likewise.
 
2292
+       (lshr<mode>3_di): Likewise.
 
2293
+       (ashl<mode>3_di): Likewise.
 
2294
+       (iwmmxt_wmadds): Likewise.
 
2295
+       (iwmmxt_wmaddu): Likewise.
 
2296
+       (iwmmxt_tmia): Likewise.
 
2297
+       (iwmmxt_tmiaph): Likewise.
 
2298
+       (iwmmxt_tmiabb): Likewise.
 
2299
+       (iwmmxt_tmiatb): Likewise.
 
2300
+       (iwmmxt_tmiabt): Likewise.
 
2301
+       (iwmmxt_tmiatt): Likewise.
 
2302
+       (iwmmxt_tmovmskb): Likewise.
 
2303
+       (iwmmxt_tmovmskh): Likewise.
 
2304
+       (iwmmxt_tmovmskw): Likewise.
 
2305
+       (iwmmxt_waccb): Likewise.
 
2306
+       (iwmmxt_wacch): Likewise.
 
2307
+       (iwmmxt_waccw): Likewise.
 
2308
+       (iwmmxt_waligni): Likewise.
 
2309
+       (iwmmxt_walignr): Likewise.
 
2310
+       (iwmmxt_walignr0): Likewise.
 
2311
+       (iwmmxt_walignr1): Likewise.
 
2312
+       (iwmmxt_walignr2): Likewise.
 
2313
+       (iwmmxt_walignr3): Likewise.
 
2314
+       (iwmmxt_wsadb): Likewise.
 
2315
+       (iwmmxt_wsadh): Likewise.
 
2316
+       (iwmmxt_wsadbz): Likewise.
 
2317
+       (iwmmxt_wsadhz): Likewise.
 
2318
+       * iwmmxt2.md (iwmmxt_wabs<mode>3): Update for attribute changes.
 
2319
+       (iwmmxt_wabsdiffb): Likewise.
 
2320
+       (iwmmxt_wabsdiffh): Likewise.
 
2321
+       (iwmmxt_wabsdiffw): Likewise.
 
2322
+       (iwmmxt_waddsubhx): Likewise
 
2323
+       (iwmmxt_wsubaddhx): Likewise.
 
2324
+       (addc<mode>3): Likewise.
 
2325
+       (iwmmxt_avg4): Likewise.
 
2326
+       (iwmmxt_avg4r): Likewise.
 
2327
+       (iwmmxt_wmaddsx): Likewise.
 
2328
+       (iwmmxt_wmaddux): Likewise.
 
2329
+       (iwmmxt_wmaddsn): Likewise.
 
2330
+       (iwmmxt_wmaddun): Likewise.
 
2331
+       (iwmmxt_wmulwsm): Likewise.
 
2332
+       (iwmmxt_wmulwum): Likewise.
 
2333
+       (iwmmxt_wmulsmr): Likewise.
 
2334
+       (iwmmxt_wmulumr): Likewise.
 
2335
+       (iwmmxt_wmulwsmr): Likewise.
 
2336
+       (iwmmxt_wmulwumr): Likewise.
 
2337
+       (iwmmxt_wmulwl): Likewise.
 
2338
+       (iwmmxt_wqmulm): Likewise.
 
2339
+       (iwmmxt_wqmulwm): Likewise.
 
2340
+       (iwmmxt_wqmulmr): Likewise.
 
2341
+       (iwmmxt_wqmulwmr): Likewise.
 
2342
+       (iwmmxt_waddbhusm): Likewise.
 
2343
+       (iwmmxt_waddbhusl): Likewise.
 
2344
+       (iwmmxt_wqmiabb): Likewise.
 
2345
+       (iwmmxt_wqmiabt): Likewise.
 
2346
+       (iwmmxt_wqmiatb): Likewise.
 
2347
+       (iwmmxt_wqmiatt): Likewise.
 
2348
+       (iwmmxt_wqmiabbn): Likewise.
 
2349
+       (iwmmxt_wqmiabtn): Likewise.
 
2350
+       (iwmmxt_wqmiatbn): Likewise.
 
2351
+       (iwmmxt_wqmiattn): Likewise.
 
2352
+       (iwmmxt_wmiabb): Likewise.
 
2353
+       (iwmmxt_wmiabt): Likewise.
 
2354
+       (iwmmxt_wmiatb): Likewise.
 
2355
+       (iwmmxt_wmiatt): Likewise.
 
2356
+       (iwmmxt_wmiabbn): Likewise.
 
2357
+       (iwmmxt_wmiabtn): Likewise.
 
2358
+       (iwmmxt_wmiatbn): Likewise.
 
2359
+       (iwmmxt_wmiattn): Likewise.
 
2360
+       (iwmmxt_wmiawbb): Likewise.
 
2361
+       (iwmmxt_wmiawbt): Likewise.
 
2362
+       (iwmmxt_wmiawtb): Likewise.
 
2363
+       (iwmmxt_wmiawtt): Likewise.
 
2364
+       (iwmmxt_wmiawbbn): Likewise.
 
2365
+       (iwmmxt_wmiawbtn): Likewise.
 
2366
+       (iwmmxt_wmiawtbn): Likewise.
 
2367
+       (iwmmxt_wmiawttn): Likewise.
 
2368
+       (iwmmxt_wmerge): Likewise.
 
2369
+       (iwmmxt_tandc<mode>3): Likewise.
 
2370
+       (iwmmxt_torc<mode>3): Likewise.
 
2371
+       (iwmmxt_torvsc<mode>3): Likewise.
 
2372
+       (iwmmxt_textrc<mode>3): Likewise.
 
2373
+       * marvell-f-iwmmxt.md (wmmxt_shift): Update for attribute changes.
 
2374
+       (wmmxt_pack): Likewise.
 
2375
+       (wmmxt_mult_c1): Likewise.
 
2376
+       (wmmxt_mult_c2): Likewise.
 
2377
+       (wmmxt_alu_c1): Likewise.
 
2378
+       (wmmxt_alu_c2): Likewise.
 
2379
+       (wmmxt_alu_c3): Likewise.
 
2380
+       (wmmxt_transfer_c1): Likewise.
 
2381
+       (wmmxt_transfer_c2): Likewise.
 
2382
+       (wmmxt_transfer_c3): Likewise.
 
2383
+       (marvell_f_iwmmxt_wstr): Likewise.
 
2384
+       (marvell_f_iwmmxt_wldr): Likewise.
 
2385
+
 
2386
+2013-08-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
2387
+
 
2388
+       Backport from trunk r201237.
 
2389
+       2013-07-25  Terry Guo  <terry.guo@arm.com>
 
2390
+
 
2391
+       * config/arm/arm.c (thumb1_size_rtx_costs): Assign proper cost for
 
2392
+       shift_add/shift_sub0/shift_sub1 RTXs.
 
2393
+
 
2394
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
2395
+
 
2396
+       Backport from trunk r200596,201067,201083.
 
2397
+       2013-07-02  Ian Bolton  <ian.bolton@arm.com>
 
2398
+
 
2399
+       * config/aarch64/aarch64-simd.md (absdi2): Support abs for
 
2400
+       DI mode.
 
2401
+
 
2402
+       2013-07-19  Ian Bolton  <ian.bolton@arm.com>
 
2403
+
 
2404
+       * config/aarch64/arm_neon.h (vabs_s64): New function
 
2405
+
 
2406
+       2013-07-20  James Greenhalgh  <james.greenhalgh@arm.com>
 
2407
+
 
2408
+       * config/aarch64/aarch64-builtins.c
 
2409
+       (aarch64_fold_builtin): Fold abs in all modes.
 
2410
+       * config/aarch64/aarch64-simd-builtins.def
 
2411
+       (abs): Enable for all modes.
 
2412
+       * config/aarch64/arm_neon.h
 
2413
+       (vabs<q>_s<8,16,32,64): Rewrite using builtins.
 
2414
+       (vabs_f64): Add missing intrinsic.
 
2415
+
 
2416
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
2417
+
 
2418
+       Backport from trunk r198735,198831,199959.
 
2419
+       2013-05-09  Sofiane Naci  <sofiane.naci@arm.com>
 
2420
+
 
2421
+       * config/aarch64/aarch64.md: New movtf split.
 
2422
+       (*movtf_aarch64): Update.
 
2423
+       (aarch64_movdi_tilow): Handle TF modes and rename to
 
2424
+       aarch64_movdi_<mode>low.
 
2425
+       (aarch64_movdi_tihigh): Handle TF modes and rename to
 
2426
+       aarch64_movdi_<mode>high
 
2427
+       (aarch64_movtihigh_di): Handle TF modes and rename to
 
2428
+       aarch64_mov<mode>high_di
 
2429
+       (aarch64_movtilow_di): Handle TF modes and rename to
 
2430
+       aarch64_mov<mode>low_di
 
2431
+       (aarch64_movtilow_tilow): Remove spurious whitespace.
 
2432
+       * config/aarch64/aarch64.c (aarch64_split_128bit_move): Handle TFmode
 
2433
+       splits.
 
2434
+       (aarch64_print_operand): Update.
 
2435
+
 
2436
+       2013-05-13  Sofiane Naci  <sofiane.naci@arm.com>
 
2437
+
 
2438
+       * config/aarch64/aarch64-simd.md (aarch64_simd_mov<mode>): Group
 
2439
+       similar switch cases.
 
2440
+       (aarch64_simd_mov): Rename to aarch64_split_simd_mov. Update.
 
2441
+       (aarch64_simd_mov_to_<mode>low): Delete.
 
2442
+       (aarch64_simd_mov_to_<mode>high): Delete.
 
2443
+       (move_lo_quad_<mode>): Add w<-r alternative.
 
2444
+       (aarch64_simd_move_hi_quad_<mode>): Likewise.
 
2445
+       (aarch64_simd_mov_from_*): Update type attribute.
 
2446
+       * config/aarch64/aarch64.c (aarch64_split_simd_move): Refacror switch
 
2447
+       statement.
 
2448
+
 
2449
+       2013-06-11  Sofiane Naci  <sofiane.naci@arm.com>
 
2450
+
 
2451
+       * config/aarch64/aarch64-simd.md (move_lo_quad_<mode>): Update.
 
2452
+
 
2453
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
2454
+
 
2455
+       Backport from trunk r199438,199439,201326.
 
2456
+
 
2457
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2458
+
 
2459
+       * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added.
 
2460
+       (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes.
 
2461
+       (arm_emit_vfp_multi_reg_pop): Likewise.
 
2462
+       (thumb2_emit_ldrd_pop): Likewise.
 
2463
+       (arm_expand_epilogue): Add misc REG_CFA notes.
 
2464
+       (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE.
 
2465
+
 
2466
+       2013-05-30  Bernd Schmidt  <bernds@codesourcery.com>
 
2467
+           Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2468
+
 
2469
+       * config/arm/arm-protos.h: Add and update function protos.
 
2470
+       * config/arm/arm.c (use_simple_return_p): New added.
 
2471
+       (thumb2_expand_return): Check simple_return flag.
 
2472
+       * config/arm/arm.md: Add simple_return and conditional simple_return.
 
2473
+       * config/arm/iterators.md: Add iterator for return and simple_return.
 
2474
+
 
2475
+       2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2476
+
 
2477
+       PR rtl-optimization/57637
 
2478
+       * function.c (move_insn_for_shrink_wrap): Also check the
 
2479
+       GEN set of the LIVE problem for the liveness analysis
 
2480
+       if it exists, otherwise give up.
 
2481
+
 
2482
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
2483
+
 
2484
+       Backport from trunk r198928,198973,199203,201240,201241,201307.
 
2485
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2486
+
 
2487
+       PR target/19599
 
2488
+       * config/arm/predicates.md (call_insn_operand): New predicate.
 
2489
+       * config/arm/constraints.md ("Cs", "Ss"):  New constraints.
 
2490
+       * config/arm/arm.md (*call_insn, *call_value_insn): Match only
 
2491
+       if insn is not a tail call.
 
2492
+       (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through
 
2493
+       registers.
 
2494
+       * config/arm/arm.h (enum reg_class): New caller save register class.
 
2495
+       (REG_CLASS_NAMES): Likewise.
 
2496
+       (REG_CLASS_CONTENTS): Likewise.
 
2497
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling
 
2498
+       without decls.
 
2499
+
 
2500
+       2013-05-16  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2501
+
 
2502
+       PR target/19599
 
2503
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
 
2504
+       for NULL decl.
 
2505
+
 
2506
+       2013-05-22  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2507
+
 
2508
+       PR target/19599
 
2509
+       PR target/57340
 
2510
+       * config/arm/arm.c (any_sibcall_uses_r3): Rename to ..
 
2511
+       (any_sibcall_could_use_r3): this and handle indirect calls.
 
2512
+       (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3.
 
2513
+
 
2514
+       2013-07-25  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2515
+
 
2516
+       PR target/19599
 
2517
+       PR target/57731
 
2518
+       PR target/57748
 
2519
+       * config/arm/arm.md ("*sibcall_value_insn): Replace use of
 
2520
+       Ss with US. Adjust output for v5 and v4t.
 
2521
+       (*sibcall_value_insn): Likewise and loosen predicate on
 
2522
+       operand0.
 
2523
+       * config/arm/constraints.md ("Ss"): Rename to US.
 
2524
+
 
2525
+       2013-07-25  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2526
+
 
2527
+       * config/arm/arm.md (*sibcall_insn): Remove unnecessary space.
 
2528
+
 
2529
+       2013-07-29  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2530
+       Fix incorrect changelog entry.
 
2531
+
 
2532
+       Replace
 
2533
+       PR target/57748
 
2534
+       with
 
2535
+       PR target/57837
 
2536
+
 
2537
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2538
+
 
2539
+       Backport from trunk r200922.
 
2540
+       2013-07-12  Tejas Belagod  <tejas.belagod@arm.com>
 
2541
+
 
2542
+       * config/aarch64/aarch64-protos.h
 
2543
+       (aarch64_simd_immediate_valid_for_move): Remove.
 
2544
+       * config/aarch64/aarch64.c (simd_immediate_info): New member.
 
2545
+       (aarch64_simd_valid_immediate): Recognize idioms for shifting ones
 
2546
+       cases.
 
2547
+       (aarch64_output_simd_mov_immediate): Print the correct shift specifier.
 
2548
+
 
2549
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2550
+
 
2551
+       Backport from trunk r200670.
 
2552
+       2013-07-04  Tejas Belagod  <tejas.belagod@arm.com>
 
2553
+
 
2554
+       * config/aarch64/aarch64-protos.h (cpu_vector_cost): New.
 
2555
+       (tune_params): New member 'const vec_costs'.
 
2556
+       * config/aarch64/aarch64.c (generic_vector_cost): New.
 
2557
+       (generic_tunings): New member 'generic_vector_cost'.
 
2558
+       (aarch64_builtin_vectorization_cost): New.
 
2559
+       (aarch64_add_stmt_cost): New.
 
2560
+       (TARGET_VECTORIZE_ADD_STMT_COST): New.
 
2561
+       (TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST): New.
 
2562
+
 
2563
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2564
+
 
2565
+       Backport from trunk r200637.
 
2566
+       2013-07-03  Yufeng Zhang  <yufeng.zhang@arm.com>
 
2567
+
 
2568
+       * config/aarch64/aarch64.h (enum arm_abi_type): Remove.
 
2569
+       (ARM_ABI_AAPCS64): Ditto.
 
2570
+       (arm_abi): Ditto.
 
2571
+       (ARM_DEFAULT_ABI): Ditto.
 
2572
+
 
2573
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2574
+
 
2575
+       Backport from trunk r200532, r200565.
 
2576
+       2013-06-28  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2577
+
 
2578
+       * config/aarch64/aarch64.c (aarch64_cannot_force_const_mem): Adjust
 
2579
+       layout.
 
2580
+
 
2581
+       2013-06-29  Yufeng Zhang  <yufeng.zhang@arm.com>
 
2582
+
 
2583
+       * config/aarch64/aarch64.c: Remove junk from the beginning of the
 
2584
+       file.
 
2585
+
 
2586
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2587
+
 
2588
+       Backport from trunk r200531.
 
2589
+       2013-06-28  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2590
+
 
2591
+       * config/aarch64/aarch64-protos.h (aarch64_symbol_type):
 
2592
+       Update comment w.r.t SYMBOL_TINY_ABSOLUTE.
 
2593
+
 
2594
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2595
+
 
2596
+       Backport from trunk r200519.
 
2597
+       2013-06-28  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2598
+
 
2599
+       * config/aarch64/aarch64-protos.h
 
2600
+       aarch64_classify_symbol_expression): Define.
 
2601
+       (aarch64_symbolic_constant_p): Remove.
 
2602
+       * config/aarch64/aarch64.c (aarch64_classify_symbol_expression): Remove
 
2603
+       static.  Fix line length and white space.
 
2604
+       (aarch64_symbolic_constant_p): Remove.
 
2605
+       * config/aarch64/predicates.md (aarch64_valid_symref):
 
2606
+       Use aarch64_classify_symbol_expression.
 
2607
+
 
2608
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2609
+
 
2610
+       Backport from trunk r200466, r200467.
 
2611
+       2013-06-27  Yufeng Zhang  <yufeng.zhang@arm.com>
 
2612
+
 
2613
+       * config/aarch64/aarch64.c (aarch64_force_temporary): Add an extra
 
2614
+       parameter 'mode' of type 'enum machine_mode mode'; change to pass
 
2615
+       'mode' to force_reg.
 
2616
+       (aarch64_add_offset): Update calls to aarch64_force_temporary.
 
2617
+       (aarch64_expand_mov_immediate): Likewise.
 
2618
+
 
2619
+       2013-06-27  Yufeng Zhang  <yufeng.zhang@arm.com>
 
2620
+
 
2621
+       * config/aarch64/aarch64.c (aarch64_add_offset): Change to pass
 
2622
+       'mode' to aarch64_plus_immediate and gen_rtx_PLUS.
 
2623
+
 
2624
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
2625
+
 
2626
+       Backport from trunk r200419.
 
2627
+       2013-06-26  Greta Yorsh  <Greta.Yorsh@arm.com>
 
2628
+
 
2629
+       * config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
 
2630
+       * config/arm/arm-protos.h (arm_max_conditional_execute): New
 
2631
+       declaration.
 
2632
+       (tune_params): Update comment.
 
2633
+       * config/arm/arm.c (arm_cortex_a15_tune): Set max_cond_insns to 2.
 
2634
+       (arm_max_conditional_execute): New function.
 
2635
+       (thumb2_final_prescan_insn): Use max_insn_skipped and
 
2636
+       MAX_INSN_PER_IT_BLOCK to compute maximum instructions in a block.
 
2637
+
 
2638
+2013-07-24  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
2639
+
 
2640
+       * LINARO-VERSION: Bump version.
 
2641
+
 
2642
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
2643
+
 
2644
+        GCC Linaro 4.8-2013.07-1 released.
 
2645
+
 
2646
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
2647
+
 
2648
+       Backport from trunk r201005.
 
2649
+       2013-07-17  Yvan Roux  <yvan.roux@linaro.org>
 
2650
+
 
2651
+       PR target/57909
 
2652
+       * config/arm/arm.c (gen_movmem_ldrd_strd): Fix unaligned load/store
 
2653
+       usage in HI mode.
 
2654
+
 
2655
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
2656
+
 
2657
+       GCC Linaro 4.8-2013.07 released.
 
2658
+
 
2659
+2013-07-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
2660
+
 
2661
+       Revert backport from trunk r198928,198973,199203.
 
2662
+       2013-05-22  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2663
+
 
2664
+       PR target/19599
 
2665
+       PR target/57340
 
2666
+       * config/arm/arm.c (any_sibcall_uses_r3): Rename to ..
 
2667
+       (any_sibcall_could_use_r3): this and handle indirect calls.
 
2668
+       (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3.
 
2669
+
 
2670
+       2013-05-16  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2671
+
 
2672
+       PR target/19599
 
2673
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
 
2674
+       for NULL decl.
 
2675
+
 
2676
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
2677
+
 
2678
+       PR target/19599
 
2679
+       * config/arm/predicates.md (call_insn_operand): New predicate.
 
2680
+       * config/arm/constraints.md ("Cs", "Ss"):  New constraints.
 
2681
+       * config/arm/arm.md (*call_insn, *call_value_insn): Match only
 
2682
+       if insn is not a tail call.
 
2683
+       (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through
 
2684
+       registers.
 
2685
+       * config/arm/arm.h (enum reg_class): New caller save register class.
 
2686
+       (REG_CLASS_NAMES): Likewise.
 
2687
+       (REG_CLASS_CONTENTS): Likewise.
 
2688
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling
 
2689
+       without decls.
 
2690
+
 
2691
+2013-07-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
2692
+
 
2693
+       Revert backport from mainline (r199438, r199439)
 
2694
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2695
+
 
2696
+       * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added.
 
2697
+       (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes.
 
2698
+       (arm_emit_vfp_multi_reg_pop): Likewise.
 
2699
+       (thumb2_emit_ldrd_pop): Likewise.
 
2700
+       (arm_expand_epilogue): Add misc REG_CFA notes.
 
2701
+       (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE.
 
2702
+
 
2703
+       2013-05-30  Bernd Schmidt  <bernds@codesourcery.com>
 
2704
+                   Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2705
+
 
2706
+       * config/arm/arm-protos.h: Add and update function protos.
 
2707
+       * config/arm/arm.c (use_simple_return_p): New added.
 
2708
+       (thumb2_expand_return): Check simple_return flag.
 
2709
+       * config/arm/arm.md: Add simple_return and conditional simple_return.
 
2710
+       * config/arm/iterators.md: Add iterator for return and simple_return.
 
2711
+       * gcc.dg/shrink-wrap-alloca.c: New added.
 
2712
+       * gcc.dg/shrink-wrap-pretend.c: New added.
 
2713
+       * gcc.dg/shrink-wrap-sibcall.c: New added.
 
2714
+
 
2715
+2013-07-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
2716
+
 
2717
+       Backport from trunk r199640, 199705, 199733, 199734, 199739.
 
2718
+       2013-06-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2719
+
 
2720
+       * rtl.def: Add extra fourth optional field to define_cond_exec.
 
2721
+       * gensupport.c (process_one_cond_exec): Process attributes from
 
2722
+       define_cond_exec.
 
2723
+       * doc/md.texi: Document fourth field in define_cond_exec.
 
2724
+
 
2725
+       2013-06-05  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2726
+
 
2727
+       * config/arm/arm.md (enabled_for_depr_it): New attribute.
 
2728
+       (predicable_short_it): Likewise.
 
2729
+       (predicated): Likewise.
 
2730
+       (enabled): Handle above.
 
2731
+       (define_cond_exec): Set predicated attribute to yes.
 
2732
+
 
2733
+       2013-06-06  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2734
+
 
2735
+       * config/arm/sync.md (atomic_loaddi_1):
 
2736
+       Disable predication for arm_restrict_it.
 
2737
+       (arm_load_exclusive<mode>): Likewise.
 
2738
+       (arm_load_exclusivesi): Likewise.
 
2739
+       (arm_load_exclusivedi): Likewise.
 
2740
+       (arm_load_acquire_exclusive<mode>): Likewise.
 
2741
+       (arm_load_acquire_exclusivesi): Likewise.
 
2742
+       (arm_load_acquire_exclusivedi): Likewise.
 
2743
+       (arm_store_exclusive<mode>): Likewise.
 
2744
+       (arm_store_exclusive<mode>): Likewise.
 
2745
+       (arm_store_release_exclusivedi): Likewise.
 
2746
+       (arm_store_release_exclusive<mode>): Likewise.
 
2747
+
 
2748
+       2013-06-06  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2749
+
 
2750
+       * config/arm/arm-ldmstm.ml: Set "predicable_short_it" to "no"
 
2751
+       where appropriate.
 
2752
+       * config/arm/ldmstm.md: Regenerate.
 
2753
+
 
2754
+       2013-06-06  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2755
+
 
2756
+       * config/arm/arm-fixed.md (add<mode>3,usadd<mode>3,ssadd<mode>3,
 
2757
+       sub<mode>3, ussub<mode>3, sssub<mode>3, arm_ssatsihi_shift,
 
2758
+       arm_usatsihi): Adjust alternatives for arm_restrict_it.
 
2759
+
 
2760
+2013-07-02  Rob Savoye  <rob.savoye@linaro.org>
 
2761
+
 
2762
+       Backport from trunk 200096
 
2763
+
 
2764
+       2013-06-14  Vidya Praveen <vidyapraveen@arm.com>
 
2765
+
 
2766
+       * config/aarch64/aarch64-simd.md (aarch64_<su>mlal_lo<mode>):
 
2767
+       New pattern.
 
2768
+       (aarch64_<su>mlal_hi<mode>, aarch64_<su>mlsl_lo<mode>): Likewise.
 
2769
+       (aarch64_<su>mlsl_hi<mode>, aarch64_<su>mlal<mode>): Likewise.
 
2770
+       (aarch64_<su>mlsl<mode>): Likewise.
 
2771
+
 
2772
+2013-07-02  Rob Savoye  <rob.savoye@linaro.org>
 
2773
+
 
2774
+       Backport from trunk 200062
 
2775
+
 
2776
+       2013-06-13  Bin Cheng  <bin.cheng@arm.com>
 
2777
+       * fold-const.c (operand_equal_p): Consider NOP_EXPR and
 
2778
+       CONVERT_EXPR as equal nodes.
 
2779
+
 
2780
+2013-07-02  Rob Savoye  <rob.savoye@linaro.org>
 
2781
+       Backport from trunk 199810
 
2782
+
 
2783
+       2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2784
+
 
2785
+       * config/arm/arm.md (anddi3_insn): Remove duplicate alternatives.
 
2786
+       Clean up alternatives.
 
2787
+
 
2788
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
2789
+
 
2790
+       Backport from trunk 200152
 
2791
+       2013-06-17  Sofiane Naci  <sofiane.naci@arm.com>
 
2792
+
 
2793
+       * config/aarch64/aarch64-simd.md (aarch64_dup_lane<mode>): Add r<-w
 
2794
+       alternative and update.
 
2795
+       (aarch64_dup_lanedi): Delete.
 
2796
+       * config/aarch64/arm_neon.h (vdup<bhsd>_lane_*): Update.
 
2797
+       * config/aarch64/aarch64-simd-builtins.def: Update.
 
2798
+
 
2799
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
2800
+
 
2801
+       Backport from trunk 200061
 
2802
+       2013-06-13  Bin Cheng  <bin.cheng@arm.com>
 
2803
+
 
2804
+       * rtlanal.c (noop_move_p): Check the code to be executed for
 
2805
+       COND_EXEC.
 
2806
+
 
2807
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
2808
+
 
2809
+       Backport from trunk 199694
 
2810
+       2013-06-05  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
2811
+
 
2812
+       * config/arm/arm.c (MAX_INSN_PER_IT_BLOCK): New macro.
 
2813
+       (arm_option_override): Override arm_restrict_it where appropriate.
 
2814
+       (thumb2_final_prescan_insn): Use MAX_INSN_PER_IT_BLOCK.
 
2815
+       * config/arm/arm.opt (mrestrict-it): New command-line option.
 
2816
+       * doc/invoke.texi: Document -mrestrict-it.
 
2817
+
 
2818
+2013-06-20  Christophe Lyon  <christophe.lyon@linaro.org>
 
2819
+
 
2820
+       Backport from trunk r198683.
 
2821
+       2013-05-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
2822
+
 
2823
+       * config/arm/arm.c (arm_asan_shadow_offset): New function.
 
2824
+       (TARGET_ASAN_SHADOW_OFFSET): Define.
 
2825
+       * config/arm/linux-eabi.h (ASAN_CC1_SPEC): Define.
 
2826
+       (LINUX_OR_ANDROID_CC): Add ASAN_CC1_SPEC.
 
2827
+
 
2828
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
2829
+
 
2830
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
2831
+
 
2832
+2013-06-06  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2833
+
 
2834
+       Backport from mainline (r199438, r199439)
 
2835
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2836
+
 
2837
+       * config/arm/arm.c (arm_add_cfa_adjust_cfa_note): New added.
 
2838
+       (arm_emit_multi_reg_pop): Add REG_CFA_ADJUST_CFA notes.
 
2839
+       (arm_emit_vfp_multi_reg_pop): Likewise.
 
2840
+       (thumb2_emit_ldrd_pop): Likewise.
 
2841
+       (arm_expand_epilogue): Add misc REG_CFA notes.
 
2842
+       (arm_unwind_emit): Skip REG_CFA_ADJUST_CFA and REG_CFA_RESTORE.
 
2843
+
 
2844
+       2013-05-30  Bernd Schmidt  <bernds@codesourcery.com>
 
2845
+                   Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
2846
+
 
2847
+       * config/arm/arm-protos.h: Add and update function protos.
 
2848
+       * config/arm/arm.c (use_simple_return_p): New added.
 
2849
+       (thumb2_expand_return): Check simple_return flag.
 
2850
+       * config/arm/arm.md: Add simple_return and conditional simple_return.
 
2851
+       * config/arm/iterators.md: Add iterator for return and simple_return.
 
2852
+       * gcc.dg/shrink-wrap-alloca.c: New added.
 
2853
+       * gcc.dg/shrink-wrap-pretend.c: New added.
 
2854
+       * gcc.dg/shrink-wrap-sibcall.c: New added.
 
2855
+
 
2856
+2013-06-06  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
2857
+
 
2858
+       Backport from mainline r198879:
 
2859
+
 
2860
+       2013-05-14  Chung-Lin Tang  <cltang@codesourcery.com>
 
2861
+       PR target/42017
 
2862
+       * config/arm/arm.h (EPILOGUE_USES): Only return true
 
2863
+       for LR_REGNUM after epilogue_completed.
 
2864
+
 
2865
+2013-06-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
2866
+
 
2867
+       Backport from trunk r199652,199653,199656,199657,199658.
 
2868
+
 
2869
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
2870
+
 
2871
+       * config/aarch64/aarch64.md (*mov<mode>_aarch64): Call
 
2872
+       into function to generate MOVI instruction.
 
2873
+       * config/aarch64/aarch64.c (aarch64_simd_container_mode):
 
2874
+       New function.
 
2875
+       (aarch64_preferred_simd_mode): Turn into wrapper.
 
2876
+       (aarch64_output_scalar_simd_mov_immediate): New function.
 
2877
+       * config/aarch64/aarch64-protos.h: Add prototype for above.
 
2878
+
 
2879
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
2880
+
 
2881
+       * config/aarch64/aarch64.c (simd_immediate_info): Remove
 
2882
+       element_char member.
 
2883
+       (sizetochar): Return signed char.
 
2884
+       (aarch64_simd_valid_immediate): Remove elchar and other
 
2885
+       unnecessary variables.
 
2886
+       (aarch64_output_simd_mov_immediate): Take rtx instead of &rtx.
 
2887
+       Calculate element_char as required.
 
2888
+       * config/aarch64/aarch64-protos.h: Update and move prototype
 
2889
+       for aarch64_output_simd_mov_immediate.
 
2890
+       * config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>):
 
2891
+       Update arguments.
 
2892
+
 
2893
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
2894
+
 
2895
+       * config/aarch64/aarch64.c (simd_immediate_info): Struct to hold
 
2896
+       information completed by aarch64_simd_valid_immediate.
 
2897
+       (aarch64_legitimate_constant_p): Update arguments.
 
2898
+       (aarch64_simd_valid_immediate): Work with struct rather than many
 
2899
+       pointers.
 
2900
+       (aarch64_simd_scalar_immediate_valid_for_move): Update arguments.
 
2901
+       (aarch64_simd_make_constant): Update arguments.
 
2902
+       (aarch64_output_simd_mov_immediate): Work with struct rather than
 
2903
+       many pointers.  Output immediate directly rather than as operand.
 
2904
+       * config/aarch64/aarch64-protos.h (aarch64_simd_valid_immediate):
 
2905
+       Update prototype.
 
2906
+       * config/aarch64/constraints.md (Dn): Update arguments.
 
2907
+
 
2908
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
2909
+
 
2910
+       * config/aarch64/aarch64.c (aarch64_simd_valid_immediate): No
 
2911
+       longer static.
 
2912
+       (aarch64_simd_immediate_valid_for_move): Remove.
 
2913
+       (aarch64_simd_scalar_immediate_valid_for_move): Update call.
 
2914
+       (aarch64_simd_make_constant): Update call.
 
2915
+       (aarch64_output_simd_mov_immediate): Update call.
 
2916
+       * config/aarch64/aarch64-protos.h (aarch64_simd_valid_immediate):
 
2917
+       Add prototype.
 
2918
+       * config/aarch64/constraints.md (Dn): Update call.
 
2919
+
 
2920
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
2921
+
 
2922
+       * config/aarch64/aarch64.c (aarch64_simd_valid_immediate): Change
 
2923
+       return type to bool for prototype.
 
2924
+       (aarch64_legitimate_constant_p): Check for true instead of not -1.
 
2925
+       (aarch64_simd_valid_immediate): Fix up each return to return a bool.
 
2926
+       (aarch64_simd_immediate_valid_for_move): Update retval for bool.
 
2927
+
 
2928
+2013-06-04  Christophe Lyon  <christophe.lyon@linaro.org>
 
2929
+
 
2930
+       Backport from trunk r199261.
 
2931
+       2013-05-23  Christian Bruel  <christian.bruel@st.com>
 
2932
+
 
2933
+       PR debug/57351
 
2934
+       * config/arm/arm.c (arm_dwarf_register_span): Do not use dbx number.
 
2935
+
 
2936
+2013-06-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
2937
+
 
2938
+       Backport from trunk
 
2939
+       r198890,199254,199259,199260,199293,199407,199408,199454,199544,199545.
 
2940
+
 
2941
+       2013-05-31  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2942
+
 
2943
+       * config/aarch64/aarch64.c (aarch64_load_symref_appropriately):
 
2944
+       Remove un-necessary braces.
 
2945
+
 
2946
+       2013-05-31  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2947
+
 
2948
+       * config/aarch64/aarch64.c (aarch64_classify_symbol):
 
2949
+       Use SYMBOL_TINY_ABSOLUTE for AARCH64_CMODEL_TINY_PIC.
 
2950
+
 
2951
+       2013-05-30  Ian Bolton  <ian.bolton@arm.com>
 
2952
+
 
2953
+       * config/aarch64/aarch64.md (insv<mode>): New define_expand.
 
2954
+       (*insv_reg<mode>): New define_insn.
 
2955
+
 
2956
+       2012-05-29  Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
 
2957
+           Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2958
+
 
2959
+       * config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
 
2960
+       SYMBOL_TINY_ABSOLUTE.
 
2961
+       * config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Handle
 
2962
+       SYMBOL_TINY_ABSOLUTE.
 
2963
+       (aarch64_expand_mov_immediate): Likewise.
 
2964
+       (aarch64_classify_symbol): Likewise.
 
2965
+       (aarch64_mov_operand_p): Remove ATTRIBUTE_UNUSED.
 
2966
+       Permit SYMBOL_TINY_ABSOLUTE.
 
2967
+       * config/aarch64/predicates.md (aarch64_mov_operand): Permit CONST.
 
2968
+
 
2969
+       2013-05-29  Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
 
2970
+           Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2971
+
 
2972
+       * config/aarch64/aarch64.c (aarch64_classify_symbol): Remove comment.
 
2973
+       Refactor if/switch.  Replace gcc_assert with if.
 
2974
+
 
2975
+       2013-05-24  Ian Bolton  <ian.bolton@arm.com>
 
2976
+
 
2977
+       * config/aarch64/aarch64.c (aarch64_print_operand): Change the
 
2978
+       X format specifier to only display bottom 16 bits.
 
2979
+       * config/aarch64/aarch64.md (insv_imm<mode>): Allow any size of
 
2980
+       immediate to match for operand 2, since it will be masked.
 
2981
+
 
2982
+       2013-05-23  Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
 
2983
+           Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2984
+
 
2985
+       * config/aarch64/aarch64.md (*movdi_aarch64): Replace Usa with S.
 
2986
+       * config/aarch64/constraints.md (Usa): Remove.
 
2987
+       * doc/md.texi (AArch64 Usa): Remove.
 
2988
+
 
2989
+       2013-05-23  Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
 
2990
+           Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
2991
+
 
2992
+       * config/aarch64/aarch64-protos.h (aarch64_mov_operand_p): Define.
 
2993
+       * config/aarch64/aarch64.c (aarch64_mov_operand_p): Define.
 
2994
+       * config/aarch64/predicates.md (aarch64_const_address): Remove.
 
2995
+       (aarch64_mov_operand): Use aarch64_mov_operand_p.
 
2996
+
 
2997
+       2013-05-23  Vidya Praveen <vidyapraveen@arm.com>
 
2998
+
 
2999
+       * config/aarch64/aarch64-simd.md (clzv4si2): Support for CLZ
 
3000
+       instruction (AdvSIMD).
 
3001
+       * config/aarch64/aarch64-builtins.c
 
3002
+       (aarch64_builtin_vectorized_function): Handler for BUILT_IN_CLZ.
 
3003
+       * config/aarch64/aarch-simd-builtins.def: Entry for CLZ.
 
3004
+
 
3005
+       2013-05-14  James Greenhalgh  <james.greenhalgh@arm.com>
 
3006
+
 
3007
+       * config/aarch64/aarch64-simd.md
 
3008
+       (aarch64_vcond_internal<mode>): Rename to...
 
3009
+       (aarch64_vcond_internal<mode><mode>): ...This, for integer modes.
 
3010
+       (aarch64_vcond_internal<VDQF_COND:mode><VDQF:mode>): ...This for
 
3011
+       float modes. Clarify all iterator modes.
 
3012
+       (vcond<mode><mode>): Use new name for vcond expanders.
 
3013
+       (vcond<v_cmp_result><mode>): Likewise.
 
3014
+       (vcondu<mode><mode>: Likewise.
 
3015
+       * config/aarch64/iterators.md (VDQF_COND): New.
 
3016
+
 
3017
+2013-05-29  Christophe Lyon  <christophe.lyon@linaro.org>
 
3018
+
 
3019
+       Backport from trunk r198928,198973,199203.
 
3020
+       2013-05-22  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
3021
+
 
3022
+       PR target/19599
 
3023
+       PR target/57340
 
3024
+       * config/arm/arm.c (any_sibcall_uses_r3): Rename to ..
 
3025
+       (any_sibcall_could_use_r3): this and handle indirect calls.
 
3026
+       (arm_get_frame_offsets): Rename use of any_sibcall_uses_r3.
 
3027
+
 
3028
+       2013-05-16  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
3029
+
 
3030
+       PR target/19599
 
3031
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
 
3032
+       for NULL decl.
 
3033
+
 
3034
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
3035
+
 
3036
+       PR target/19599
 
3037
+       * config/arm/predicates.md (call_insn_operand): New predicate.
 
3038
+       * config/arm/constraints.md ("Cs", "Ss"):  New constraints.
 
3039
+       * config/arm/arm.md (*call_insn, *call_value_insn): Match only
 
3040
+       if insn is not a tail call.
 
3041
+       (*sibcall_insn, *sibcall_value_insn): Adjust for tailcalling through
 
3042
+       registers.
 
3043
+       * config/arm/arm.h (enum reg_class): New caller save register class.
 
3044
+       (REG_CLASS_NAMES): Likewise.
 
3045
+       (REG_CLASS_CONTENTS): Likewise.
 
3046
+       * config/arm/arm.c (arm_function_ok_for_sibcall): Allow tailcalling
 
3047
+       without decls.
 
3048
+
 
3049
+2013-05-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
3050
+
 
3051
+       Backport from trunk r198680.
 
3052
+       2013-05-07  Sofiane Naci  <sofiane.naci@arm.com>
 
3053
+
 
3054
+       * config/aarch64/aarch64-simd.md (*aarch64_simd_mov<mode>): call splitter.
 
3055
+       (aarch64_simd_mov<mode>): New expander.
 
3056
+       (aarch64_simd_mov_to_<mode>low): New instruction pattern.
 
3057
+       (aarch64_simd_mov_to_<mode>high): Likewise.
 
3058
+       (aarch64_simd_mov_from_<mode>low): Likewise.
 
3059
+       (aarch64_simd_mov_from_<mode>high): Likewise.
 
3060
+       (aarch64_dup_lane<mode>): Update.
 
3061
+       (aarch64_dup_lanedi): New instruction pattern.
 
3062
+       * config/aarch64/aarch64-protos.h (aarch64_split_simd_move): New prototype.
 
3063
+       * config/aarch64/aarch64.c (aarch64_split_simd_move): New function.
 
3064
+
 
3065
+2013-05-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
3066
+
 
3067
+       Backport from trunk r198497-198500.
 
3068
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3069
+
 
3070
+       * config/aarch64/aarch64-builtins.c
 
3071
+       (aarch64_gimple_fold_builtin.c): Fold more modes for reduc_splus_.
 
3072
+       * config/aarch64/aarch64-simd-builtins.def
 
3073
+       (reduc_splus_): Add new modes.
 
3074
+       (reduc_uplus_): New.
 
3075
+       * config/aarch64/aarch64-simd.md (aarch64_addvv4sf): Remove.
 
3076
+       (reduc_uplus_v4sf): Likewise.
 
3077
+       (reduc_splus_v4sf): Likewise.
 
3078
+       (aarch64_addv<mode>): Likewise.
 
3079
+       (reduc_uplus_<mode>): Likewise.
 
3080
+       (reduc_splus_<mode>): Likewise.
 
3081
+       (aarch64_addvv2di): Likewise.
 
3082
+       (reduc_uplus_v2di): Likewise.
 
3083
+       (reduc_splus_v2di): Likewise.
 
3084
+       (aarch64_addvv2si): Likewise.
 
3085
+       (reduc_uplus_v2si): Likewise.
 
3086
+       (reduc_splus_v2si): Likewise.
 
3087
+       (reduc_<sur>plus_<mode>): New.
 
3088
+       (reduc_<sur>plus_v2di): Likewise.
 
3089
+       (reduc_<sur>plus_v2si): Likewise.
 
3090
+       (reduc_<sur>plus_v4sf): Likewise.
 
3091
+       (aarch64_addpv4sf): Likewise.
 
3092
+       * config/aarch64/arm_neon.h
 
3093
+       (vaddv<q>_<s,u,f><8, 16, 32, 64): Rewrite using builtins.
 
3094
+       * config/aarch64/iterators.md (unspec): Remove UNSPEC_ADDV,
 
3095
+       add UNSPEC_SADDV, UNSPEC_UADDV.
 
3096
+       (SUADDV): New.
 
3097
+       (sur): Add UNSPEC_SADDV, UNSPEC_UADDV.
 
3098
+
 
3099
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3100
+
 
3101
+       * config/aarch64/arm_neon.h
 
3102
+       (v<max,min><nm><q><v>_<sfu><8, 16, 32, 64>): Rewrite using builtins.
 
3103
+
 
3104
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3105
+
 
3106
+       * config/aarch64/aarch64-builtins
 
3107
+       (aarch64_gimple_fold_builtin): Fold reduc_<su><maxmin>_ builtins.
 
3108
+
 
3109
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3110
+
 
3111
+       * config/aarch64/aarch64-simd-builtins.def
 
3112
+       (reduc_smax_): New.
 
3113
+       (reduc_smin_): Likewise.
 
3114
+       (reduc_umax_): Likewise.
 
3115
+       (reduc_umin_): Likewise.
 
3116
+       (reduc_smax_nan_): Likewise.
 
3117
+       (reduc_smin_nan_): Likewise.
 
3118
+       (fmax): Remove.
 
3119
+       (fmin): Likewise.
 
3120
+       (smax): Update for V2SF, V4SF and V2DF modes.
 
3121
+       (smin): Likewise.
 
3122
+       (smax_nan): New.
 
3123
+       (smin_nan): Likewise.
 
3124
+       * config/aarch64/aarch64-simd.md (<maxmin><mode>3): Rename to...
 
3125
+       (<su><maxmin><mode>3): ...This, refactor.
 
3126
+       (s<maxmin><mode>3): New.
 
3127
+       (<maxmin_uns><mode>3): Likewise.
 
3128
+       (reduc_<maxmin_uns>_<mode>): Refactor.
 
3129
+       (reduc_<maxmin_uns>_v4sf): Likewise.
 
3130
+       (reduc_<maxmin_uns>_v2si): Likewise.
 
3131
+       (aarch64_<fmaxmin><mode>: Remove.
 
3132
+       * config/aarch64/arm_neon.h (vmax<q>_f<32,64>): Rewrite to use
 
3133
+       new builtin names.
 
3134
+       (vmin<q>_f<32,64>): Likewise.
 
3135
+       * config/iterators.md (unspec): Add UNSPEC_FMAXNMV, UNSPEC_FMINNMV.
 
3136
+       (FMAXMIN): New.
 
3137
+       (su): Add mappings for smax, smin, umax, umin.
 
3138
+       (maxmin): New.
 
3139
+       (FMAXMINV): Add UNSPEC_FMAXNMV, UNSPEC_FMINNMV.
 
3140
+       (FMAXMIN): Rename as...
 
3141
+       (FMAXMIN_UNS): ...This.
 
3142
+       (maxminv): Remove.
 
3143
+       (fmaxminv): Likewise.
 
3144
+       (fmaxmin): Likewise.
 
3145
+       (maxmin_uns): New.
 
3146
+       (maxmin_uns_op): Likewise.
 
3147
+
 
3148
+2013-05-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
3149
+
 
3150
+       Backport from trunk r199241.
 
3151
+       2013-05-23  James Greenhalgh  <james.greenhalgh@arm.com>
 
3152
+
 
3153
+       * config/aarch64/aarch64-simd.md
 
3154
+       (aarch64_cm<optab>di): Add clobber of CC_REGNUM to unsplit pattern.
 
3155
+
 
3156
+2013-05-23  Christophe Lyon  <christophe.lyon@linaro.org>
 
3157
+
 
3158
+       Backport from trunk r198970.
 
3159
+       2013-05-16  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3160
+
 
3161
+       * config/arm/arm-protos.h (gen_movmem_ldrd_strd): New declaration.
 
3162
+       * config/arm/arm.c (next_consecutive_mem): New function.
 
3163
+       (gen_movmem_ldrd_strd): Likewise.
 
3164
+       * config/arm/arm.md (movmemqi): Update condition and code.
 
3165
+       (unaligned_loaddi, unaligned_storedi): New patterns.
 
3166
+
 
3167
+2013-05-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3168
+
 
3169
+       * LINARO-VERSION: Bump version number.
 
3170
+
 
3171
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3172
+
 
3173
+       GCC Linaro 4.8-2013.05 released.
 
3174
+
 
3175
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3176
+
 
3177
+       Backport from trunk r198677.
 
3178
+       2013-05-07  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3179
+
 
3180
+       * config/aarch64/aarch64.md
 
3181
+       (cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>): Restrict the
 
3182
+       shift value between 0-4.
 
3183
+
 
3184
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3185
+
 
3186
+       Backport from trunk r198574-198575.
 
3187
+       2013-05-03  Vidya Praveen  <vidyapraveen@arm.com>
 
3188
+
 
3189
+       * config/aarch64/aarch64-simd.md (simd_fabd): Correct the description.
 
3190
+
 
3191
+       2013-05-03  Vidya Praveen  <vidyapraveen@arm.com>
 
3192
+
 
3193
+       * config/aarch64/aarch64-simd.md (*fabd_scalar<mode>3): Support
 
3194
+       scalar form of FABD instruction.
 
3195
+
 
3196
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3197
+
 
3198
+       Backport from trunk r198490-198496
 
3199
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3200
+
 
3201
+       * config/aarch64/arm_neon.h
 
3202
+       (vac<ge, gt><sd>_f<32, 64>): Rename to...
 
3203
+       (vca<ge, gt><sd>_f<32, 64>): ...this, reimpliment in C.
 
3204
+       (vca<ge, gt, lt, le><q>_f<32, 64>): Reimpliment in C.
 
3205
+
 
3206
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3207
+
 
3208
+       * config/aarch64/aarch64-simd.md (*aarch64_fac<optab><mode>): New.
 
3209
+       * config/aarch64/iterators.md (FAC_COMPARISONS): New.
 
3210
+
 
3211
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3212
+
 
3213
+       * config/aarch64/aarch64-simd.md
 
3214
+       (vcond<mode>_internal): Handle special cases for constant masks.
 
3215
+       (vcond<mode><mode>): Allow nonmemory_operands for outcome vectors.
 
3216
+       (vcondu<mode><mode>): Likewise.
 
3217
+       (vcond<v_cmp_result><mode>): New.
 
3218
+
 
3219
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3220
+
 
3221
+       * config/aarch64/aarch64-builtins.c (BUILTIN_VALLDI): Define.
 
3222
+       (aarch64_fold_builtin): Add folding for cm<eq,ge,gt,tst>.
 
3223
+       * config/aarch64/aarch64-simd-builtins.def
 
3224
+       (cmeq): Update to BUILTIN_VALLDI.
 
3225
+       (cmgt): Likewise.
 
3226
+       (cmge): Likewise.
 
3227
+       (cmle): Likewise.
 
3228
+       (cmlt): Likewise.
 
3229
+       * config/aarch64/arm_neon.h
 
3230
+       (vc<eq, lt, le, gt, ge, tst><z><qsd>_<fpsu><8,16,32,64>): Remap
 
3231
+       to builtins or C as appropriate.
 
3232
+
 
3233
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
3234
+
 
3235
+       * config/aarch64/aarch64-simd-builtins.def (cmhs): Rename to...
 
3236
+       (cmgeu): ...This.
 
3237
+       (cmhi): Rename to...
 
3238
+       (cmgtu): ...This.
 
3239
+       * config/aarch64/aarch64-simd.md
 
3240
+       (simd_mode): Add SF.
 
3241
+       (aarch64_vcond_internal): Use new names for unsigned comparison insns.
 
3242
+       (aarch64_cm<optab><mode>): Rewrite to not use UNSPECs.
 
3243
+       * config/aarch64/aarch64.md (*cstore<mode>_neg): Rename to...
 
3244
+       (cstore<mode>_neg): ...This.
 
3245
+       * config/aarch64/iterators.md
 
3246
+       (VALLF): new.
 
3247
+       (unspec): Remove UNSPEC_CM<EQ, LE, LT, GE, GT, HS, HI, TST>.
 
3248
+       (COMPARISONS): New.
 
3249
+       (UCOMPARISONS): Likewise.
 
3250
+       (optab): Add missing comparisons.
 
3251
+       (n_optab): New.
 
3252
+       (cmp_1): Likewise.
 
3253
+       (cmp_2): Likewise.
 
3254
+       (CMP): Likewise.
 
3255
+       (cmp): Remove.
 
3256
+       (VCMP_S): Likewise.
 
3257
+       (VCMP_U): Likewise.
 
3258
+       (V_cmp_result): Add DF, SF modes.
 
3259
+       (v_cmp_result): Likewise.
 
3260
+       (v): Likewise.
 
3261
+       (vmtype): Likewise.
 
3262
+       * config/aarch64/predicates.md (aarch64_reg_or_fp_zero): New.
 
3263
+
 
3264
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3265
+
 
3266
+       Backport from trunk r198191.
 
3267
+       2013-04-23  Sofiane Naci  <sofiane.naci@arm.com>
 
3268
+
 
3269
+       * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add simd attribute.
 
3270
+
 
3271
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@lianro.org>
 
3272
+
 
3273
+       Backport from trunk r197838.
 
3274
+       2013-04-11   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3275
+
 
3276
+       * config/aarch64/aarch64.c (aarch64_select_cc_mode): Allow NEG
 
3277
+       code in CC_NZ mode.
 
3278
+       * config/aarch64/aarch64.md (*neg_<shift><mode>3_compare0): New
 
3279
+       pattern.
 
3280
+
 
3281
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3282
+
 
3283
+       Backport from trunk r198019.
 
3284
+       2013-04-16   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3285
+
 
3286
+       * config/aarch64/aarch64.md (*adds_mul_imm_<mode>): New pattern.
 
3287
+       (*subs_mul_imm_<mode>): New pattern.
 
3288
+
 
3289
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3290
+
 
3291
+       Backport from trunk r198424-198425.
 
3292
+       2013-04-29  Ian Bolton  <ian.bolton@arm.com>
 
3293
+
 
3294
+       * config/aarch64/aarch64.md (movsi_aarch64): Support LDR/STR
 
3295
+       from/to S register.
 
3296
+       (movdi_aarch64): Support LDR/STR from/to D register.
 
3297
+
 
3298
+       2013-04-29  Ian Bolton  <ian.bolton@arm.com>
 
3299
+
 
3300
+       * common/config/aarch64/aarch64-common.c: Enable REE pass at O2
 
3301
+       or higher by default.
 
3302
+
 
3303
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3304
+
 
3305
+       Backport from trunk r198412.
 
3306
+       2013-04-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3307
+
 
3308
+       * config/arm/arm.md (store_minmaxsi): Use only when
 
3309
+       optimize_insn_for_size_p.
 
3310
+
 
3311
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3312
+
 
3313
+       Backport from trunk 198394,198396-198400,198402-198404.
 
3314
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3315
+
 
3316
+       * config/aarch64/arm_neon.h
 
3317
+       (vcvt<sd>_f<32,64>_s<32,64>): Rewrite in C.
 
3318
+       (vcvt<q>_f<32,64>_s<32,64>): Rewrite using builtins.
 
3319
+       (vcvt_<high_>_f<32,64>_f<32,64>): Likewise.
 
3320
+       (vcvt<qsd>_<su><32,64>_f<32,64>): Likewise.
 
3321
+       (vcvta<qsd>_<su><32,64>_f<32,64>): Likewise.
 
3322
+       (vcvtm<qsd>_<su><32,64>_f<32,64>): Likewise.
 
3323
+       (vcvtn<qsd>_<su><32,64>_f<32,64>): Likewise.
 
3324
+       (vcvtp<qsd>_<su><32,64>_f<32,64>): Likewise.
 
3325
+
 
3326
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3327
+
 
3328
+       * config/aarch64/aarch64-simd.md
 
3329
+       (<optab><VDQF:mode><fcvt_target>2): New, maps to fix, fixuns.
 
3330
+       (<fix_trunc_optab><VDQF:mode><fcvt_target>2): New, maps to
 
3331
+       fix_trunc, fixuns_trunc.
 
3332
+       (ftrunc<VDQF:mode>2): New.
 
3333
+       * config/aarch64/iterators.md (optab): Add fix, fixuns.
 
3334
+       (fix_trunc_optab): New.
 
3335
+
 
3336
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3337
+
 
3338
+       * config/aarch64/aarch64-builtins.c
 
3339
+       (aarch64_builtin_vectorized_function): Vectorize over ifloorf,
 
3340
+       iceilf, lround, iroundf.
 
3341
+
 
3342
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3343
+
 
3344
+       * config/aarch64/aarch64-simd-builtins.def (vec_unpacks_hi_): New.
 
3345
+       (float_truncate_hi_): Likewise.
 
3346
+       (float_extend_lo_): Likewise.
 
3347
+       (float_truncate_lo_): Likewise.
 
3348
+       * config/aarch64/aarch64-simd.md (vec_unpacks_lo_v4sf): New.
 
3349
+       (aarch64_float_extend_lo_v2df): Likewise.
 
3350
+       (vec_unpacks_hi_v4sf): Likewise.
 
3351
+       (aarch64_float_truncate_lo_v2sf): Likewise.
 
3352
+       (aarch64_float_truncate_hi_v4sf): Likewise.
 
3353
+       (vec_pack_trunc_v2df): Likewise.
 
3354
+       (vec_pack_trunc_df): Likewise.
 
3355
+
 
3356
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3357
+
 
3358
+       * config/aarch64/aarch64-builtins.c
 
3359
+       (aarch64_fold_builtin): Fold float conversions.
 
3360
+       * config/aarch64/aarch64-simd-builtins.def
 
3361
+       (floatv2si, floatv4si, floatv2di): New.
 
3362
+       (floatunsv2si, floatunsv4si, floatunsv2di): Likewise.
 
3363
+       * config/aarch64/aarch64-simd.md
 
3364
+       (<optab><fcvt_target><VDQF:mode>2): New, expands to float and floatuns.
 
3365
+       * config/aarch64/iterators.md (FLOATUORS): New.
 
3366
+       (optab): Add float, floatuns.
 
3367
+       (su_optab): Likewise.
 
3368
+
 
3369
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
3370
+
 
3371
+       * config/aarch64/aarch64-builtins.c
 
3372
+       (aarch64_builtin_vectorized_function): Fold to standard pattern names.
 
3373
+       * config/aarch64/aarch64-simd-builtins.def (frintn): New.
 
3374
+       (frintz): Rename to...
 
3375
+       (btrunc): ...this.
 
3376
+       (frintp): Rename to...
 
3377
+       (ceil): ...this.
 
3378
+       (frintm): Rename to...
 
3379
+       (floor): ...this.
 
3380
+       (frinti): Rename to...
 
3381
+       (nearbyint): ...this.
 
3382
+       (frintx): Rename to...
 
3383
+       (rint): ...this.
 
3384
+       (frinta): Rename to...
 
3385
+       (round): ...this.
 
3386
+       * config/aarch64/aarch64-simd.md
 
3387
+       (aarch64_frint<frint_suffix><mode>): Delete.
 
3388
+       (<frint_pattern><mode>2): Convert to insn.
 
3389
+       * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRINTN.
 
3390
+       * config/aarch64/iterators.md (FRINT): Add UNSPEC_FRINTN.
 
3391
+       (frint_pattern): Likewise.
 
3392
+       (frint_suffix): Likewise.
 
3393
+
 
3394
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3395
+
 
3396
+       Backport from trunk r198302-198306,198316.
 
3397
+       2013-04-25  James Greenhalgh  <james.greenhalgh@arm.com>
 
3398
+
 
3399
+       * config/aarch64/aarch64-simd.md
 
3400
+       (aarch64_simd_bsl<mode>_internal): Rewrite RTL to not use UNSPEC_BSL.
 
3401
+       (aarch64_simd_bsl<mode>): Likewise.
 
3402
+       * config/aarch64/iterators.md (unspec): Remove UNSPEC_BSL.
 
3403
+
 
3404
+       2013-04-25  James Greenhalgh  <jame.greenhalgh@arm.com>
 
3405
+
 
3406
+       * config/aarch64/aarch64-simd.md (neg<mode>2): Use VDQ iterator.
 
3407
+
 
3408
+       2013-04-25  James Greenhalgh  <james.greenhalgh@arm.com>
 
3409
+
 
3410
+       * config/aarch64/aarch64-builtins.c
 
3411
+       (aarch64_fold_builtin): New.
 
3412
+       * config/aarch64/aarch64-protos.h (aarch64_fold_builtin): New.
 
3413
+       * config/aarch64/aarch64.c (TARGET_FOLD_BUILTIN): Define.
 
3414
+       * config/aarch64/aarch64-simd-builtins.def (abs): New.
 
3415
+       * config/aarch64/arm_neon.h
 
3416
+       (vabs<q>_<f32, 64>): Implement using __builtin_aarch64_fabs.
 
3417
+
 
3418
+       2013-04-25  James Greenhalgh  <james.greenhalgh@arm.com>
 
3419
+           Tejas Belagod  <tejas.belagod@arm.com>
 
3420
+
 
3421
+       * config/aarch64/aarch64-builtins.c
 
3422
+       (aarch64_gimple_fold_builtin): New.
 
3423
+       * config/aarch64/aarch64-protos.h (aarch64_gimple_fold_builtin): New.
 
3424
+       * config/aarch64/aarch64-simd-builtins.def (addv): New.
 
3425
+       * config/aarch64/aarch64-simd.md (addpv4sf): New.
 
3426
+       (addvv4sf): Update.
 
3427
+       * config/aarch64/aarch64.c (TARGET_GIMPLE_FOLD_BUILTIN): Define.
 
3428
+
 
3429
+       2013-04-25  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3430
+
 
3431
+       * config/aarch64/aarch64.md 
 
3432
+       (*cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>): New pattern.
 
3433
+
 
3434
+       2013-04-25  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3435
+
 
3436
+       * config/aarch64/aarch64.md (*ngc<mode>): New pattern.
 
3437
+       (*ngcsi_uxtw): New pattern.
 
3438
+
 
3439
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3440
+
 
3441
+       Backport from trunk 198298.
 
3442
+       2013-04-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3443
+            Julian Brown  <julian@codesourcery.com>
 
3444
+
 
3445
+       * config/arm/arm.c (neon_builtin_type_mode): Add T_V4HF.
 
3446
+       (TB_DREG): Add T_V4HF.
 
3447
+       (v4hf_UP): New macro.
 
3448
+       (neon_itype): Add NEON_FLOAT_WIDEN, NEON_FLOAT_NARROW.
 
3449
+       (arm_init_neon_builtins): Handle NEON_FLOAT_WIDEN,
 
3450
+       NEON_FLOAT_NARROW.
 
3451
+       Handle initialisation of V4HF. Adjust initialisation of reinterpret
 
3452
+       built-ins.
 
3453
+       (arm_expand_neon_builtin): Handle NEON_FLOAT_WIDEN,
 
3454
+       NEON_FLOAT_NARROW.
 
3455
+       (arm_vector_mode_supported_p): Handle V4HF.
 
3456
+       (arm_mangle_map): Handle V4HFmode.
 
3457
+       * config/arm/arm.h (VALID_NEON_DREG_MODE): Add V4HF.
 
3458
+       * config/arm/arm_neon_builtins.def: Add entries for
 
3459
+       vcvtv4hfv4sf, vcvtv4sfv4hf.
 
3460
+       * config/arm/neon.md (neon_vcvtv4sfv4hf): New pattern.
 
3461
+       (neon_vcvtv4hfv4sf): Likewise.
 
3462
+       * config/arm/neon-gen.ml: Handle half-precision floating point
 
3463
+       features.
 
3464
+       * config/arm/neon-testgen.ml: Handle Requires_FP_bit feature.
 
3465
+       * config/arm/arm_neon.h: Regenerate.
 
3466
+       * config/arm/neon.ml (type elts): Add F16.
 
3467
+       (type vectype): Add T_float16x4, T_floatHF.
 
3468
+       (type vecmode): Add V4HF.
 
3469
+       (type features): Add Requires_FP_bit feature.
 
3470
+       (elt_width): Handle F16.
 
3471
+       (elt_class): Likewise.
 
3472
+       (elt_of_class_width): Likewise.
 
3473
+       (mode_of_elt): Refactor.
 
3474
+       (type_for_elt): Handle F16, fix error messages.
 
3475
+       (vectype_size): Handle T_float16x4.
 
3476
+       (vcvt_sh): New function.
 
3477
+       (ops): Add entries for vcvt_f16_f32, vcvt_f32_f16.
 
3478
+       (string_of_vectype): Handle T_floatHF, T_float16, T_float16x4.
 
3479
+       (string_of_mode): Handle V4HF.
 
3480
+       * doc/arm-neon-intrinsics.texi: Regenerate.
 
3481
+
 
3482
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3483
+
 
3484
+       Backport from trunk r198136-198137,198142,198176.
 
3485
+       2013-04-23  Andreas Schwab  <schwab@linux-m68k.org>
 
3486
+
 
3487
+       * coretypes.h (gimple_stmt_iterator): Add struct to make
 
3488
+       compatible with C.
 
3489
+
 
3490
+       2013-04-22  James Greenhalgh  <james.greenhalgh@arm.com>
 
3491
+
 
3492
+       * coretypes.h (gimple_stmt_iterator_d): Forward declare.
 
3493
+       (gimple_stmt_iterator): New typedef.
 
3494
+       * gimple.h (gimple_stmt_iterator): Rename to...
 
3495
+       (gimple_stmt_iterator_d): ... This.
 
3496
+       * doc/tm.texi.in (TARGET_FOLD_BUILTIN): Detail restriction that
 
3497
+       trees be valid for GIMPLE and GENERIC.
 
3498
+       (TARGET_GIMPLE_FOLD_BUILTIN): New.
 
3499
+       * gimple-fold.c (gimple_fold_call): Call target hook
 
3500
+       gimple_fold_builtin.
 
3501
+       * hooks.c (hook_bool_gsiptr_false): New.
 
3502
+       * hooks.h (hook_bool_gsiptr_false): New.
 
3503
+       * target.def (fold_stmt): New.
 
3504
+       * doc/tm.texi: Regenerate.
 
3505
+
 
3506
+       2013-04-22  James Greenhalgh  <james.greenhalgh@arm.com>
 
3507
+
 
3508
+       * config/aarch64/aarch64-builtins.c
 
3509
+       (CF): Remove.
 
3510
+       (CF0, CF1, CF2, CF3, CF4, CF10): New.
 
3511
+       (VAR<1-12>): Add MAP parameter.
 
3512
+       (BUILTIN_*): Likewise.
 
3513
+       * config/aarch64/aarch64-simd-builtins.def: Set MAP parameter.
 
3514
+       * config/aarch64/aarch64-simd.md (aarch64_sshl_n<mode>): Remove.
 
3515
+       (aarch64_ushl_n<mode>): Likewise.
 
3516
+       (aarch64_sshr_n<mode>): Likewise.
 
3517
+       (aarch64_ushr_n<mode>): Likewise.
 
3518
+       (aarch64_<maxmin><mode>): Likewise.
 
3519
+       (aarch64_sqrt<mode>): Likewise.
 
3520
+       * config/aarch64/arm_neon.h (vshl<q>_n_*): Use new builtin names.
 
3521
+       (vshr<q>_n_*): Likewise.
 
3522
+
 
3523
+       2013-04-22  James Greenhalgh  <james.greenhalgh@arm.com>
 
3524
+
 
3525
+       * config/aarch64/aarch64-builtins.c
 
3526
+       (aarch64_simd_builtin_type_mode): Handle SF types.
 
3527
+       (sf_UP): Define.
 
3528
+       (BUILTIN_GPF): Define.
 
3529
+       (aarch64_init_simd_builtins): Handle SF types.
 
3530
+       * config/aarch64/aarch64-simd-builtins.def (frecpe): Add support.
 
3531
+       (frecps): Likewise.
 
3532
+       (frecpx): Likewise.
 
3533
+       * config/aarch64/aarch64-simd.md
 
3534
+       (simd_types): Update simd_frcp<esx> to simd_frecp<esx>.
 
3535
+       (aarch64_frecpe<mode>): New.
 
3536
+       (aarch64_frecps<mode>): Likewise.
 
3537
+       * config/aarch64/aarch64.md (unspec): Add UNSPEC_FRECP<ESX>.
 
3538
+       (v8type): Add frecp<esx>.
 
3539
+       (aarch64_frecp<FRECP:frecp_suffix><mode>): New.
 
3540
+       (aarch64_frecps<mode>): Likewise.
 
3541
+       * config/aarch64/iterators.md (FRECP): New.
 
3542
+       (frecp_suffix): Likewise.
 
3543
+       * config/aarch64/arm_neon.h
 
3544
+       (vrecp<esx><qsd>_<fd><32, 64>): Convert to using builtins.
 
3545
+
 
3546
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3547
+
 
3548
+       Backport from trunk r198030.
 
3549
+       2013-04-17  Greta Yorsh  <Greta.Yorsh at arm.com>
 
3550
+
 
3551
+       * config/arm/arm.md (movsicc_insn): Convert define_insn into
 
3552
+       define_insn_and_split.
 
3553
+       (and_scc,ior_scc,negscc): Likewise.
 
3554
+       (cmpsi2_addneg, subsi3_compare): Convert to named patterns.
 
3555
+
 
3556
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3557
+
 
3558
+       Backport from trunk r198020.
 
3559
+       2013-04-16   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3560
+
 
3561
+       * config/aarch64/aarch64.md (*adds_<optab><mode>_multp2):
 
3562
+       New pattern.
 
3563
+       (*subs_<optab><mode>_multp2): New pattern.
 
3564
+       (*adds_<optab><ALLX:mode>_<GPI:mode>): New pattern.
 
3565
+       (*subs_<optab><ALLX:mode>_<GPI:mode>): New pattern.
 
3566
+
 
3567
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3568
+
 
3569
+       Backport from trunk r198004,198029.
 
3570
+       2013-04-17  Greta Yorsh  <Greta.Yorsh at arm.com>
 
3571
+
 
3572
+       * config/arm/arm.c (use_return_insn): Return 0 for targets that
 
3573
+       can benefit from using a sequence of LDRD instructions in epilogue
 
3574
+       instead of a single LDM instruction.
 
3575
+
 
3576
+       2013-04-16  Greta Yorsh  <Greta.Yorsh at arm.com>
 
3577
+
 
3578
+       * config/arm/arm.c (emit_multi_reg_push): New declaration
 
3579
+       for an existing function.
 
3580
+       (arm_emit_strd_push): New function.
 
3581
+       (arm_expand_prologue): Used here.
 
3582
+       (arm_emit_ldrd_pop): New function.
 
3583
+       (arm_expand_epilogue): Used here.
 
3584
+       (arm_get_frame_offsets): Update condition.
 
3585
+       (arm_emit_multi_reg_pop): Add a special case for load of a single
 
3586
+       register with writeback.
 
3587
+
 
3588
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3589
+
 
3590
+       Backport from trunk r197965.
 
3591
+       2013-04-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3592
+
 
3593
+       * config/arm/arm.c (const_ok_for_dimode_op): Handle AND case.
 
3594
+       * config/arm/arm.md (*anddi3_insn): Change to insn_and_split.
 
3595
+       * config/arm/constraints.md (De): New constraint.
 
3596
+       * config/arm/neon.md (anddi3_neon): Delete.
 
3597
+       (neon_vand<mode>): Expand to standard anddi3 pattern.
 
3598
+       * config/arm/predicates.md (imm_for_neon_inv_logic_operand):
 
3599
+       Move earlier in the file.
 
3600
+       (neon_inv_logic_op2): Likewise.
 
3601
+       (arm_anddi_operand_neon): New predicate.
 
3602
+
 
3603
+2013-05-02  Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
 
3604
+
 
3605
+       Backport from trunk r197925.
 
3606
+       2013-04-12  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3607
+
 
3608
+       * config/arm/arm.md (mov_scc,mov_negscc,mov_notscc): Convert
 
3609
+       define_insn into define_insn_and_split and emit movsicc patterns.
 
3610
+
 
3611
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3612
+
 
3613
+       Backport from trunk r197807.
 
3614
+       2013-04-11   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3615
+
 
3616
+       * config/aarch64/aarch64.h (REVERSIBLE_CC_MODE): Define.
 
3617
+
 
3618
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3619
+
 
3620
+       Backport from trunk r197642.
 
3621
+       2013-04-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3622
+
 
3623
+       * config/arm/arm.md (minmax_arithsi_non_canon): New pattern.
 
3624
+
 
3625
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3626
+
 
3627
+       Backport from trunk r197530,197921.
 
3628
+       2013-04-12  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3629
+
 
3630
+       * config/arm/arm.c (gen_operands_ldrd_strd): Initialize "base".
 
3631
+
 
3632
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3633
+
 
3634
+       * config/arm/constraints.md (q): New constraint.
 
3635
+       * config/arm/ldrdstrd.md: New file.
 
3636
+       * config/arm/arm.md (ldrdstrd.md) New include.
 
3637
+       (arm_movdi): Use "q" instead of "r" constraint
 
3638
+       for double-word memory access.
 
3639
+       (movdf_soft_insn): Likewise.
 
3640
+       * config/arm/vfp.md (movdi_vfp): Likewise.
 
3641
+       * config/arm/t-arm (MD_INCLUDES): Add ldrdstrd.md.
 
3642
+        * config/arm/arm-protos.h (gen_operands_ldrd_strd): New declaration.
 
3643
+       * config/arm/arm.c (gen_operands_ldrd_strd): New function.
 
3644
+       (mem_ok_for_ldrd_strd): Likewise.
 
3645
+       (output_move_double): Update assertion.
 
3646
+
 
3647
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3648
+
 
3649
+       Backport of trunk r197518-197522,197526-197528.
 
3650
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3651
+
 
3652
+       * config/arm/arm.md (arm_smax_insn): Convert define_insn into
 
3653
+       define_insn_and_split.
 
3654
+       (arm_smin_insn,arm_umaxsi3,arm_uminsi3): Likewise.
 
3655
+
 
3656
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3657
+
 
3658
+       * config/arm/arm.md (arm_ashldi3_1bit): Convert define_insn into
 
3659
+       define_insn_and_split.
 
3660
+        (arm_ashrdi3_1bit,arm_lshrdi3_1bit): Likewise.
 
3661
+       (shiftsi3_compare): New pattern.
 
3662
+       (rrx): New pattern.
 
3663
+       * config/arm/unspecs.md (UNSPEC_RRX): New.
 
3664
+
 
3665
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3666
+
 
3667
+       * config/arm/arm.md (negdi_extendsidi): New pattern.
 
3668
+       (negdi_zero_extendsidi): Likewise.
 
3669
+
 
3670
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3671
+
 
3672
+       * config/arm/arm.md (andsi_iorsi3_notsi): Convert define_insn into
 
3673
+       define_insn_and_split.
 
3674
+       (arm_negdi2,arm_abssi2,arm_neg_abssi2): Likewise.
 
3675
+       (arm_cmpdi_insn,arm_cmpdi_unsigned): Likewise.
 
3676
+
 
3677
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3678
+
 
3679
+       * config/arm/arm.md (arm_subdi3): Convert define_insn into
 
3680
+       define_insn_and_split.
 
3681
+       (subdi_di_zesidi,subdi_di_sesidi): Likewise.
 
3682
+       (subdi_zesidi_di,subdi_sesidi_di,subdi_zesidi_zesidi): Likewise.
 
3683
+
 
3684
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3685
+
 
3686
+       * config/arm/arm.md (subsi3_carryin): New pattern.
 
3687
+       (subsi3_carryin_const): Likewise.
 
3688
+       (subsi3_carryin_compare,subsi3_carryin_compare_const): Likewise.
 
3689
+       (subsi3_carryin_shift,rsbsi3_carryin_shift): Likewise.
 
3690
+
 
3691
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3692
+
 
3693
+       * config/arm/arm.md (incscc,arm_incscc,decscc,arm_decscc): Delete.
 
3694
+
 
3695
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
3696
+
 
3697
+       * config/arm/arm.md (addsi3_carryin_<optab>): Set attribute predicable.
 
3698
+       (addsi3_carryin_alt2_<optab>,addsi3_carryin_shift_<optab>): Likewise.
 
3699
+
 
3700
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3701
+
 
3702
+       Backport of trunk r197517.
 
3703
+       2013-04-05  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3704
+
 
3705
+       * config/arm/arm.c (arm_expand_builtin): Change fcode
 
3706
+       type to unsigned int.
 
3707
+
 
3708
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3709
+
 
3710
+       Backport of trunk r197513.
 
3711
+       2013-04-05  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
3712
+
 
3713
+       * doc/invoke.texi (ARM Options): Document cortex-a53 support.
 
3714
+
 
3715
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3716
+
 
3717
+       Backport of trunk r197489-197491.
 
3718
+       2013-04-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3719
+
 
3720
+       * config/arm/arm-protos.h (arm_builtin_vectorized_function):
 
3721
+       New function prototype.
 
3722
+       * config/arm/arm.c (TARGET_VECTORIZE_BUILTINS): Define.
 
3723
+       (TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION): Likewise.
 
3724
+       (arm_builtin_vectorized_function): New function.
 
3725
+
 
3726
+       2013-04-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3727
+
 
3728
+       * config/arm/arm_neon_builtins.def: New file.
 
3729
+       * config/arm/arm.c (neon_builtin_data): Move contents to
 
3730
+       arm_neon_builtins.def.
 
3731
+       (enum arm_builtins): Include neon builtin definitions.
 
3732
+       (ARM_BUILTIN_NEON_BASE): Move from enum to macro.
 
3733
+       * config/arm/t-arm (arm.o): Add dependency on
 
3734
+       arm_neon_builtins.def.
 
3735
+
 
3736
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3737
+
 
3738
+       Backport of trunk 196795-196797,196957
 
3739
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
3740
+
 
3741
+       * config/aarch64/aarch64.md (*sub<mode>3_carryin): New pattern.
 
3742
+       (*subsi3_carryin_uxtw): Likewise.
 
3743
+
 
3744
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
3745
+
 
3746
+       * config/aarch64/aarch64.md (*ror<mode>3_insn): New pattern.
 
3747
+       (*rorsi3_insn_uxtw): Likewise.
 
3748
+
 
3749
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
3750
+
 
3751
+       * config/aarch64/aarch64.md (*extr<mode>5_insn): New pattern.
 
3752
+       (*extrsi5_insn_uxtw): Likewise.
 
3753
+
 
3754
+2013-04-10  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3755
+
 
3756
+       * LINARO-VERSION: Bump version number.
 
3757
+
 
3758
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3759
+
 
3760
+       * GCC Linaro 4.8-2013.04 released.
 
3761
+       
 
3762
+       * LINARO-VERSION: New file.
 
3763
+       * configure.ac: Add Linaro version string.
 
3764
+       * configure: Regenerate.
 
3765
+
 
3766
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3767
+
 
3768
+       Backport of trunk r197346.
 
3769
+       2013-04-02  Ian Caulfield  <ian.caulfield@arm.com>
 
3770
+           Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
3771
+
 
3772
+       * config/arm/arm-arches.def (armv8-a): Default to cortex-a53.
 
3773
+       * config/arm/t-arm (MD_INCLUDES): Depend on cortex-a53.md.
 
3774
+       * config/arm/cortex-a53.md: New file.
 
3775
+       * config/arm/bpabi.h (BE8_LINK_SPEC): Handle cortex-a53.
 
3776
+       * config/arm/arm.md (generic_sched, generic_vfp): Handle cortex-a53.
 
3777
+       * config/arm/arm.c (arm_issue_rate): Likewise.
 
3778
+       * config/arm/arm-tune.md: Regenerate
 
3779
+       * config/arm/arm-tables.opt: Regenerate.
 
3780
+       * config/arm/arm-cores.def: Add cortex-a53.
 
3781
+
 
3782
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3783
+
 
3784
+       Backport of trunk r197342.
 
3785
+       2013-04-02  Sofiane Naci  <sofiane.naci@arm.com>
 
3786
+
 
3787
+       * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add variants for
 
3788
+       scalar load/store operations using B/H registers.
 
3789
+       (*zero_extend<SHORT:mode><GPI:mode>2_aarch64): Likewise.
 
3790
+
 
3791
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3792
+
 
3793
+       Backport of trunk r197341.
 
3794
+       2013-04-02  Sofiane Naci  <sofiane.naci@arm.com>
 
3795
+
 
3796
+       * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add alternatives for
 
3797
+       scalar move.
 
3798
+       * config/aarch64/aarch64.c
 
3799
+       (aarch64_simd_scalar_immediate_valid_for_move): New.
 
3800
+       * config/aarch64/aarch64-protos.h
 
3801
+       (aarch64_simd_scalar_immediate_valid_for_move): New.
 
3802
+       * config/aarch64/constraints.md (Dh, Dq): New.
 
3803
+       * config/aarch64/iterators.md (hq): New.
 
3804
+
 
3805
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3806
+
 
3807
+       Backport from trunk r197207.
 
3808
+       2013-03-28   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3809
+
 
3810
+       * config/aarch64/aarch64.md (*and<mode>3_compare0): New pattern.
 
3811
+       (*andsi3_compare0_uxtw): New pattern.
 
3812
+       (*and_<SHIFT:optab><mode>3_compare0): New pattern.
 
3813
+       (*and_<SHIFT:optab>si3_compare0_uxtw): New pattern.
 
3814
+
 
3815
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3816
+
 
3817
+       Backport from trunk r197153.
 
3818
+       2013-03-27  Terry Guo  <terry.guo@arm.com>
 
3819
+
 
3820
+       * config/arm/arm-cores.def: Added core cortex-r7.
 
3821
+       * config/arm/arm-tune.md: Regenerated.
 
3822
+       * config/arm/arm-tables.opt: Regenerated.
 
3823
+       * doc/invoke.texi: Added entry for core cortex-r7.
 
3824
+
 
3825
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3826
+
 
3827
+       Backport from trunk r197052.
 
3828
+       2013-03-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3829
+
 
3830
+       * config/arm/arm.md (f_sels, f_seld): New types.
 
3831
+       (*cmov<mode>): New pattern.
 
3832
+       * config/arm/predicates.md (arm_vsel_comparison_operator): New
 
3833
+       predicate.
 
3834
+
 
3835
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3836
+
 
3837
+       Backport from trunk r197046.
 
3838
+       2013-03-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
3839
+
 
3840
+       * config/arm/arm.c (arm_emit_load_exclusive): Add acq parameter.
 
3841
+       Emit load-acquire versions when acq is true.
 
3842
+       (arm_emit_store_exclusive): Add rel parameter.
 
3843
+       Emit store-release versions when rel is true.
 
3844
+       (arm_split_compare_and_swap): Use acquire-release instructions
 
3845
+       instead.
 
3846
+       of barriers when appropriate.
 
3847
+       (arm_split_atomic_op): Likewise.
 
3848
+       * config/arm/arm.h (TARGET_HAVE_LDACQ): New macro.
 
3849
+       * config/arm/unspecs.md (VUNSPEC_LAX): New unspec.
 
3850
+       (VUNSPEC_SLX): Likewise.
 
3851
+       (VUNSPEC_LDA): Likewise.
 
3852
+       (VUNSPEC_STL): Likewise.
 
3853
+       * config/arm/sync.md (atomic_load<mode>): New pattern.
 
3854
+       (atomic_store<mode>): Likewise.
 
3855
+       (arm_load_acquire_exclusive<mode>): Likewise.
 
3856
+       (arm_load_acquire_exclusivesi): Likewise.
 
3857
+       (arm_load_acquire_exclusivedi): Likewise.
 
3858
+       (arm_store_release_exclusive<mode>): Likewise.
 
3859
+
 
3860
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3861
+
 
3862
+       Backport from trunk r196876.
 
3863
+       2013-03-21  Christophe Lyon  <christophe.lyon@linaro.org>
 
3864
+
 
3865
+       * config/arm/arm-protos.h (tune_params): Add
 
3866
+       prefer_neon_for_64bits field.
 
3867
+       * config/arm/arm.c (prefer_neon_for_64bits): New variable.
 
3868
+       (arm_slowmul_tune): Default prefer_neon_for_64bits to false.
 
3869
+       (arm_fastmul_tune, arm_strongarm_tune, arm_xscale_tune): Ditto.
 
3870
+       (arm_9e_tune, arm_v6t2_tune, arm_cortex_tune): Ditto.
 
3871
+       (arm_cortex_a15_tune, arm_cortex_a5_tune): Ditto.
 
3872
+       (arm_cortex_a9_tune, arm_v6m_tune, arm_fa726te_tune): Ditto.
 
3873
+       (arm_option_override): Handle -mneon-for-64bits new option.
 
3874
+       * config/arm/arm.h (TARGET_PREFER_NEON_64BITS): New macro.
 
3875
+       (prefer_neon_for_64bits): Declare new variable.
 
3876
+       * config/arm/arm.md (arch): Rename neon_onlya8 and neon_nota8 to
 
3877
+       avoid_neon_for_64bits and neon_for_64bits. Remove onlya8 and
 
3878
+       nota8.
 
3879
+       (arch_enabled): Handle new arch types. Remove support for onlya8
 
3880
+       and nota8.
 
3881
+       (one_cmpldi2): Use new arch names.
 
3882
+       * config/arm/arm.opt (mneon-for-64bits): Add option.
 
3883
+       * config/arm/neon.md (adddi3_neon, subdi3_neon, iordi3_neon)
 
3884
+       (anddi3_neon, xordi3_neon, ashldi3_neon, <shift>di3_neon): Use
 
3885
+       neon_for_64bits instead of nota8 and avoid_neon_for_64bits instead
 
3886
+       of onlya8.
 
3887
+       * doc/invoke.texi (-mneon-for-64bits): Document.
 
3888
+
 
3889
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3890
+
 
3891
+       Backport from trunk r196858.
 
3892
+       2013-03-21   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3893
+
 
3894
+       * config/aarch64/aarch64-simd.md (simd_fabd): New Attribute.
 
3895
+       (abd<mode>_3): New pattern.
 
3896
+       (aba<mode>_3): New pattern.
 
3897
+       (fabd<mode>_3): New pattern.
 
3898
+
 
3899
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
3900
+
 
3901
+       Backport from trunk r196856.
 
3902
+       2013-03-21   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
3903
+
 
3904
+       * config/aarch64/aarch64-elf.h (REGISTER_PREFIX): Remove.
 
3905
+       * config/aarch64/aarch64.c (aarch64_print_operand): Remove all
 
3906
+       occurrence of REGISTER_PREFIX as its empty string.
 
3907
--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-floorf.c
 
3908
+++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-floorf.c
 
3909
@@ -0,0 +1,18 @@
 
3910
+/* { dg-do compile } */
 
3911
+/* { dg-require-effective-target arm_v8_neon_ok } */
 
3912
+/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */
 
3913
+/* { dg-add-options arm_v8_neon } */
 
3914
+
 
3915
+#define N 32
 
3916
+
 
3917
+void
 
3918
+foo (float *output, float *input)
 
3919
+{
 
3920
+  int i = 0;
 
3921
+  /* Vectorizable.  */
 
3922
+  for (i = 0; i < N; i++)
 
3923
+    output[i] = __builtin_floorf (input[i]);
 
3924
+}
 
3925
+
 
3926
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_floorf } } } */
 
3927
+/* { dg-final { cleanup-tree-dump "vect" } } */
 
3928
--- a/src/gcc/testsuite/gcc.target/arm/neon/vcvtf32_f16.c
 
3929
+++ b/src/gcc/testsuite/gcc.target/arm/neon/vcvtf32_f16.c
 
3930
@@ -0,0 +1,20 @@
 
3931
+/* Test the `vcvtf32_f16' ARM Neon intrinsic.  */
 
3932
+/* This file was autogenerated by neon-testgen.  */
 
3933
+
 
3934
+/* { dg-do assemble } */
 
3935
+/* { dg-require-effective-target arm_neon_fp16_ok } */
 
3936
+/* { dg-options "-save-temps -O0" } */
 
3937
+/* { dg-add-options arm_neon_fp16 } */
 
3938
+
 
3939
+#include "arm_neon.h"
 
3940
+
 
3941
+void test_vcvtf32_f16 (void)
 
3942
+{
 
3943
+  float32x4_t out_float32x4_t;
 
3944
+  float16x4_t arg0_float16x4_t;
 
3945
+
 
3946
+  out_float32x4_t = vcvt_f32_f16 (arg0_float16x4_t);
 
3947
+}
 
3948
+
 
3949
+/* { dg-final { scan-assembler "vcvt\.f32.f16\[        \]+\[qQ\]\[0-9\]+, \[dD\]\[0-9\]+!?\(\[         \]+@\[a-zA-Z0-9 \]+\)?\n" } } */
 
3950
+/* { dg-final { cleanup-saved-temps } } */
 
3951
--- a/src/gcc/testsuite/gcc.target/arm/neon/vcvtf16_f32.c
 
3952
+++ b/src/gcc/testsuite/gcc.target/arm/neon/vcvtf16_f32.c
 
3953
@@ -0,0 +1,20 @@
 
3954
+/* Test the `vcvtf16_f32' ARM Neon intrinsic.  */
 
3955
+/* This file was autogenerated by neon-testgen.  */
 
3956
+
 
3957
+/* { dg-do assemble } */
 
3958
+/* { dg-require-effective-target arm_neon_fp16_ok } */
 
3959
+/* { dg-options "-save-temps -O0" } */
 
3960
+/* { dg-add-options arm_neon_fp16 } */
 
3961
+
 
3962
+#include "arm_neon.h"
 
3963
+
 
3964
+void test_vcvtf16_f32 (void)
 
3965
+{
 
3966
+  float16x4_t out_float16x4_t;
 
3967
+  float32x4_t arg0_float32x4_t;
 
3968
+
 
3969
+  out_float16x4_t = vcvt_f16_f32 (arg0_float32x4_t);
 
3970
+}
 
3971
+
 
3972
+/* { dg-final { scan-assembler "vcvt\.f16.f32\[        \]+\[dD\]\[0-9\]+, \[qQ\]\[0-9\]+!?\(\[         \]+@\[a-zA-Z0-9 \]+\)?\n" } } */
 
3973
+/* { dg-final { cleanup-saved-temps } } */
 
3974
--- a/src/gcc/testsuite/gcc.target/arm/anddi3-opt.c
 
3975
+++ b/src/gcc/testsuite/gcc.target/arm/anddi3-opt.c
 
3976
@@ -0,0 +1,11 @@
 
3977
+/* { dg-do compile } */
 
3978
+/* { dg-options "-O1" } */
 
3979
+
 
3980
+unsigned long long
 
3981
+muld (unsigned long long X, unsigned long long Y)
 
3982
+{
 
3983
+  unsigned long long mask = 0xffffffffull;
 
3984
+  return (X & mask) * (Y & mask);
 
3985
+}
 
3986
+
 
3987
+/* { dg-final { scan-assembler-not "and\[\\t \]+.+,\[\\t \]*.+,\[\\t \]*.+" } } */
 
3988
--- a/src/gcc/testsuite/gcc.target/arm/peep-ldrd-1.c
 
3989
+++ b/src/gcc/testsuite/gcc.target/arm/peep-ldrd-1.c
 
3990
@@ -0,0 +1,11 @@
 
3991
+/* { dg-do compile } */
 
3992
+/* { dg-require-effective-target arm_prefer_ldrd_strd } */
 
3993
+/* { dg-options "-O2" }  */
 
3994
+int foo(int a, int b, int* p, int *q)
 
3995
+{
 
3996
+  a = p[2] + p[3];
 
3997
+  *q = a;
 
3998
+  *p = a;
 
3999
+  return a;
 
4000
+}
 
4001
+/* { dg-final { scan-assembler "ldrd" } } */
 
4002
--- a/src/gcc/testsuite/gcc.target/arm/vselgtdf.c
 
4003
+++ b/src/gcc/testsuite/gcc.target/arm/vselgtdf.c
 
4004
@@ -0,0 +1,13 @@
 
4005
+/* { dg-do compile } */
 
4006
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4007
+/* { dg-options "-O2" } */
 
4008
+/* { dg-add-options arm_v8_vfp } */
 
4009
+
 
4010
+double
 
4011
+foo (double x, double y)
 
4012
+{
 
4013
+  volatile int i = 0;
 
4014
+  return i > 0 ? x : y;
 
4015
+}
 
4016
+
 
4017
+/* { dg-final { scan-assembler-times "vselgt.f64\td\[0-9\]+" 1 } } */
 
4018
--- a/src/gcc/testsuite/gcc.target/arm/iordi3-opt.c
 
4019
+++ b/src/gcc/testsuite/gcc.target/arm/iordi3-opt.c
 
4020
@@ -0,0 +1,9 @@
 
4021
+/* { dg-do compile } */
 
4022
+/* { dg-options "-O1" } */
 
4023
+
 
4024
+unsigned long long or64 (unsigned long long input)
 
4025
+{
 
4026
+    return input | 0x200000004ULL;
 
4027
+}
 
4028
+
 
4029
+/* { dg-final { scan-assembler-not "mov\[\\t \]+.+,\[\\t \]*.+" } } */
 
4030
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-relaxed.c
 
4031
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-relaxed.c
 
4032
@@ -0,0 +1,10 @@
 
4033
+/* { dg-do compile } */
 
4034
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4035
+/* { dg-options "-O2" } */
 
4036
+/* { dg-add-options arm_arch_v8a } */
 
4037
+
 
4038
+#include "../aarch64/atomic-op-relaxed.x"
 
4039
+
 
4040
+/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4041
+/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4042
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4043
--- a/src/gcc/testsuite/gcc.target/arm/vselgesf.c
 
4044
+++ b/src/gcc/testsuite/gcc.target/arm/vselgesf.c
 
4045
@@ -0,0 +1,13 @@
 
4046
+/* { dg-do compile } */
 
4047
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4048
+/* { dg-options "-O2" } */
 
4049
+/* { dg-add-options arm_v8_vfp } */
 
4050
+
 
4051
+float
 
4052
+foo (float x, float y)
 
4053
+{
 
4054
+  volatile int i = 0;
 
4055
+  return i >= 0 ? x : y;
 
4056
+}
 
4057
+
 
4058
+/* { dg-final { scan-assembler-times "vselge.f32\ts\[0-9\]+" 1 } } */
 
4059
--- a/src/gcc/testsuite/gcc.target/arm/peep-strd-1.c
 
4060
+++ b/src/gcc/testsuite/gcc.target/arm/peep-strd-1.c
 
4061
@@ -0,0 +1,9 @@
 
4062
+/* { dg-do compile } */
 
4063
+/* { dg-require-effective-target arm_prefer_ldrd_strd } */
 
4064
+/* { dg-options "-O2" }  */
 
4065
+void foo(int a, int b, int* p)
 
4066
+{
 
4067
+  p[2] = a;
 
4068
+  p[3] = b;
 
4069
+}
 
4070
+/* { dg-final { scan-assembler "strd" } } */
 
4071
--- a/src/gcc/testsuite/gcc.target/arm/negdi-1.c
 
4072
+++ b/src/gcc/testsuite/gcc.target/arm/negdi-1.c
 
4073
@@ -0,0 +1,17 @@
 
4074
+/* { dg-do compile } */
 
4075
+/* { dg-require-effective-target arm32 } */
 
4076
+/* { dg-options "-O2" } */
 
4077
+
 
4078
+signed long long extendsidi_negsi (signed int x)
 
4079
+{
 
4080
+  return -x;
 
4081
+}
 
4082
+
 
4083
+/*
 
4084
+Expected output:
 
4085
+       rsb     r0, r0, #0
 
4086
+       mov     r1, r0, asr #31
 
4087
+*/
 
4088
+/* { dg-final { scan-assembler-times "rsb" 1 { target { arm_nothumb } } } } */
 
4089
+/* { dg-final { scan-assembler-times "negs\\t" 1 { target { ! { arm_nothumb } } } } } */
 
4090
+/* { dg-final { scan-assembler-times "asr" 1 } } */
 
4091
--- a/src/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c
 
4092
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire.c
 
4093
@@ -0,0 +1,10 @@
 
4094
+/* { dg-do compile } */
 
4095
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4096
+/* { dg-options "-O2" } */
 
4097
+/* { dg-add-options arm_arch_v8a } */
 
4098
+
 
4099
+#include "../aarch64/atomic-comp-swap-release-acquire.x"
 
4100
+
 
4101
+/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 4 } } */
 
4102
+/* { dg-final { scan-assembler-times "stlex" 4 } } */
 
4103
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4104
--- a/src/gcc/testsuite/gcc.target/arm/pr19599.c
 
4105
+++ b/src/gcc/testsuite/gcc.target/arm/pr19599.c
 
4106
@@ -0,0 +1,10 @@
 
4107
+/* { dg-skip-if "need at least armv5te" { *-*-* } { "-march=armv[234]*" "-mthumb" } { "" } } */
 
4108
+/* { dg-options "-O2 -march=armv5te -marm" }  */
 
4109
+/* { dg-final { scan-assembler "bx" } } */
 
4110
+
 
4111
+int (*indirect_func)();
 
4112
+
 
4113
+int indirect_call()
 
4114
+{
 
4115
+  return indirect_func();
 
4116
+}
 
4117
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst.c
 
4118
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst.c
 
4119
@@ -0,0 +1,10 @@
 
4120
+/* { dg-do compile } */
 
4121
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4122
+/* { dg-options "-O2" } */
 
4123
+/* { dg-add-options arm_arch_v8a } */
 
4124
+
 
4125
+#include "../aarch64/atomic-op-seq_cst.x"
 
4126
+
 
4127
+/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4128
+/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4129
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4130
--- a/src/gcc/testsuite/gcc.target/arm/vselgedf.c
 
4131
+++ b/src/gcc/testsuite/gcc.target/arm/vselgedf.c
 
4132
@@ -0,0 +1,13 @@
 
4133
+/* { dg-do compile } */
 
4134
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4135
+/* { dg-options "-O2" } */
 
4136
+/* { dg-add-options arm_v8_vfp } */
 
4137
+
 
4138
+double
 
4139
+foo (double x, double y)
 
4140
+{
 
4141
+  volatile int i = 0;
 
4142
+  return i >= 0 ? x : y;
 
4143
+}
 
4144
+
 
4145
+/* { dg-final { scan-assembler-times "vselge.f64\td\[0-9\]+" 1 } } */
 
4146
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-consume.c
 
4147
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-consume.c
 
4148
@@ -0,0 +1,10 @@
 
4149
+/* { dg-do compile } */
 
4150
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4151
+/* { dg-options "-O2" } */
 
4152
+/* { dg-add-options arm_arch_v8a } */
 
4153
+
 
4154
+#include "../aarch64/atomic-op-consume.x"
 
4155
+
 
4156
+/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4157
+/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4158
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4159
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-char.c
 
4160
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-char.c
 
4161
@@ -0,0 +1,10 @@
 
4162
+/* { dg-do compile } */
 
4163
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4164
+/* { dg-options "-O2" } */
 
4165
+/* { dg-add-options arm_arch_v8a } */
 
4166
+
 
4167
+#include "../aarch64/atomic-op-char.x"
 
4168
+
 
4169
+/* { dg-final { scan-assembler-times "ldrexb\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4170
+/* { dg-final { scan-assembler-times "strexb\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4171
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4172
--- a/src/gcc/testsuite/gcc.target/arm/vselnesf.c
 
4173
+++ b/src/gcc/testsuite/gcc.target/arm/vselnesf.c
 
4174
@@ -0,0 +1,13 @@
 
4175
+/* { dg-do compile } */
 
4176
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4177
+/* { dg-options "-O2" } */
 
4178
+/* { dg-add-options arm_v8_vfp } */
 
4179
+
 
4180
+float
 
4181
+foo (float x, float y)
 
4182
+{
 
4183
+  volatile int i = 0;
 
4184
+  return i != 0 ? x : y;
 
4185
+}
 
4186
+
 
4187
+/* { dg-final { scan-assembler-times "vseleq.f32\ts\[0-9\]+" 1 } } */
 
4188
--- a/src/gcc/testsuite/gcc.target/arm/negdi-2.c
 
4189
+++ b/src/gcc/testsuite/gcc.target/arm/negdi-2.c
 
4190
@@ -0,0 +1,16 @@
 
4191
+/* { dg-do compile } */
 
4192
+/* { dg-require-effective-target arm32 } */
 
4193
+/* { dg-options "-O2" } */
 
4194
+
 
4195
+signed long long zero_extendsidi_negsi (unsigned int x)
 
4196
+{
 
4197
+  return -x;
 
4198
+}
 
4199
+/*
 
4200
+Expected output:
 
4201
+       rsb     r0, r0, #0
 
4202
+       mov     r1, #0
 
4203
+*/
 
4204
+/* { dg-final { scan-assembler-times "rsb\\tr0, r0, #0" 1 { target { arm_nothumb } } } } */
 
4205
+/* { dg-final { scan-assembler-times "negs\\tr0, r0" 1 { target { ! arm_nothumb } } } } */
 
4206
+/* { dg-final { scan-assembler-times "mov" 1 } } */
 
4207
--- a/src/gcc/testsuite/gcc.target/arm/vselvcsf.c
 
4208
+++ b/src/gcc/testsuite/gcc.target/arm/vselvcsf.c
 
4209
@@ -0,0 +1,12 @@
 
4210
+/* { dg-do compile } */
 
4211
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4212
+/* { dg-options "-O2" } */
 
4213
+/* { dg-add-options arm_v8_vfp } */
 
4214
+
 
4215
+float
 
4216
+foo (float x, float y)
 
4217
+{
 
4218
+  return !__builtin_isunordered (x, y) ? x : y;
 
4219
+}
 
4220
+
 
4221
+/* { dg-final { scan-assembler-times "vselvs.f32\ts\[0-9\]+" 1 } } */
 
4222
--- a/src/gcc/testsuite/gcc.target/arm/minmax_minus.c
 
4223
+++ b/src/gcc/testsuite/gcc.target/arm/minmax_minus.c
 
4224
@@ -0,0 +1,11 @@
 
4225
+/* { dg-do compile } */
 
4226
+/* { dg-options "-O2" } */
 
4227
+
 
4228
+#define MAX(a, b) (a > b ? a : b)
 
4229
+int
 
4230
+foo (int a, int b, int c)
 
4231
+{
 
4232
+  return c - MAX (a, b);
 
4233
+}
 
4234
+
 
4235
+/* { dg-final { scan-assembler-not "mov" } } */
 
4236
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-release.c
 
4237
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-release.c
 
4238
@@ -0,0 +1,10 @@
 
4239
+/* { dg-do compile } */
 
4240
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4241
+/* { dg-options "-O2" } */
 
4242
+/* { dg-add-options arm_arch_v8a } */
 
4243
+
 
4244
+#include "../aarch64/atomic-op-release.x"
 
4245
+
 
4246
+/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4247
+/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4248
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4249
--- a/src/gcc/testsuite/gcc.target/arm/vselvssf.c
 
4250
+++ b/src/gcc/testsuite/gcc.target/arm/vselvssf.c
 
4251
@@ -0,0 +1,12 @@
 
4252
+/* { dg-do compile } */
 
4253
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4254
+/* { dg-options "-O2" } */
 
4255
+/* { dg-add-options arm_v8_vfp } */
 
4256
+
 
4257
+float
 
4258
+foo (float x, float y)
 
4259
+{
 
4260
+  return __builtin_isunordered (x, y) ? x : y;
 
4261
+}
 
4262
+
 
4263
+/* { dg-final { scan-assembler-times "vselvs.f32\ts\[0-9\]+" 1 } } */
 
4264
--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-roundf.c
 
4265
+++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-roundf.c
 
4266
@@ -0,0 +1,18 @@
 
4267
+/* { dg-do compile } */
 
4268
+/* { dg-require-effective-target arm_v8_neon_ok } */
 
4269
+/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */
 
4270
+/* { dg-add-options arm_v8_neon } */
 
4271
+
 
4272
+#define N 32
 
4273
+
 
4274
+void
 
4275
+foo (float *output, float *input)
 
4276
+{
 
4277
+  int i = 0;
 
4278
+  /* Vectorizable.  */
 
4279
+  for (i = 0; i < N; i++)
 
4280
+    output[i] = __builtin_roundf (input[i]);
 
4281
+}
 
4282
+
 
4283
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_roundf } } } */
 
4284
+/* { dg-final { cleanup-tree-dump "vect" } } */
 
4285
--- a/src/gcc/testsuite/gcc.target/arm/neon-for-64bits-1.c
 
4286
+++ b/src/gcc/testsuite/gcc.target/arm/neon-for-64bits-1.c
 
4287
@@ -0,0 +1,54 @@
 
4288
+/* Check that Neon is *not* used by default to handle 64-bits scalar
 
4289
+   operations.  */
 
4290
+
 
4291
+/* { dg-do compile } */
 
4292
+/* { dg-require-effective-target arm_neon_ok } */
 
4293
+/* { dg-options "-O2" } */
 
4294
+/* { dg-add-options arm_neon } */
 
4295
+
 
4296
+typedef long long i64;
 
4297
+typedef unsigned long long u64;
 
4298
+typedef unsigned int u32;
 
4299
+typedef int i32;
 
4300
+
 
4301
+/* Unary operators */
 
4302
+#define UNARY_OP(name, op) \
 
4303
+  void unary_##name(u64 *a, u64 *b) { *a = op (*b + 0x1234567812345678ULL) ; }
 
4304
+
 
4305
+/* Binary operators */
 
4306
+#define BINARY_OP(name, op) \
 
4307
+  void binary_##name(u64 *a, u64 *b, u64 *c) { *a = *b op *c ; }
 
4308
+
 
4309
+/* Unsigned shift */
 
4310
+#define SHIFT_U(name, op, amount) \
 
4311
+  void ushift_##name(u64 *a, u64 *b, int c) { *a = *b op amount; }
 
4312
+
 
4313
+/* Signed shift */
 
4314
+#define SHIFT_S(name, op, amount) \
 
4315
+  void sshift_##name(i64 *a, i64 *b, int c) { *a = *b op amount; }
 
4316
+
 
4317
+UNARY_OP(not, ~)
 
4318
+
 
4319
+BINARY_OP(add, +)
 
4320
+BINARY_OP(sub, -)
 
4321
+BINARY_OP(and, &)
 
4322
+BINARY_OP(or, |)
 
4323
+BINARY_OP(xor, ^)
 
4324
+
 
4325
+SHIFT_U(right1, >>, 1)
 
4326
+SHIFT_U(right2, >>, 2)
 
4327
+SHIFT_U(right5, >>, 5)
 
4328
+SHIFT_U(rightn, >>, c)
 
4329
+
 
4330
+SHIFT_S(right1, >>, 1)
 
4331
+SHIFT_S(right2, >>, 2)
 
4332
+SHIFT_S(right5, >>, 5)
 
4333
+SHIFT_S(rightn, >>, c)
 
4334
+
 
4335
+/* { dg-final {scan-assembler-times "vmvn" 0} }  */
 
4336
+/* { dg-final {scan-assembler-times "vadd" 0} }  */
 
4337
+/* { dg-final {scan-assembler-times "vsub" 0} }  */
 
4338
+/* { dg-final {scan-assembler-times "vand" 0} }  */
 
4339
+/* { dg-final {scan-assembler-times "vorr" 0} }  */
 
4340
+/* { dg-final {scan-assembler-times "veor" 0} }  */
 
4341
+/* { dg-final {scan-assembler-times "vshr" 0} }  */
 
4342
--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-2.c
 
4343
+++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-2.c
 
4344
@@ -4,7 +4,7 @@
 
4345
 
 
4346
 #include <string.h>
 
4347
 
 
4348
-char dest[16];
 
4349
+char dest[16] = { 0 };
 
4350
 
 
4351
 void aligned_dest (char *src)
 
4352
 {
 
4353
@@ -14,7 +14,10 @@
 
4354
 /* Expect a multi-word store for the main part of the copy, but subword
 
4355
    loads/stores for the remainder.  */
 
4356
 
 
4357
-/* { dg-final { scan-assembler-times "stmia" 1 } } */
 
4358
+/* { dg-final { scan-assembler-times "ldmia" 0 } } */
 
4359
+/* { dg-final { scan-assembler-times "ldrd" 0 } } */
 
4360
+/* { dg-final { scan-assembler-times "stmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4361
+/* { dg-final { scan-assembler-times "strd" 1 { target { arm_prefer_ldrd_strd } } } } */
 
4362
 /* { dg-final { scan-assembler-times "ldrh" 1 } } */
 
4363
 /* { dg-final { scan-assembler-times "strh" 1 } } */
 
4364
 /* { dg-final { scan-assembler-times "ldrb" 1 } } */
 
4365
--- a/src/gcc/testsuite/gcc.target/arm/xordi3-opt.c
 
4366
+++ b/src/gcc/testsuite/gcc.target/arm/xordi3-opt.c
 
4367
@@ -0,0 +1,9 @@
 
4368
+/* { dg-do compile } */
 
4369
+/* { dg-options "-O1" } */
 
4370
+
 
4371
+unsigned long long xor64 (unsigned long long input)
 
4372
+{
 
4373
+    return input ^ 0x200000004ULL;
 
4374
+}
 
4375
+
 
4376
+/* { dg-final { scan-assembler-not "mov\[\\t \]+.+,\[\\t \]*.+" } } */
 
4377
--- a/src/gcc/testsuite/gcc.target/arm/negdi-3.c
 
4378
+++ b/src/gcc/testsuite/gcc.target/arm/negdi-3.c
 
4379
@@ -0,0 +1,17 @@
 
4380
+/* { dg-do compile } */
 
4381
+/* { dg-require-effective-target arm32 } */
 
4382
+/* { dg-options "-O2" } */
 
4383
+
 
4384
+signed long long negdi_zero_extendsidi (unsigned int x)
 
4385
+{
 
4386
+  return -((signed long long) x);
 
4387
+}
 
4388
+/*
 
4389
+Expected output:
 
4390
+        rsbs    r0, r0, #0
 
4391
+        sbc     r1, r1, r1
 
4392
+*/
 
4393
+/* { dg-final { scan-assembler-times "rsb" 1 } } */
 
4394
+/* { dg-final { scan-assembler-times "sbc" 1 } } */
 
4395
+/* { dg-final { scan-assembler-times "mov" 0 } } */
 
4396
+/* { dg-final { scan-assembler-times "rsc" 0 } } */
 
4397
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel.c
 
4398
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel.c
 
4399
@@ -0,0 +1,10 @@
 
4400
+/* { dg-do compile } */
 
4401
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4402
+/* { dg-options "-O2" } */
 
4403
+/* { dg-add-options arm_arch_v8a } */
 
4404
+
 
4405
+#include "../aarch64/atomic-op-acq_rel.x"
 
4406
+
 
4407
+/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4408
+/* { dg-final { scan-assembler-times "stlex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4409
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4410
--- a/src/gcc/testsuite/gcc.target/arm/vselltsf.c
 
4411
+++ b/src/gcc/testsuite/gcc.target/arm/vselltsf.c
 
4412
@@ -0,0 +1,13 @@
 
4413
+/* { dg-do compile } */
 
4414
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4415
+/* { dg-options "-O2" } */
 
4416
+/* { dg-add-options arm_v8_vfp } */
 
4417
+
 
4418
+float
 
4419
+foo (float x, float y)
 
4420
+{
 
4421
+  volatile int i = 0;
 
4422
+  return i < 0 ? x : y;
 
4423
+}
 
4424
+
 
4425
+/* { dg-final { scan-assembler-times "vselge.f32\ts\[0-9\]+" 1 } } */
 
4426
--- a/src/gcc/testsuite/gcc.target/arm/vselnedf.c
 
4427
+++ b/src/gcc/testsuite/gcc.target/arm/vselnedf.c
 
4428
@@ -0,0 +1,13 @@
 
4429
+/* { dg-do compile } */
 
4430
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4431
+/* { dg-options "-O2" } */
 
4432
+/* { dg-add-options arm_v8_vfp } */
 
4433
+
 
4434
+double
 
4435
+foo (double x, double y)
 
4436
+{
 
4437
+  volatile int i = 0;
 
4438
+  return i != 0 ? x : y;
 
4439
+}
 
4440
+
 
4441
+/* { dg-final { scan-assembler-times "vseleq.f64\td\[0-9\]+" 1 } } */
 
4442
--- a/src/gcc/testsuite/gcc.target/arm/vselvcdf.c
 
4443
+++ b/src/gcc/testsuite/gcc.target/arm/vselvcdf.c
 
4444
@@ -0,0 +1,12 @@
 
4445
+/* { dg-do compile } */
 
4446
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4447
+/* { dg-options "-O2" } */
 
4448
+/* { dg-add-options arm_v8_vfp } */
 
4449
+
 
4450
+double
 
4451
+foo (double x, double y)
 
4452
+{
 
4453
+  return !__builtin_isunordered (x, y) ? x : y;
 
4454
+}
 
4455
+
 
4456
+/* { dg-final { scan-assembler-times "vselvs.f64\td\[0-9\]+" 1 } } */
 
4457
--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-btruncf.c
 
4458
+++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-btruncf.c
 
4459
@@ -0,0 +1,18 @@
 
4460
+/* { dg-do compile } */
 
4461
+/* { dg-require-effective-target arm_v8_neon_ok } */
 
4462
+/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */
 
4463
+/* { dg-add-options arm_v8_neon } */
 
4464
+
 
4465
+#define N 32
 
4466
+
 
4467
+void
 
4468
+foo (float *output, float *input)
 
4469
+{
 
4470
+  int i = 0;
 
4471
+  /* Vectorizable.  */
 
4472
+  for (i = 0; i < N; i++)
 
4473
+    output[i] = __builtin_truncf (input[i]);
 
4474
+}
 
4475
+
 
4476
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_btruncf } } } */
 
4477
+/* { dg-final { cleanup-tree-dump "vect" } } */
 
4478
--- a/src/gcc/testsuite/gcc.target/arm/vseleqsf.c
 
4479
+++ b/src/gcc/testsuite/gcc.target/arm/vseleqsf.c
 
4480
@@ -0,0 +1,13 @@
 
4481
+/* { dg-do compile } */
 
4482
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4483
+/* { dg-options "-O2" } */
 
4484
+/* { dg-add-options arm_v8_vfp } */
 
4485
+
 
4486
+float
 
4487
+foo (float x, float y)
 
4488
+{
 
4489
+  volatile int i = 0;
 
4490
+  return i == 0 ? x : y;
 
4491
+}
 
4492
+
 
4493
+/* { dg-final { scan-assembler-times "vseleq.f32\ts\[0-9\]+" 1 } } */
 
4494
--- a/src/gcc/testsuite/gcc.target/arm/ivopts-orig_biv-inc.c
 
4495
+++ b/src/gcc/testsuite/gcc.target/arm/ivopts-orig_biv-inc.c
 
4496
@@ -0,0 +1,19 @@
 
4497
+/* { dg-do compile } */
 
4498
+/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
 
4499
+/* { dg-skip-if "" { arm_thumb1 } } */
 
4500
+
 
4501
+extern char *__ctype_ptr__;
 
4502
+
 
4503
+unsigned char * foo(unsigned char *ReadPtr)
 
4504
+{
 
4505
+
 
4506
+ unsigned char c;
 
4507
+
 
4508
+ while (!(((__ctype_ptr__+sizeof(""[*ReadPtr]))[(int)(*ReadPtr)])&04) == (!(0)))
 
4509
+  ReadPtr++;
 
4510
+
 
4511
+ return ReadPtr;
 
4512
+}
 
4513
+
 
4514
+/* { dg-final { scan-tree-dump-times "original biv" 2 "ivopts"} } */
 
4515
+/* { dg-final { cleanup-tree-dump "ivopts" } } */
 
4516
--- a/src/gcc/testsuite/gcc.target/arm/vselvsdf.c
 
4517
+++ b/src/gcc/testsuite/gcc.target/arm/vselvsdf.c
 
4518
@@ -0,0 +1,12 @@
 
4519
+/* { dg-do compile } */
 
4520
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4521
+/* { dg-options "-O2" } */
 
4522
+/* { dg-add-options arm_v8_vfp } */
 
4523
+
 
4524
+double
 
4525
+foo (double x, double y)
 
4526
+{
 
4527
+  return __builtin_isunordered (x, y) ? x : y;
 
4528
+}
 
4529
+
 
4530
+/* { dg-final { scan-assembler-times "vselvs.f64\td\[0-9\]+" 1 } } */
 
4531
--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-3.c
 
4532
+++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-3.c
 
4533
@@ -4,7 +4,7 @@
 
4534
 
 
4535
 #include <string.h>
 
4536
 
 
4537
-char src[16];
 
4538
+char src[16] = {0};
 
4539
 
 
4540
 void aligned_src (char *dest)
 
4541
 {
 
4542
@@ -14,8 +14,11 @@
 
4543
 /* Expect a multi-word load for the main part of the copy, but subword
 
4544
    loads/stores for the remainder.  */
 
4545
 
 
4546
-/* { dg-final { scan-assembler-times "ldmia" 1 } } */
 
4547
-/* { dg-final { scan-assembler-times "ldrh" 1 } } */
 
4548
+/* { dg-final { scan-assembler-times "ldmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4549
+/* { dg-final { scan-assembler-times "ldrd" 1 { target { arm_prefer_ldrd_strd } } } } */
 
4550
+/* { dg-final { scan-assembler-times "strd" 0 } } */
 
4551
+/* { dg-final { scan-assembler-times "stm" 0 } } */
 
4552
+/* { dg-final { scan-assembler-times "ldrh" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4553
 /* { dg-final { scan-assembler-times "strh" 1 } } */
 
4554
-/* { dg-final { scan-assembler-times "ldrb" 1 } } */
 
4555
+/* { dg-final { scan-assembler-times "ldrb" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4556
 /* { dg-final { scan-assembler-times "strb" 1 } } */
 
4557
--- a/src/gcc/testsuite/gcc.target/arm/pr46975-2.c
 
4558
+++ b/src/gcc/testsuite/gcc.target/arm/pr46975-2.c
 
4559
@@ -0,0 +1,10 @@
 
4560
+/* { dg-options "-mthumb -O2" } */
 
4561
+/* { dg-require-effective-target arm_thumb2_ok } */
 
4562
+/* { dg-final { scan-assembler "sub" } } */
 
4563
+/* { dg-final { scan-assembler "clz" } } */
 
4564
+/* { dg-final { scan-assembler "lsr.*#5" } } */
 
4565
+
 
4566
+int foo (int s)
 
4567
+{
 
4568
+      return s == 1;
 
4569
+}
 
4570
--- a/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c
 
4571
+++ b/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c
 
4572
@@ -0,0 +1,9 @@
 
4573
+/* { dg-do compile } */
 
4574
+/* { dg-options "-O1" } */
 
4575
+
 
4576
+long long muld(long long X, long long Y)
 
4577
+{
 
4578
+  return X & ~1;
 
4579
+}
 
4580
+
 
4581
+/* { dg-final { scan-assembler-not "and\[\\t \]+.+,\[\\t \]*.+,\[\\t \]*.+" } } */
 
4582
--- a/src/gcc/testsuite/gcc.target/arm/negdi-4.c
 
4583
+++ b/src/gcc/testsuite/gcc.target/arm/negdi-4.c
 
4584
@@ -0,0 +1,16 @@
 
4585
+/* { dg-do compile } */
 
4586
+/* { dg-require-effective-target arm32 } */
 
4587
+/* { dg-options "-O2" } */
 
4588
+
 
4589
+signed long long negdi_extendsidi (signed int x)
 
4590
+{
 
4591
+  return -((signed long long) x);
 
4592
+}
 
4593
+/*
 
4594
+Expected output:
 
4595
+        rsbs    r0, r0, #0
 
4596
+        mov     r1, r0, asr #31
 
4597
+*/
 
4598
+/* { dg-final { scan-assembler-times "rsb" 1 } } */
 
4599
+/* { dg-final { scan-assembler-times "asr" 1 } } */
 
4600
+/* { dg-final { scan-assembler-times "rsc" 0 } } */
 
4601
--- a/src/gcc/testsuite/gcc.target/arm/vselltdf.c
 
4602
+++ b/src/gcc/testsuite/gcc.target/arm/vselltdf.c
 
4603
@@ -0,0 +1,13 @@
 
4604
+/* { dg-do compile } */
 
4605
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4606
+/* { dg-options "-O2" } */
 
4607
+/* { dg-add-options arm_v8_vfp } */
 
4608
+
 
4609
+double
 
4610
+foo (double x, double y)
 
4611
+{
 
4612
+  volatile int i = 0;
 
4613
+  return i < 0 ? x : y;
 
4614
+}
 
4615
+
 
4616
+/* { dg-final { scan-assembler-times "vselge.f64\td\[0-9\]+" 1 } } */
 
4617
--- a/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-4.c
 
4618
+++ b/src/gcc/testsuite/gcc.target/arm/unaligned-memcpy-4.c
 
4619
@@ -4,8 +4,8 @@
 
4620
 
 
4621
 #include <string.h>
 
4622
 
 
4623
-char src[16];
 
4624
-char dest[16];
 
4625
+char src[16] = { 0 };
 
4626
+char dest[16] = { 0 };
 
4627
 
 
4628
 void aligned_both (void)
 
4629
 {
 
4630
@@ -14,5 +14,9 @@
 
4631
 
 
4632
 /* We know both src and dest to be aligned: expect multiword loads/stores.  */
 
4633
 
 
4634
-/* { dg-final { scan-assembler-times "ldmia" 1 } } */
 
4635
-/* { dg-final { scan-assembler-times "stmia" 1 } } */
 
4636
+/* { dg-final { scan-assembler-times "ldmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4637
+/* { dg-final { scan-assembler-times "stmia" 1 { target { ! { arm_prefer_ldrd_strd } } } } } */
 
4638
+/* { dg-final { scan-assembler "ldrd" { target { arm_prefer_ldrd_strd } } } } */
 
4639
+/* { dg-final { scan-assembler-times "ldm" 0 { target { arm_prefer_ldrd_strd } } } } */
 
4640
+/* { dg-final { scan-assembler "strd" { target { arm_prefer_ldrd_strd } } } } */
 
4641
+/* { dg-final { scan-assembler-times "stm" 0 { target { arm_prefer_ldrd_strd } } } } */
 
4642
--- a/src/gcc/testsuite/gcc.target/arm/vseleqdf.c
 
4643
+++ b/src/gcc/testsuite/gcc.target/arm/vseleqdf.c
 
4644
@@ -0,0 +1,13 @@
 
4645
+/* { dg-do compile } */
 
4646
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4647
+/* { dg-options "-O2" } */
 
4648
+/* { dg-add-options arm_v8_vfp } */
 
4649
+
 
4650
+double
 
4651
+foo (double x, double y)
 
4652
+{
 
4653
+  volatile int i = 0;
 
4654
+  return i == 0 ? x : y;
 
4655
+}
 
4656
+
 
4657
+/* { dg-final { scan-assembler-times "vseleq.f64\td\[0-9\]+" 1 } } */
 
4658
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-acquire.c
 
4659
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-acquire.c
 
4660
@@ -0,0 +1,10 @@
 
4661
+/* { dg-do compile } */
 
4662
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4663
+/* { dg-options "-O2" } */
 
4664
+/* { dg-add-options arm_arch_v8a } */
 
4665
+
 
4666
+#include "../aarch64/atomic-op-acquire.x"
 
4667
+
 
4668
+/* { dg-final { scan-assembler-times "ldaex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4669
+/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4670
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4671
--- a/src/gcc/testsuite/gcc.target/arm/vsellesf.c
 
4672
+++ b/src/gcc/testsuite/gcc.target/arm/vsellesf.c
 
4673
@@ -0,0 +1,13 @@
 
4674
+/* { dg-do compile } */
 
4675
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4676
+/* { dg-options "-O2" } */
 
4677
+/* { dg-add-options arm_v8_vfp } */
 
4678
+
 
4679
+float
 
4680
+foo (float x, float y)
 
4681
+{
 
4682
+  volatile int i = 0;
 
4683
+  return i <= 0 ? x : y;
 
4684
+}
 
4685
+
 
4686
+/* { dg-final { scan-assembler-times "vselgt.f32\ts\[0-9\]+" 1 } } */
 
4687
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-int.c
 
4688
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-int.c
 
4689
@@ -0,0 +1,10 @@
 
4690
+/* { dg-do compile } */
 
4691
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4692
+/* { dg-options "-O2" } */
 
4693
+/* { dg-add-options arm_arch_v8a } */
 
4694
+
 
4695
+#include "../aarch64/atomic-op-int.x"
 
4696
+
 
4697
+/* { dg-final { scan-assembler-times "ldrex\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4698
+/* { dg-final { scan-assembler-times "strex\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4699
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4700
--- a/src/gcc/testsuite/gcc.target/arm/atomic-op-short.c
 
4701
+++ b/src/gcc/testsuite/gcc.target/arm/atomic-op-short.c
 
4702
@@ -0,0 +1,10 @@
 
4703
+/* { dg-do compile } */
 
4704
+/* { dg-require-effective-target arm_arch_v8a_ok } */
 
4705
+/* { dg-options "-O2" } */
 
4706
+/* { dg-add-options arm_arch_v8a } */
 
4707
+
 
4708
+#include "../aarch64/atomic-op-short.x"
 
4709
+
 
4710
+/* { dg-final { scan-assembler-times "ldrexh\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4711
+/* { dg-final { scan-assembler-times "strexh\t...?, r\[0-9\]+, \\\[r\[0-9\]+\\\]" 6 } } */
 
4712
+/* { dg-final { scan-assembler-not "dmb" } } */
 
4713
--- a/src/gcc/testsuite/gcc.target/arm/pr40887.c
 
4714
+++ b/src/gcc/testsuite/gcc.target/arm/pr40887.c
 
4715
@@ -2,9 +2,9 @@
 
4716
 /* { dg-options "-O2 -march=armv5te" }  */
 
4717
 /* { dg-final { scan-assembler "blx" } } */
 
4718
 
 
4719
-int (*indirect_func)();
 
4720
+int (*indirect_func)(int x);
 
4721
 
 
4722
 int indirect_call()
 
4723
 {
 
4724
-    return indirect_func();
 
4725
+  return indirect_func(20) + indirect_func (40);
 
4726
 }
 
4727
--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c
 
4728
+++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c
 
4729
@@ -0,0 +1,18 @@
 
4730
+/* { dg-do compile } */
 
4731
+/* { dg-require-effective-target arm_v8_neon_ok } */
 
4732
+/* { dg-options "-O2 -ffast-math -ftree-vectorize" } */
 
4733
+/* { dg-add-options arm_v8_neon } */
 
4734
+
 
4735
+#define N 32
 
4736
+
 
4737
+void
 
4738
+foo (float *output, float *input)
 
4739
+{
 
4740
+  int i = 0;
 
4741
+  /* Vectorizable.  */
 
4742
+  for (i = 0; i < N; i++)
 
4743
+    output[i] = __builtin_ceilf (input[i]);
 
4744
+}
 
4745
+
 
4746
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_call_ceilf } } } */
 
4747
+/* { dg-final { cleanup-tree-dump "vect" } } */
 
4748
--- a/src/gcc/testsuite/gcc.target/arm/vselledf.c
 
4749
+++ b/src/gcc/testsuite/gcc.target/arm/vselledf.c
 
4750
@@ -0,0 +1,13 @@
 
4751
+/* { dg-do compile } */
 
4752
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4753
+/* { dg-options "-O2" } */
 
4754
+/* { dg-add-options arm_v8_vfp } */
 
4755
+
 
4756
+double
 
4757
+foo (double x, double y)
 
4758
+{
 
4759
+  volatile int i = 0;
 
4760
+  return i <= 0 ? x : y;
 
4761
+}
 
4762
+
 
4763
+/* { dg-final { scan-assembler-times "vselgt.f64\td\[0-9\]+" 1 } } */
 
4764
--- a/src/gcc/testsuite/gcc.target/arm/vselgtsf.c
 
4765
+++ b/src/gcc/testsuite/gcc.target/arm/vselgtsf.c
 
4766
@@ -0,0 +1,13 @@
 
4767
+/* { dg-do compile } */
 
4768
+/* { dg-require-effective-target arm_v8_vfp_ok } */
 
4769
+/* { dg-options "-O2" } */
 
4770
+/* { dg-add-options arm_v8_vfp } */
 
4771
+
 
4772
+float
 
4773
+foo (float x, float y)
 
4774
+{
 
4775
+  volatile int i = 0;
 
4776
+  return i > 0 ? x : y;
 
4777
+}
 
4778
+
 
4779
+/* { dg-final { scan-assembler-times "vselgt.f32\ts\[0-9\]+" 1 } } */
 
4780
--- a/src/gcc/testsuite/gcc.target/arm/pr58578.c
 
4781
+++ b/src/gcc/testsuite/gcc.target/arm/pr58578.c
 
4782
@@ -0,0 +1,54 @@
 
4783
+
 
4784
+/* PR target/58578 */
 
4785
+/* { dg-do run } */
 
4786
+/* { dg-options "-O1" } */
 
4787
+
 
4788
+#include <stdlib.h>
 
4789
+
 
4790
+typedef struct {
 
4791
+    long _prec;
 
4792
+    int _flag;
 
4793
+    long _exp;
 
4794
+} __my_st_t;
 
4795
+
 
4796
+typedef __my_st_t *__my_st_ptr;
 
4797
+
 
4798
+int
 
4799
+_test_fn (__my_st_ptr y, const __my_st_ptr xt)
 
4800
+{
 
4801
+  int inexact;
 
4802
+  if (xt->_exp != -2147483647L)
 
4803
+    {
 
4804
+      (y->_flag = xt->_flag);
 
4805
+    }
 
4806
+
 
4807
+  do {
 
4808
+      __my_st_ptr _y = y;
 
4809
+      long _err1 = -2 * xt->_exp;
 
4810
+      long _err2 = 2;
 
4811
+      if (0 < _err1)
 
4812
+       {
 
4813
+         unsigned long _err = (unsigned long) _err1 + _err2;
 
4814
+         if (__builtin_expect(!!(_err > _y->_prec + 1), 0))
 
4815
+           return 2;
 
4816
+         return 3;
 
4817
+       }
 
4818
+  } while (0);
 
4819
+
 
4820
+  return 0;
 
4821
+}
 
4822
+
 
4823
+int main ()
 
4824
+{
 
4825
+  __my_st_t x, y;
 
4826
+  long pz;
 
4827
+  int inex;
 
4828
+
 
4829
+  x._prec = 914;
 
4830
+  y._exp = 18;
 
4831
+  if (_test_fn (&x, &y))
 
4832
+    {
 
4833
+      abort();
 
4834
+    }
 
4835
+  return 0;
 
4836
+}
 
4837
--- a/src/gcc/testsuite/gcc.target/arm/pr57637.c
 
4838
+++ b/src/gcc/testsuite/gcc.target/arm/pr57637.c
 
4839
@@ -0,0 +1,206 @@
 
4840
+/* { dg-do run } */
 
4841
+/* { dg-options "-O2 -fno-inline" } */
 
4842
+
 
4843
+typedef struct _GtkCssStyleProperty GtkCssStyleProperty;
 
4844
+
 
4845
+struct _GtkCssStyleProperty
 
4846
+{
 
4847
+  int *initial_value;
 
4848
+  unsigned int id;
 
4849
+  unsigned int inherit :1;
 
4850
+  unsigned int animated :1;
 
4851
+  unsigned int affects_size :1;
 
4852
+  unsigned int affects_font :1;
 
4853
+
 
4854
+  int * parse_value;
 
4855
+  int * query_value;
 
4856
+  int * assign_value;
 
4857
+};
 
4858
+
 
4859
+void
 
4860
+g_assertion_message_expr (const char *domain,
 
4861
+                         const char *file,
 
4862
+                         int line,
 
4863
+                         const char *func,
 
4864
+                         const char *expr) __attribute__((__noreturn__));
 
4865
+
 
4866
+void
 
4867
+g_assertion_message_expr (const char *domain,
 
4868
+                         const char *file,
 
4869
+                         int line,
 
4870
+                         const char *func,
 
4871
+                         const char *expr)
 
4872
+{
 
4873
+  __builtin_abort ();
 
4874
+}
 
4875
+int
 
4876
+get_id (GtkCssStyleProperty *property)
 
4877
+{
 
4878
+  return 1;
 
4879
+}
 
4880
+int
 
4881
+_gtk_css_style_property_get_type ()
 
4882
+{
 
4883
+  return 1;
 
4884
+}
 
4885
+
 
4886
+GtkCssStyleProperty *
 
4887
+g_object_new (int object_type,
 
4888
+            const char *first_property_name,
 
4889
+            ...)
 
4890
+{
 
4891
+  return (GtkCssStyleProperty *) __builtin_malloc (sizeof (GtkCssStyleProperty));
 
4892
+}
 
4893
+
 
4894
+typedef enum {
 
4895
+  INHERIT = (1 << 0),
 
4896
+  ANIMATED = (1 << 1),
 
4897
+  RESIZE = (1 << 2),
 
4898
+  FONT = (1 << 3)
 
4899
+} GtkStylePropertyFlags;
 
4900
+
 
4901
+int t = 0;
 
4902
+void
 
4903
+gtk_css_style_property_register (const char * name,
 
4904
+                                int expected_id,
 
4905
+                                int value_type,
 
4906
+                                int flags,
 
4907
+                                int *parse_value,
 
4908
+                                int *query_value,
 
4909
+                                int *assign_value,
 
4910
+                                int *initial_value)
 
4911
+{
 
4912
+  GtkCssStyleProperty *node;
 
4913
+
 
4914
+  do
 
4915
+    {
 
4916
+      if (__builtin_expect (__extension__ (
 
4917
+                                          {
 
4918
+                                            int _g_boolean_var_;
 
4919
+                                            if (initial_value != ((void *)0))
 
4920
+                                              _g_boolean_var_ = 1;
 
4921
+                                            else
 
4922
+                                              _g_boolean_var_ = 0;
 
4923
+                                            _g_boolean_var_;
 
4924
+                                          }),
 
4925
+                           1))
 
4926
+       ;
 
4927
+      else
 
4928
+        g_assertion_message_expr ("Gtk",
 
4929
+                                 "gtkcssstylepropertyimpl.c",
 
4930
+                                 85,
 
4931
+                                 ((const char*) (__PRETTY_FUNCTION__)),
 
4932
+                                 "initial_value != NULL");
 
4933
+    } while (0);
 
4934
+
 
4935
+  do
 
4936
+    {
 
4937
+      if (__builtin_expect (__extension__ (
 
4938
+                                          {
 
4939
+                                            int _g_boolean_var_;
 
4940
+                                            if (parse_value != ((void *)0))
 
4941
+                                              _g_boolean_var_ = 1;
 
4942
+                                            else
 
4943
+                                              _g_boolean_var_ = 0;
 
4944
+                                            _g_boolean_var_;
 
4945
+                                          }),
 
4946
+                           1))
 
4947
+       ;
 
4948
+      else
 
4949
+       g_assertion_message_expr ("Gtk",
 
4950
+                                 "gtkcssstylepropertyimpl.c",
 
4951
+                                 86,
 
4952
+                                 ((const char*) (__PRETTY_FUNCTION__)),
 
4953
+                                 "parse_value != NULL");
 
4954
+    } while (0);
 
4955
+
 
4956
+  do
 
4957
+    {
 
4958
+      if (__builtin_expect (__extension__ (
 
4959
+                                          {
 
4960
+                                            int _g_boolean_var_;
 
4961
+                                            if (value_type == ((int) ((1) << (2)))
 
4962
+                                                || query_value != ((void *)0))
 
4963
+                                              _g_boolean_var_ = 1;
 
4964
+                                            else
 
4965
+                                              _g_boolean_var_ = 0;
 
4966
+                                            _g_boolean_var_;
 
4967
+                                          }),
 
4968
+                           1))
 
4969
+       ;
 
4970
+      else
 
4971
+       g_assertion_message_expr ("Gtk",
 
4972
+                                 "gtkcssstylepropertyimpl.c",
 
4973
+                                 87, ((const char*) (__PRETTY_FUNCTION__)),
 
4974
+                                 "value_type == NONE || query_value != NULL");
 
4975
+    } while (0);
 
4976
+
 
4977
+  /* FLAGS is changed in a cond_exec instruction with pr57637.  */
 
4978
+  if (flags  == 15)
 
4979
+    t = 15;
 
4980
+
 
4981
+  do
 
4982
+    {
 
4983
+      if (__builtin_expect (__extension__ (
 
4984
+                                          {
 
4985
+                                            int _g_boolean_var_;
 
4986
+                                            if (value_type == ((1) << (2))
 
4987
+                                                || assign_value != ((void *)0))
 
4988
+                                              _g_boolean_var_ = 1;
 
4989
+                                            else
 
4990
+                                              _g_boolean_var_ = 0;
 
4991
+                                            _g_boolean_var_;
 
4992
+                                          }),
 
4993
+                           1))
 
4994
+       ;
 
4995
+      else
 
4996
+       g_assertion_message_expr ("Gtk",
 
4997
+                                 "gtkcssstylepropertyimpl.c",
 
4998
+                                 88, ((const char*) (__PRETTY_FUNCTION__)),
 
4999
+                                 "value_type == NONE || assign_value != NULL");
 
5000
+    } while (0);
 
5001
+
 
5002
+  node = g_object_new ((_gtk_css_style_property_get_type ()),
 
5003
+                       "value-type", value_type,
 
5004
+                       "affects-size", (flags & RESIZE) ? (0) : (!(0)),
 
5005
+                       "affects-font", (flags & FONT) ? (!(0)) : (0),
 
5006
+                       "animated", (flags & ANIMATED) ? (!(0)) : (0),
 
5007
+                       "inherit", (flags & INHERIT) ? (!(0)) : (0),
 
5008
+                       "initial-value", initial_value,
 
5009
+                       "name", name,
 
5010
+                       ((void *)0));
 
5011
+
 
5012
+  node->parse_value = parse_value;
 
5013
+  node->query_value = query_value;
 
5014
+  node->assign_value = assign_value;
 
5015
+
 
5016
+  do
 
5017
+    {
 
5018
+      if (__builtin_expect (__extension__ (
 
5019
+                                          {
 
5020
+                                            int _g_boolean_var_;
 
5021
+                                            if (get_id (node) == expected_id)
 
5022
+                                              _g_boolean_var_ = 1;
 
5023
+                                            else
 
5024
+                                              _g_boolean_var_ = 0;
 
5025
+                                            _g_boolean_var_;
 
5026
+                                          }),
 
5027
+                           1))
 
5028
+       ;
 
5029
+      else
 
5030
+       g_assertion_message_expr ("Gtk",
 
5031
+                                 "gtkcssstylepropertyimpl.c",
 
5032
+                                 106,
 
5033
+                                 ((const char*) (__PRETTY_FUNCTION__)),
 
5034
+                                 "get_id (node) == expected_id");
 
5035
+    } while (0);
 
5036
+}
 
5037
+
 
5038
+int main ()
 
5039
+{
 
5040
+  gtk_css_style_property_register ("test", 1, 4, 15, &t, &t, &t, &t);
 
5041
+
 
5042
+  if (t != 15)
 
5043
+    __builtin_abort ();
 
5044
+  return 0;
 
5045
+}
 
5046
--- a/src/gcc/testsuite/gcc.target/aarch64/insv_2.c
 
5047
+++ b/src/gcc/testsuite/gcc.target/aarch64/insv_2.c
 
5048
@@ -0,0 +1,85 @@
 
5049
+/* { dg-do run { target aarch64*-*-* } } */
 
5050
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
5051
+/* { dg-require-effective-target aarch64_big_endian } */
 
5052
+
 
5053
+extern void abort (void);
 
5054
+
 
5055
+typedef struct bitfield
 
5056
+{
 
5057
+  unsigned short eight: 8;
 
5058
+  unsigned short four: 4;
 
5059
+  unsigned short five: 5;
 
5060
+  unsigned short seven: 7;
 
5061
+  unsigned int sixteen: 16;
 
5062
+} bitfield;
 
5063
+
 
5064
+bitfield
 
5065
+bfi1 (bitfield a)
 
5066
+{
 
5067
+  /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 56, 8" } } */
 
5068
+  a.eight = 3;
 
5069
+  return a;
 
5070
+}
 
5071
+
 
5072
+bitfield
 
5073
+bfi2 (bitfield a)
 
5074
+{
 
5075
+  /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 43, 5" } } */
 
5076
+  a.five = 7;
 
5077
+  return a;
 
5078
+}
 
5079
+
 
5080
+bitfield
 
5081
+movk (bitfield a)
 
5082
+{
 
5083
+  /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 16" } } */
 
5084
+  a.sixteen = 7531;
 
5085
+  return a;
 
5086
+}
 
5087
+
 
5088
+bitfield
 
5089
+set1 (bitfield a)
 
5090
+{
 
5091
+  /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 272678883688448" } } */
 
5092
+  a.five = 0x1f;
 
5093
+  return a;
 
5094
+}
 
5095
+
 
5096
+bitfield
 
5097
+set0 (bitfield a)
 
5098
+{
 
5099
+  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -272678883688449" } } */
 
5100
+  a.five = 0;
 
5101
+  return a;
 
5102
+}
 
5103
+
 
5104
+
 
5105
+int
 
5106
+main (int argc, char** argv)
 
5107
+{
 
5108
+  static bitfield a;
 
5109
+  bitfield b = bfi1 (a);
 
5110
+  bitfield c = bfi2 (b);
 
5111
+  bitfield d = movk (c);
 
5112
+
 
5113
+  if (d.eight != 3)
 
5114
+    abort ();
 
5115
+
 
5116
+  if (d.five != 7)
 
5117
+    abort ();
 
5118
+
 
5119
+  if (d.sixteen != 7531)
 
5120
+    abort ();
 
5121
+
 
5122
+  d = set1 (d);
 
5123
+  if (d.five != 0x1f)
 
5124
+    abort ();
 
5125
+
 
5126
+  d = set0 (d);
 
5127
+  if (d.five != 0)
 
5128
+    abort ();
 
5129
+
 
5130
+  return 0;
 
5131
+}
 
5132
+
 
5133
+/* { dg-final { cleanup-saved-temps } } */
 
5134
--- a/src/gcc/testsuite/gcc.target/aarch64/vrecps.c
 
5135
+++ b/src/gcc/testsuite/gcc.target/aarch64/vrecps.c
 
5136
@@ -0,0 +1,144 @@
 
5137
+/* { dg-do run } */
 
5138
+/* { dg-options "-O3 --save-temps" } */
 
5139
+
 
5140
+#include <arm_neon.h>
 
5141
+#include <math.h>
 
5142
+#include <stdlib.h>
 
5143
+
 
5144
+int
 
5145
+test_frecps_float32_t (void)
 
5146
+{
 
5147
+  int i;
 
5148
+  float32_t value = 0.2;
 
5149
+  float32_t reciprocal = 5.0;
 
5150
+  float32_t step = vrecpes_f32 (value);
 
5151
+  /* 3 steps should give us within ~0.001 accuracy.  */
 
5152
+  for (i = 0; i < 3; i++)
 
5153
+    step = step * vrecpss_f32 (step, value);
 
5154
+
 
5155
+  return fabs (step - reciprocal) < 0.001;
 
5156
+}
 
5157
+
 
5158
+/* { dg-final { scan-assembler "frecpe\\ts\[0-9\]+, s\[0-9\]+" } } */
 
5159
+/* { dg-final { scan-assembler "frecps\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */
 
5160
+
 
5161
+int
 
5162
+test_frecps_float32x2_t (void)
 
5163
+{
 
5164
+  int i;
 
5165
+  int ret = 1;
 
5166
+
 
5167
+  const float32_t value_pool[] = {0.2, 0.4};
 
5168
+  const float32_t reciprocal_pool[] = {5.0, 2.5};
 
5169
+  float32x2_t value = vld1_f32 (value_pool);
 
5170
+  float32x2_t reciprocal = vld1_f32 (reciprocal_pool);
 
5171
+
 
5172
+  float32x2_t step = vrecpe_f32 (value);
 
5173
+  /* 3 steps should give us within ~0.001 accuracy.  */
 
5174
+  for (i = 0; i < 3; i++)
 
5175
+    step = step * vrecps_f32 (step, value);
 
5176
+
 
5177
+  ret &= fabs (vget_lane_f32 (step, 0)
 
5178
+              - vget_lane_f32 (reciprocal, 0)) < 0.001;
 
5179
+  ret &= fabs (vget_lane_f32 (step, 1)
 
5180
+              - vget_lane_f32 (reciprocal, 1)) < 0.001;
 
5181
+
 
5182
+  return ret;
 
5183
+}
 
5184
+
 
5185
+/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.2s, v\[0-9\]+.2s" } } */
 
5186
+/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.2s, v\[0-9\]+.2s, v\[0-9\]+.2s" } } */
 
5187
+
 
5188
+int
 
5189
+test_frecps_float32x4_t (void)
 
5190
+{
 
5191
+  int i;
 
5192
+  int ret = 1;
 
5193
+
 
5194
+  const float32_t value_pool[] = {0.2, 0.4, 0.5, 0.8};
 
5195
+  const float32_t reciprocal_pool[] = {5.0, 2.5, 2.0, 1.25};
 
5196
+  float32x4_t value = vld1q_f32 (value_pool);
 
5197
+  float32x4_t reciprocal = vld1q_f32 (reciprocal_pool);
 
5198
+
 
5199
+  float32x4_t step = vrecpeq_f32 (value);
 
5200
+  /* 3 steps should give us within ~0.001 accuracy.  */
 
5201
+  for (i = 0; i < 3; i++)
 
5202
+    step = step * vrecpsq_f32 (step, value);
 
5203
+
 
5204
+  ret &= fabs (vgetq_lane_f32 (step, 0)
 
5205
+              - vgetq_lane_f32 (reciprocal, 0)) < 0.001;
 
5206
+  ret &= fabs (vgetq_lane_f32 (step, 1)
 
5207
+              - vgetq_lane_f32 (reciprocal, 1)) < 0.001;
 
5208
+  ret &= fabs (vgetq_lane_f32 (step, 2)
 
5209
+              - vgetq_lane_f32 (reciprocal, 2)) < 0.001;
 
5210
+  ret &= fabs (vgetq_lane_f32 (step, 3)
 
5211
+              - vgetq_lane_f32 (reciprocal, 3)) < 0.001;
 
5212
+
 
5213
+  return ret;
 
5214
+}
 
5215
+
 
5216
+/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.4s, v\[0-9\]+.4s" } } */
 
5217
+/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.4s, v\[0-9\]+.4s, v\[0-9\]+.4s" } } */
 
5218
+
 
5219
+int
 
5220
+test_frecps_float64_t (void)
 
5221
+{
 
5222
+  int i;
 
5223
+  float64_t value = 0.2;
 
5224
+  float64_t reciprocal = 5.0;
 
5225
+  float64_t step = vrecped_f64 (value);
 
5226
+  /* 3 steps should give us within ~0.001 accuracy.  */
 
5227
+  for (i = 0; i < 3; i++)
 
5228
+    step = step * vrecpsd_f64 (step, value);
 
5229
+
 
5230
+  return fabs (step - reciprocal) < 0.001;
 
5231
+}
 
5232
+
 
5233
+/* { dg-final { scan-assembler "frecpe\\td\[0-9\]+, d\[0-9\]+" } } */
 
5234
+/* { dg-final { scan-assembler "frecps\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */
 
5235
+
 
5236
+int
 
5237
+test_frecps_float64x2_t (void)
 
5238
+{
 
5239
+  int i;
 
5240
+  int ret = 1;
 
5241
+
 
5242
+  const float64_t value_pool[] = {0.2, 0.4};
 
5243
+  const float64_t reciprocal_pool[] = {5.0, 2.5};
 
5244
+  float64x2_t value = vld1q_f64 (value_pool);
 
5245
+  float64x2_t reciprocal = vld1q_f64 (reciprocal_pool);
 
5246
+
 
5247
+  float64x2_t step = vrecpeq_f64 (value);
 
5248
+  /* 3 steps should give us within ~0.001 accuracy.  */
 
5249
+  for (i = 0; i < 3; i++)
 
5250
+    step = step * vrecpsq_f64 (step, value);
 
5251
+
 
5252
+  ret &= fabs (vgetq_lane_f64 (step, 0)
 
5253
+              - vgetq_lane_f64 (reciprocal, 0)) < 0.001;
 
5254
+  ret &= fabs (vgetq_lane_f64 (step, 1)
 
5255
+              - vgetq_lane_f64 (reciprocal, 1)) < 0.001;
 
5256
+
 
5257
+  return ret;
 
5258
+}
 
5259
+
 
5260
+/* { dg-final { scan-assembler "frecpe\\tv\[0-9\]+.2d, v\[0-9\]+.2d" } } */
 
5261
+/* { dg-final { scan-assembler "frecps\\tv\[0-9\]+.2d, v\[0-9\]+.2d, v\[0-9\]+.2d" } } */
 
5262
+
 
5263
+int
 
5264
+main (int argc, char **argv)
 
5265
+{
 
5266
+  if (!test_frecps_float32_t ())
 
5267
+    abort ();
 
5268
+  if (!test_frecps_float32x2_t ())
 
5269
+    abort ();
 
5270
+  if (!test_frecps_float32x4_t ())
 
5271
+    abort ();
 
5272
+  if (!test_frecps_float64_t ())
 
5273
+    abort ();
 
5274
+  if (!test_frecps_float64x2_t ())
 
5275
+    abort ();
 
5276
+
 
5277
+  return 0;
 
5278
+}
 
5279
+
 
5280
+/* { dg-final { cleanup-saved-temps } } */
 
5281
--- a/src/gcc/testsuite/gcc.target/aarch64/ands_2.c
 
5282
+++ b/src/gcc/testsuite/gcc.target/aarch64/ands_2.c
 
5283
@@ -0,0 +1,157 @@
 
5284
+/* { dg-do run } */
 
5285
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
5286
+
 
5287
+extern void abort (void);
 
5288
+
 
5289
+int
 
5290
+ands_si_test1 (int a, int b, int c)
 
5291
+{
 
5292
+  int d = a & b;
 
5293
+
 
5294
+  /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
5295
+  /* { dg-final { scan-assembler-times "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
 
5296
+  if (d <= 0)
 
5297
+    return a + c;
 
5298
+  else
 
5299
+    return b + d + c;
 
5300
+}
 
5301
+
 
5302
+int
 
5303
+ands_si_test2 (int a, int b, int c)
 
5304
+{
 
5305
+  int d = a & 0x99999999;
 
5306
+
 
5307
+  /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */
 
5308
+  /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */
 
5309
+  if (d <= 0)
 
5310
+    return a + c;
 
5311
+  else
 
5312
+    return b + d + c;
 
5313
+}
 
5314
+
 
5315
+int
 
5316
+ands_si_test3 (int a, int b, int c)
 
5317
+{
 
5318
+  int d = a & (b << 3);
 
5319
+
 
5320
+  /* { dg-final { scan-assembler-not "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
5321
+  /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
5322
+  if (d <= 0)
 
5323
+    return a + c;
 
5324
+  else
 
5325
+    return b + d + c;
 
5326
+}
 
5327
+
 
5328
+typedef long long s64;
 
5329
+
 
5330
+s64
 
5331
+ands_di_test1 (s64 a, s64 b, s64 c)
 
5332
+{
 
5333
+  s64 d = a & b;
 
5334
+
 
5335
+  /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
5336
+  /* { dg-final { scan-assembler-times "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
 
5337
+  if (d <= 0)
 
5338
+    return a + c;
 
5339
+  else
 
5340
+    return b + d + c;
 
5341
+}
 
5342
+
 
5343
+s64
 
5344
+ands_di_test2 (s64 a, s64 b, s64 c)
 
5345
+{
 
5346
+  s64 d = a & 0xaaaaaaaaaaaaaaaall;
 
5347
+
 
5348
+  /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */
 
5349
+  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */
 
5350
+  if (d <= 0)
 
5351
+    return a + c;
 
5352
+  else
 
5353
+    return b + d + c;
 
5354
+}
 
5355
+
 
5356
+s64
 
5357
+ands_di_test3 (s64 a, s64 b, s64 c)
 
5358
+{
 
5359
+  s64 d = a & (b << 3);
 
5360
+
 
5361
+  /* { dg-final { scan-assembler-not "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
5362
+  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
5363
+  if (d <= 0)
 
5364
+    return a + c;
 
5365
+  else
 
5366
+    return b + d + c;
 
5367
+}
 
5368
+
 
5369
+int
 
5370
+main ()
 
5371
+{
 
5372
+  int x;
 
5373
+  s64 y;
 
5374
+
 
5375
+  x = ands_si_test1 (29, 4, 5);
 
5376
+  if (x != 13)
 
5377
+    abort ();
 
5378
+
 
5379
+  x = ands_si_test1 (5, 2, 20);
 
5380
+  if (x != 25)
 
5381
+    abort ();
 
5382
+
 
5383
+  x = ands_si_test2 (29, 4, 5);
 
5384
+  if (x != 34)
 
5385
+    abort ();
 
5386
+
 
5387
+  x = ands_si_test2 (1024, 2, 20);
 
5388
+  if (x != 1044)
 
5389
+    abort ();
 
5390
+
 
5391
+  x = ands_si_test3 (35, 4, 5);
 
5392
+  if (x != 41)
 
5393
+    abort ();
 
5394
+
 
5395
+  x = ands_si_test3 (5, 2, 20);
 
5396
+  if (x != 25)
 
5397
+    abort ();
 
5398
+
 
5399
+  y = ands_di_test1 (0x130000029ll,
 
5400
+                     0x320000004ll,
 
5401
+                     0x505050505ll);
 
5402
+
 
5403
+  if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll))
 
5404
+    abort ();
 
5405
+
 
5406
+  y = ands_di_test1 (0x5000500050005ll,
 
5407
+                     0x2111211121112ll,
 
5408
+                     0x0000000002020ll);
 
5409
+  if (y != 0x5000500052025ll)
 
5410
+    abort ();
 
5411
+
 
5412
+  y = ands_di_test2 (0x130000029ll,
 
5413
+                     0x320000004ll,
 
5414
+                     0x505050505ll);
 
5415
+  if (y != ((0x130000029ll & 0xaaaaaaaaaaaaaaaall) + 0x320000004ll + 0x505050505ll))
 
5416
+    abort ();
 
5417
+
 
5418
+  y = ands_di_test2 (0x540004100ll,
 
5419
+                     0x320000004ll,
 
5420
+                     0x805050205ll);
 
5421
+  if (y != (0x540004100ll + 0x805050205ll))
 
5422
+    abort ();
 
5423
+
 
5424
+  y = ands_di_test3 (0x130000029ll,
 
5425
+                     0x064000008ll,
 
5426
+                     0x505050505ll);
 
5427
+  if (y != ((0x130000029ll & (0x064000008ll << 3))
 
5428
+           + 0x064000008ll + 0x505050505ll))
 
5429
+    abort ();
 
5430
+
 
5431
+  y = ands_di_test3 (0x130002900ll,
 
5432
+                     0x088000008ll,
 
5433
+                     0x505050505ll);
 
5434
+  if (y != (0x130002900ll + 0x505050505ll))
 
5435
+    abort ();
 
5436
+
 
5437
+  return 0;
 
5438
+}
 
5439
+
 
5440
+/* { dg-final { cleanup-saved-temps } } */
 
5441
--- a/src/gcc/testsuite/gcc.target/aarch64/scalar-vca.c
 
5442
+++ b/src/gcc/testsuite/gcc.target/aarch64/scalar-vca.c
 
5443
@@ -0,0 +1,72 @@
 
5444
+/* { dg-do run } */
 
5445
+/* { dg-options "-O3 --save-temps" } */
 
5446
+
 
5447
+#include <arm_neon.h>
 
5448
+
 
5449
+extern void abort (void);
 
5450
+extern float fabsf (float);
 
5451
+extern double fabs (double);
 
5452
+
 
5453
+#define NUM_TESTS 8
 
5454
+
 
5455
+float input_s1[] = {0.1f, -0.1f, 0.4f, 10.3f, 200.0f, -800.0f, -13.0f, -0.5f};
 
5456
+float input_s2[] = {-0.2f, 0.4f, 0.04f, -100.3f, 2.0f, -80.0f, 13.0f, -0.5f};
 
5457
+double input_d1[] = {0.1, -0.1, 0.4, 10.3, 200.0, -800.0, -13.0, -0.5};
 
5458
+double input_d2[] = {-0.2, 0.4, 0.04, -100.3, 2.0, -80.0, 13.0, -0.5};
 
5459
+
 
5460
+#define TEST(TEST, CMP, SUFFIX, WIDTH, F)                              \
 
5461
+int                                                                    \
 
5462
+test_fca##TEST##SUFFIX##_float##WIDTH##_t (void)                       \
 
5463
+{                                                                      \
 
5464
+  int ret = 0;                                                         \
 
5465
+  int i = 0;                                                           \
 
5466
+  uint##WIDTH##_t output[NUM_TESTS];                                   \
 
5467
+                                                                       \
 
5468
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
5469
+    {                                                                  \
 
5470
+      float##WIDTH##_t f1 = fabs##F (input_##SUFFIX##1[i]);            \
 
5471
+      float##WIDTH##_t f2 = fabs##F (input_##SUFFIX##2[i]);            \
 
5472
+      /* Inhibit optimization of our linear test loop.  */             \
 
5473
+      asm volatile ("" : : : "memory");                                        \
 
5474
+      output[i] = f1 CMP f2 ? -1 : 0;                                  \
 
5475
+    }                                                                  \
 
5476
+                                                                       \
 
5477
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
5478
+    {                                                                  \
 
5479
+      output[i] = vca##TEST##SUFFIX##_f##WIDTH (input_##SUFFIX##1[i],  \
 
5480
+                                               input_##SUFFIX##2[i])   \
 
5481
+                                                 ^ output[i];          \
 
5482
+      /* Inhibit autovectorization of our scalar test loop.  */                \
 
5483
+      asm volatile ("" : : : "memory");                                        \
 
5484
+    }                                                                  \
 
5485
+                                                                       \
 
5486
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
5487
+    ret |= output[i];                                                  \
 
5488
+                                                                       \
 
5489
+  return ret;                                                          \
 
5490
+}
 
5491
+
 
5492
+TEST (ge, >=, s, 32, f)
 
5493
+/* { dg-final { scan-assembler "facge\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */
 
5494
+TEST (ge, >=, d, 64, )
 
5495
+/* { dg-final { scan-assembler "facge\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */
 
5496
+TEST (gt, >, s, 32, f)
 
5497
+/* { dg-final { scan-assembler "facgt\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" } } */
 
5498
+TEST (gt, >, d, 64, )
 
5499
+/* { dg-final { scan-assembler "facgt\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" } } */
 
5500
+
 
5501
+int
 
5502
+main (int argc, char **argv)
 
5503
+{
 
5504
+  if (test_fcages_float32_t ())
 
5505
+    abort ();
 
5506
+  if (test_fcaged_float64_t ())
 
5507
+    abort ();
 
5508
+  if (test_fcagts_float32_t ())
 
5509
+    abort ();
 
5510
+  if (test_fcagtd_float64_t ())
 
5511
+    abort ();
 
5512
+  return 0;
 
5513
+}
 
5514
+
 
5515
+/* { dg-final { cleanup-saved-temps } } */
 
5516
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.x
 
5517
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.x
 
5518
@@ -0,0 +1,37 @@
 
5519
+int v = 0;
 
5520
+
 
5521
+int
 
5522
+atomic_fetch_add_ACQ_REL (int a)
 
5523
+{
 
5524
+  return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL);
 
5525
+}
 
5526
+
 
5527
+int
 
5528
+atomic_fetch_sub_ACQ_REL (int a)
 
5529
+{
 
5530
+  return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL);
 
5531
+}
 
5532
+
 
5533
+int
 
5534
+atomic_fetch_and_ACQ_REL (int a)
 
5535
+{
 
5536
+  return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL);
 
5537
+}
 
5538
+
 
5539
+int
 
5540
+atomic_fetch_nand_ACQ_REL (int a)
 
5541
+{
 
5542
+  return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL);
 
5543
+}
 
5544
+
 
5545
+int
 
5546
+atomic_fetch_xor_ACQ_REL (int a)
 
5547
+{
 
5548
+  return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL);
 
5549
+}
 
5550
+
 
5551
+int
 
5552
+atomic_fetch_or_ACQ_REL (int a)
 
5553
+{
 
5554
+  return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL);
 
5555
+}
 
5556
--- a/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c
 
5557
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c
 
5558
@@ -0,0 +1,325 @@
 
5559
+/* { dg-do run } */
 
5560
+/* { dg-options "-O3 -fno-inline -save-temps -fno-vect-cost-model" } */
 
5561
+
 
5562
+typedef signed char S8_t;
 
5563
+typedef signed short S16_t;
 
5564
+typedef signed int S32_t;
 
5565
+typedef signed long S64_t;
 
5566
+typedef signed char *__restrict__ pS8_t;
 
5567
+typedef signed short *__restrict__ pS16_t;
 
5568
+typedef signed int *__restrict__ pS32_t;
 
5569
+typedef signed long *__restrict__ pS64_t;
 
5570
+typedef unsigned char U8_t;
 
5571
+typedef unsigned short U16_t;
 
5572
+typedef unsigned int U32_t;
 
5573
+typedef unsigned long U64_t;
 
5574
+typedef unsigned char *__restrict__ pU8_t;
 
5575
+typedef unsigned short *__restrict__ pU16_t;
 
5576
+typedef unsigned int *__restrict__ pU32_t;
 
5577
+typedef unsigned long *__restrict__ pU64_t;
 
5578
+
 
5579
+extern void abort ();
 
5580
+
 
5581
+void
 
5582
+test_addS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c)
 
5583
+{
 
5584
+  int i;
 
5585
+  for (i = 0; i < 4; i++)
 
5586
+    a[i] += (S64_t) b[i] * (S64_t) c[i];
 
5587
+}
 
5588
+
 
5589
+/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.2d" } } */
 
5590
+/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.2d" } } */
 
5591
+
 
5592
+void
 
5593
+test_addS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c)
 
5594
+{
 
5595
+  int i;
 
5596
+  for (i = 0; i < 8; i++)
 
5597
+    a[i] += (S32_t) b[i] * (S32_t) c[i];
 
5598
+}
 
5599
+
 
5600
+/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.4s" } } */
 
5601
+/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.4s" } } */
 
5602
+
 
5603
+void
 
5604
+test_addS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c)
 
5605
+{
 
5606
+  int i;
 
5607
+  for (i = 0; i < 16; i++)
 
5608
+    a[i] += (S16_t) b[i] * (S16_t) c[i];
 
5609
+}
 
5610
+
 
5611
+void
 
5612
+test_addS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c)
 
5613
+{
 
5614
+  int i;
 
5615
+  for (i = 0; i < 16; i++)
 
5616
+    a[i] += (S16_t) -b[i] * (S16_t) -c[i];
 
5617
+}
 
5618
+
 
5619
+void
 
5620
+test_addS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c)
 
5621
+{
 
5622
+  int i;
 
5623
+  for (i = 0; i < 16; i++)
 
5624
+    a[i] -= (S16_t) b[i] * (S16_t) -c[i];
 
5625
+}
 
5626
+
 
5627
+void
 
5628
+test_addS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c)
 
5629
+{
 
5630
+  int i;
 
5631
+  for (i = 0; i < 16; i++)
 
5632
+    a[i] -= (S16_t) -b[i] * (S16_t) c[i];
 
5633
+}
 
5634
+
 
5635
+/* { dg-final { scan-assembler-times "smlal\tv\[0-9\]+\.8h" 4 } } */
 
5636
+/* { dg-final { scan-assembler-times "smlal2\tv\[0-9\]+\.8h" 4 } } */
 
5637
+
 
5638
+void
 
5639
+test_subS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c)
 
5640
+{
 
5641
+  int i;
 
5642
+  for (i = 0; i < 4; i++)
 
5643
+    a[i] -= (S64_t) b[i] * (S64_t) c[i];
 
5644
+}
 
5645
+
 
5646
+/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.2d" } } */
 
5647
+/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.2d" } } */
 
5648
+
 
5649
+void
 
5650
+test_subS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c)
 
5651
+{
 
5652
+  int i;
 
5653
+  for (i = 0; i < 8; i++)
 
5654
+    a[i] -= (S32_t) b[i] * (S32_t) c[i];
 
5655
+}
 
5656
+
 
5657
+/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.4s" } } */
 
5658
+/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.4s" } } */
 
5659
+
 
5660
+void
 
5661
+test_subS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c)
 
5662
+{
 
5663
+  int i;
 
5664
+  for (i = 0; i < 16; i++)
 
5665
+    a[i] -= (S16_t) b[i] * (S16_t) c[i];
 
5666
+}
 
5667
+
 
5668
+void
 
5669
+test_subS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c)
 
5670
+{
 
5671
+  int i;
 
5672
+  for (i = 0; i < 16; i++)
 
5673
+    a[i] += (S16_t) -b[i] * (S16_t) c[i];
 
5674
+}
 
5675
+
 
5676
+void
 
5677
+test_subS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c)
 
5678
+{
 
5679
+  int i;
 
5680
+  for (i = 0; i < 16; i++)
 
5681
+    a[i] += (S16_t) b[i] * (S16_t) -c[i];
 
5682
+}
 
5683
+
 
5684
+void
 
5685
+test_subS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c)
 
5686
+{
 
5687
+  int i;
 
5688
+  for (i = 0; i < 16; i++)
 
5689
+    a[i] += -((S16_t) b[i] * (S16_t) c[i]);
 
5690
+}
 
5691
+
 
5692
+void
 
5693
+test_subS16_tS8_t16_neg3 (pS16_t a, pS8_t b, pS8_t c)
 
5694
+{
 
5695
+  int i;
 
5696
+  for (i = 0; i < 16; i++)
 
5697
+    a[i] -= (S16_t) -b[i] * (S16_t) -c[i];
 
5698
+}
 
5699
+
 
5700
+/* { dg-final { scan-assembler-times "smlsl\tv\[0-9\]+\.8h" 5 } } */
 
5701
+/* { dg-final { scan-assembler-times "smlsl2\tv\[0-9\]+\.8h" 5 } } */
 
5702
+
 
5703
+void
 
5704
+test_addU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c)
 
5705
+{
 
5706
+  int i;
 
5707
+  for (i = 0; i < 4; i++)
 
5708
+    a[i] += (U64_t) b[i] * (U64_t) c[i];
 
5709
+}
 
5710
+
 
5711
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.2d" } } */
 
5712
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.2d" } } */
 
5713
+
 
5714
+void
 
5715
+test_addU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c)
 
5716
+{
 
5717
+  int i;
 
5718
+  for (i = 0; i < 8; i++)
 
5719
+    a[i] += (U32_t) b[i] * (U32_t) c[i];
 
5720
+}
 
5721
+
 
5722
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.4s" } } */
 
5723
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.4s" } } */
 
5724
+
 
5725
+void
 
5726
+test_addU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c)
 
5727
+{
 
5728
+  int i;
 
5729
+  for (i = 0; i < 16; i++)
 
5730
+    a[i] += (U16_t) b[i] * (U16_t) c[i];
 
5731
+}
 
5732
+
 
5733
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.8h" } } */
 
5734
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.8h" } } */
 
5735
+
 
5736
+void
 
5737
+test_subU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c)
 
5738
+{
 
5739
+  int i;
 
5740
+  for (i = 0; i < 4; i++)
 
5741
+    a[i] -= (U64_t) b[i] * (U64_t) c[i];
 
5742
+}
 
5743
+
 
5744
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.2d" } } */
 
5745
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.2d" } } */
 
5746
+
 
5747
+void
 
5748
+test_subU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c)
 
5749
+{
 
5750
+  int i;
 
5751
+  for (i = 0; i < 8; i++)
 
5752
+    a[i] -= (U32_t) b[i] * (U32_t) c[i];
 
5753
+}
 
5754
+
 
5755
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.4s" } } */
 
5756
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.4s" } } */
 
5757
+
 
5758
+void
 
5759
+test_subU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c)
 
5760
+{
 
5761
+  int i;
 
5762
+  for (i = 0; i < 16; i++)
 
5763
+    a[i] -= (U16_t) b[i] * (U16_t) c[i];
 
5764
+}
 
5765
+
 
5766
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.8h" } } */
 
5767
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.8h" } } */
 
5768
+
 
5769
+
 
5770
+S64_t add_rS64[4] = { 6, 7, -4, -3 };
 
5771
+S32_t add_rS32[8] = { 6, 7, -4, -3, 10, 11, 0, 1 };
 
5772
+S16_t add_rS16[16] =
 
5773
+ { 6, 7, -4, -3, 10, 11, 0, 1, 14, 15, 4, 5, 18, 19, 8, 9 };
 
5774
+
 
5775
+S64_t sub_rS64[4] = { 0, 1, 2, 3 };
 
5776
+S32_t sub_rS32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
 
5777
+S16_t sub_rS16[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
 
5778
+
 
5779
+U64_t add_rU64[4] = { 0x6, 0x7, 0x2fffffffc, 0x2fffffffd };
 
5780
+
 
5781
+U32_t add_rU32[8] =
 
5782
+{
 
5783
+  0x6, 0x7, 0x2fffc, 0x2fffd,
 
5784
+  0xa, 0xb, 0x30000, 0x30001
 
5785
+};
 
5786
+
 
5787
+U16_t add_rU16[16] =
 
5788
+{
 
5789
+  0x6, 0x7, 0x2fc, 0x2fd, 0xa, 0xb, 0x300, 0x301,
 
5790
+  0xe, 0xf, 0x304, 0x305, 0x12, 0x13, 0x308, 0x309
 
5791
+};
 
5792
+
 
5793
+U64_t sub_rU64[4] = { 0, 1, 2, 3 };
 
5794
+U32_t sub_rU32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
 
5795
+U16_t sub_rU16[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
 
5796
+
 
5797
+S8_t neg_r[16] = { -6, -5, 8, 9, -2, -1, 12, 13, 2, 3, 16, 17, 6, 7, 20, 21 };
 
5798
+
 
5799
+S64_t S64_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
 
5800
+S32_t S32_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 };
 
5801
+S32_t S32_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
 
5802
+
 
5803
+S32_t S32_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
 
5804
+S16_t S16_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 };
 
5805
+S16_t S16_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
 
5806
+
 
5807
+S16_t S16_ta[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
 
5808
+S8_t S8_tb[16] = { 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2 };
 
5809
+S8_t S8_tc[16] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
 
5810
+
 
5811
+
 
5812
+#define CHECK(T,N,AS,US)                      \
 
5813
+do                                            \
 
5814
+  {                                           \
 
5815
+    for (i = 0; i < N; i++)                   \
 
5816
+      if (S##T##_ta[i] != AS##_r##US##T[i])   \
 
5817
+        abort ();                             \
 
5818
+  }                                           \
 
5819
+while (0)
 
5820
+
 
5821
+#define SCHECK(T,N,AS) CHECK(T,N,AS,S)
 
5822
+#define UCHECK(T,N,AS) CHECK(T,N,AS,U)
 
5823
+
 
5824
+#define NCHECK(RES)                           \
 
5825
+do                                            \
 
5826
+  {                                           \
 
5827
+    for (i = 0; i < 16; i++)                  \
 
5828
+      if (S16_ta[i] != RES[i])                \
 
5829
+        abort ();                             \
 
5830
+  }                                           \
 
5831
+while (0)
 
5832
+
 
5833
+
 
5834
+int
 
5835
+main ()
 
5836
+{
 
5837
+  int i;
 
5838
+
 
5839
+  test_addS64_tS32_t4 (S64_ta, S32_tb, S32_tc);
 
5840
+  SCHECK (64, 4, add);
 
5841
+  test_addS32_tS16_t8 (S32_ta, S16_tb, S16_tc);
 
5842
+  SCHECK (32, 8, add);
 
5843
+  test_addS16_tS8_t16 (S16_ta, S8_tb, S8_tc);
 
5844
+  SCHECK (16, 16, add);
 
5845
+  test_subS64_tS32_t4 (S64_ta, S32_tb, S32_tc);
 
5846
+  SCHECK (64, 4, sub);
 
5847
+  test_subS32_tS16_t8 (S32_ta, S16_tb, S16_tc);
 
5848
+  SCHECK (32, 8, sub);
 
5849
+  test_subS16_tS8_t16 (S16_ta, S8_tb, S8_tc);
 
5850
+  SCHECK (16, 16, sub);
 
5851
+
 
5852
+  test_addU64_tU32_t4 (S64_ta, S32_tb, S32_tc);
 
5853
+  UCHECK (64, 4, add);
 
5854
+  test_addU32_tU16_t8 (S32_ta, S16_tb, S16_tc);
 
5855
+  UCHECK (32, 8, add);
 
5856
+  test_addU16_tU8_t16 (S16_ta, S8_tb, S8_tc);
 
5857
+  UCHECK (16, 16, add);
 
5858
+  test_subU64_tU32_t4 (S64_ta, S32_tb, S32_tc);
 
5859
+  UCHECK (64, 4, sub);
 
5860
+  test_subU32_tU16_t8 (S32_ta, S16_tb, S16_tc);
 
5861
+  UCHECK (32, 8, sub);
 
5862
+  test_subU16_tU8_t16 (S16_ta, S8_tb, S8_tc);
 
5863
+  UCHECK (16, 16, sub);
 
5864
+
 
5865
+  test_addS16_tS8_t16_neg0 (S16_ta, S8_tb, S8_tc);
 
5866
+  NCHECK (add_rS16);
 
5867
+  test_subS16_tS8_t16_neg0 (S16_ta, S8_tb, S8_tc);
 
5868
+  NCHECK (sub_rS16);
 
5869
+  test_addS16_tS8_t16_neg1 (S16_ta, S8_tb, S8_tc);
 
5870
+  NCHECK (add_rS16);
 
5871
+  test_subS16_tS8_t16_neg1 (S16_ta, S8_tb, S8_tc);
 
5872
+  NCHECK (sub_rS16);
 
5873
+  test_addS16_tS8_t16_neg2 (S16_ta, S8_tb, S8_tc);
 
5874
+  NCHECK (add_rS16);
 
5875
+  test_subS16_tS8_t16_neg2 (S16_ta, S8_tb, S8_tc);
 
5876
+  NCHECK (sub_rS16);
 
5877
+  test_subS16_tS8_t16_neg3 (S16_ta, S8_tb, S8_tc);
 
5878
+  NCHECK (neg_r);
 
5879
+
 
5880
+  return 0;
 
5881
+}
 
5882
+
 
5883
+/* { dg-final { cleanup-saved-temps } } */
 
5884
--- a/src/gcc/testsuite/gcc.target/aarch64/extr.c
 
5885
+++ b/src/gcc/testsuite/gcc.target/aarch64/extr.c
 
5886
@@ -0,0 +1,34 @@
 
5887
+/* { dg-options "-O2 --save-temps" } */
 
5888
+/* { dg-do run } */
 
5889
+
 
5890
+extern void abort (void);
 
5891
+
 
5892
+int
 
5893
+test_si (int a, int b)
 
5894
+{
 
5895
+  /* { dg-final { scan-assembler "extr\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, 27\n" } } */
 
5896
+  return (a << 5) | ((unsigned int) b >> 27);
 
5897
+}
 
5898
+
 
5899
+long long
 
5900
+test_di (long long a, long long b)
 
5901
+{
 
5902
+  /* { dg-final { scan-assembler "extr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, 45\n" } } */
 
5903
+  return (a << 19) | ((unsigned long long) b >> 45);
 
5904
+}
 
5905
+
 
5906
+int
 
5907
+main ()
 
5908
+{
 
5909
+  int v;
 
5910
+  long long w;
 
5911
+  v = test_si (0x00000004, 0x30000000);
 
5912
+  if (v != 0x00000086)
 
5913
+    abort();
 
5914
+  w = test_di (0x0001040040040004ll, 0x0070050066666666ll);
 
5915
+  if (w != 0x2002002000200380ll)
 
5916
+    abort();
 
5917
+  return 0;
 
5918
+}
 
5919
+
 
5920
+/* { dg-final { cleanup-saved-temps } } */
 
5921
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-compile.c
 
5922
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-compile.c
 
5923
@@ -16,5 +16,7 @@
 
5924
 /* { dg-final { scan-assembler "uminv" } } */
 
5925
 /* { dg-final { scan-assembler "smaxv" } } */
 
5926
 /* { dg-final { scan-assembler "sminv" } } */
 
5927
+/* { dg-final { scan-assembler "sabd" } } */
 
5928
+/* { dg-final { scan-assembler "saba" } } */
 
5929
 /* { dg-final { scan-assembler-times "addv" 2} } */
 
5930
 /* { dg-final { scan-assembler-times "addp" 2} } */
 
5931
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-d.c
 
5932
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-d.c
 
5933
@@ -2,12 +2,13 @@
 
5934
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
5935
 
 
5936
 #define FTYPE double
 
5937
+#define ITYPE long
 
5938
 #define OP ==
 
5939
 #define INV_OP !=
 
5940
 
 
5941
 #include "vect-fcm.x"
 
5942
 
 
5943
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
5944
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
5945
 /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
5946
 /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */
 
5947
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
5948
--- a/src/gcc/testsuite/gcc.target/aarch64/adds3.c
 
5949
+++ b/src/gcc/testsuite/gcc.target/aarch64/adds3.c
 
5950
@@ -0,0 +1,61 @@
 
5951
+/* { dg-do run } */
 
5952
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
5953
+
 
5954
+extern void abort (void);
 
5955
+typedef long long s64;
 
5956
+
 
5957
+int
 
5958
+adds_ext (s64 a, int b, int c)
 
5959
+{
 
5960
+ s64 d = a + b;
 
5961
+
 
5962
+  if (d == 0)
 
5963
+    return a + c;
 
5964
+  else
 
5965
+    return b + d + c;
 
5966
+}
 
5967
+
 
5968
+int
 
5969
+adds_shift_ext (s64 a, int b, int c)
 
5970
+{
 
5971
+ s64 d = (a + ((s64)b << 3));
 
5972
+
 
5973
+  if (d == 0)
 
5974
+    return a + c;
 
5975
+  else
 
5976
+    return b + d + c;
 
5977
+}
 
5978
+
 
5979
+int main ()
 
5980
+{
 
5981
+  int x;
 
5982
+  s64 y;
 
5983
+
 
5984
+  x = adds_ext (0x13000002ll, 41, 15);
 
5985
+  if (x != 318767203)
 
5986
+    abort ();
 
5987
+
 
5988
+  x = adds_ext (0x50505050ll, 29, 4);
 
5989
+  if (x != 1347440782)
 
5990
+    abort ();
 
5991
+
 
5992
+  x = adds_ext (0x12121212121ll, 2, 14);
 
5993
+  if (x != 555819315)
 
5994
+    abort ();
 
5995
+
 
5996
+  x = adds_shift_ext (0x123456789ll, 4, 12);
 
5997
+  if (x != 591751097)
 
5998
+    abort ();
 
5999
+
 
6000
+  x = adds_shift_ext (0x02020202ll, 9, 8);
 
6001
+  if (x != 33686107)
 
6002
+    abort ();
 
6003
+
 
6004
+  x = adds_shift_ext (0x987987987987ll, 23, 41);
 
6005
+  if (x != -2020050305)
 
6006
+    abort ();
 
6007
+
 
6008
+  return 0;
 
6009
+}
 
6010
+
 
6011
+/* { dg-final { scan-assembler-times "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, sxtw" 2 } } */
 
6012
--- a/src/gcc/testsuite/gcc.target/aarch64/subs2.c
 
6013
+++ b/src/gcc/testsuite/gcc.target/aarch64/subs2.c
 
6014
@@ -0,0 +1,155 @@
 
6015
+/* { dg-do run } */
 
6016
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
6017
+
 
6018
+extern void abort (void);
 
6019
+
 
6020
+int
 
6021
+subs_si_test1 (int a, int b, int c)
 
6022
+{
 
6023
+  int d = a - b;
 
6024
+
 
6025
+  /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
6026
+  /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
6027
+  if (d <= 0)
 
6028
+    return a + c;
 
6029
+  else
 
6030
+    return b + d + c;
 
6031
+}
 
6032
+
 
6033
+int
 
6034
+subs_si_test2 (int a, int b, int c)
 
6035
+{
 
6036
+  int d = a - 0xfff;
 
6037
+
 
6038
+  /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, #4095" } } */
 
6039
+  /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, #4095" } } */
 
6040
+  if (d <= 0)
 
6041
+    return a + c;
 
6042
+  else
 
6043
+    return b + d + c;
 
6044
+}
 
6045
+
 
6046
+int
 
6047
+subs_si_test3 (int a, int b, int c)
 
6048
+{
 
6049
+  int d = a - (b << 3);
 
6050
+
 
6051
+  /* { dg-final { scan-assembler-not "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
6052
+  /* { dg-final { scan-assembler "sub\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
6053
+  if (d <= 0)
 
6054
+    return a + c;
 
6055
+  else
 
6056
+    return b + d + c;
 
6057
+}
 
6058
+
 
6059
+typedef long long s64;
 
6060
+
 
6061
+s64
 
6062
+subs_di_test1 (s64 a, s64 b, s64 c)
 
6063
+{
 
6064
+  s64 d = a - b;
 
6065
+
 
6066
+  /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
6067
+  /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
6068
+  if (d <= 0)
 
6069
+    return a + c;
 
6070
+  else
 
6071
+    return b + d + c;
 
6072
+}
 
6073
+
 
6074
+s64
 
6075
+subs_di_test2 (s64 a, s64 b, s64 c)
 
6076
+{
 
6077
+  s64 d = a - 0x1000ll;
 
6078
+
 
6079
+  /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, #4096" } } */
 
6080
+  /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, #4096" } } */
 
6081
+  if (d <= 0)
 
6082
+    return a + c;
 
6083
+  else
 
6084
+    return b + d + c;
 
6085
+}
 
6086
+
 
6087
+s64
 
6088
+subs_di_test3 (s64 a, s64 b, s64 c)
 
6089
+{
 
6090
+  s64 d = a - (b << 3);
 
6091
+
 
6092
+  /* { dg-final { scan-assembler-not "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
6093
+  /* { dg-final { scan-assembler "sub\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
6094
+  if (d <= 0)
 
6095
+    return a + c;
 
6096
+  else
 
6097
+    return b + d + c;
 
6098
+}
 
6099
+
 
6100
+int main ()
 
6101
+{
 
6102
+  int x;
 
6103
+  s64 y;
 
6104
+
 
6105
+  x = subs_si_test1 (29, 4, 5);
 
6106
+  if (x != 34)
 
6107
+    abort ();
 
6108
+
 
6109
+  x = subs_si_test1 (5, 2, 20);
 
6110
+  if (x != 25)
 
6111
+    abort ();
 
6112
+
 
6113
+  x = subs_si_test2 (29, 4, 5);
 
6114
+  if (x != 34)
 
6115
+    abort ();
 
6116
+
 
6117
+  x = subs_si_test2 (1024, 2, 20);
 
6118
+  if (x != 1044)
 
6119
+    abort ();
 
6120
+
 
6121
+  x = subs_si_test3 (35, 4, 5);
 
6122
+  if (x != 12)
 
6123
+    abort ();
 
6124
+
 
6125
+  x = subs_si_test3 (5, 2, 20);
 
6126
+  if (x != 25)
 
6127
+    abort ();
 
6128
+
 
6129
+  y = subs_di_test1 (0x130000029ll,
 
6130
+                    0x320000004ll,
 
6131
+                    0x505050505ll);
 
6132
+
 
6133
+  if (y != 0x63505052e)
 
6134
+    abort ();
 
6135
+
 
6136
+  y = subs_di_test1 (0x5000500050005ll,
 
6137
+                    0x2111211121112ll,
 
6138
+                    0x0000000002020ll);
 
6139
+  if (y != 0x5000500052025)
 
6140
+    abort ();
 
6141
+
 
6142
+  y = subs_di_test2 (0x130000029ll,
 
6143
+                    0x320000004ll,
 
6144
+                    0x505050505ll);
 
6145
+  if (y != 0x95504f532)
 
6146
+    abort ();
 
6147
+
 
6148
+  y = subs_di_test2 (0x540004100ll,
 
6149
+                    0x320000004ll,
 
6150
+                    0x805050205ll);
 
6151
+  if (y != 0x1065053309)
 
6152
+    abort ();
 
6153
+
 
6154
+  y = subs_di_test3 (0x130000029ll,
 
6155
+                    0x064000008ll,
 
6156
+                    0x505050505ll);
 
6157
+  if (y != 0x63505052e)
 
6158
+    abort ();
 
6159
+
 
6160
+  y = subs_di_test3 (0x130002900ll,
 
6161
+                    0x088000008ll,
 
6162
+                    0x505050505ll);
 
6163
+  if (y != 0x635052e05)
 
6164
+    abort ();
 
6165
+
 
6166
+  return 0;
 
6167
+}
 
6168
+
 
6169
+/* { dg-final { cleanup-saved-temps } } */
 
6170
--- a/src/gcc/testsuite/gcc.target/aarch64/bics_1.c
 
6171
+++ b/src/gcc/testsuite/gcc.target/aarch64/bics_1.c
 
6172
@@ -0,0 +1,107 @@
 
6173
+/* { dg-do run } */
 
6174
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
6175
+
 
6176
+extern void abort (void);
 
6177
+
 
6178
+int
 
6179
+bics_si_test1 (int a, int b, int c)
 
6180
+{
 
6181
+  int d = a & ~b;
 
6182
+
 
6183
+  /* { dg-final { scan-assembler-times "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
 
6184
+  if (d == 0)
 
6185
+    return a + c;
 
6186
+  else
 
6187
+    return b + d + c;
 
6188
+}
 
6189
+
 
6190
+int
 
6191
+bics_si_test2 (int a, int b, int c)
 
6192
+{
 
6193
+  int d = a & ~(b << 3);
 
6194
+
 
6195
+  /* { dg-final { scan-assembler "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
6196
+  if (d == 0)
 
6197
+    return a + c;
 
6198
+  else
 
6199
+    return b + d + c;
 
6200
+}
 
6201
+
 
6202
+typedef long long s64;
 
6203
+
 
6204
+s64
 
6205
+bics_di_test1 (s64 a, s64 b, s64 c)
 
6206
+{
 
6207
+  s64 d = a & ~b;
 
6208
+
 
6209
+  /* { dg-final { scan-assembler-times "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
 
6210
+  if (d == 0)
 
6211
+    return a + c;
 
6212
+  else
 
6213
+    return b + d + c;
 
6214
+}
 
6215
+
 
6216
+s64
 
6217
+bics_di_test2 (s64 a, s64 b, s64 c)
 
6218
+{
 
6219
+  s64 d = a & ~(b << 3);
 
6220
+
 
6221
+  /* { dg-final { scan-assembler "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
6222
+  if (d == 0)
 
6223
+    return a + c;
 
6224
+  else
 
6225
+    return b + d + c;
 
6226
+}
 
6227
+
 
6228
+int
 
6229
+main ()
 
6230
+{
 
6231
+  int x;
 
6232
+  s64 y;
 
6233
+
 
6234
+  x = bics_si_test1 (29, ~4, 5);
 
6235
+  if (x != ((29 & 4) + ~4 + 5))
 
6236
+    abort ();
 
6237
+
 
6238
+  x = bics_si_test1 (5, ~2, 20);
 
6239
+  if (x != 25)
 
6240
+    abort ();
 
6241
+
 
6242
+  x = bics_si_test2 (35, ~4, 5);
 
6243
+  if (x != ((35 & ~(~4 << 3)) + ~4 + 5))
 
6244
+    abort ();
 
6245
+
 
6246
+  x = bics_si_test2 (96, ~2, 20);
 
6247
+  if (x != 116)
 
6248
+    abort ();
 
6249
+
 
6250
+  y = bics_di_test1 (0x130000029ll,
 
6251
+                     ~0x320000004ll,
 
6252
+                     0x505050505ll);
 
6253
+
 
6254
+  if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll))
 
6255
+    abort ();
 
6256
+
 
6257
+  y = bics_di_test1 (0x5000500050005ll,
 
6258
+                     ~0x2111211121112ll,
 
6259
+                     0x0000000002020ll);
 
6260
+  if (y != 0x5000500052025ll)
 
6261
+    abort ();
 
6262
+
 
6263
+  y = bics_di_test2 (0x130000029ll,
 
6264
+                     ~0x064000008ll,
 
6265
+                     0x505050505ll);
 
6266
+  if (y != ((0x130000029ll & ~(~0x064000008ll << 3))
 
6267
+           + ~0x064000008ll + 0x505050505ll))
 
6268
+    abort ();
 
6269
+
 
6270
+  y = bics_di_test2 (0x130002900ll,
 
6271
+                     ~0x088000008ll,
 
6272
+                     0x505050505ll);
 
6273
+  if (y != (0x130002900ll + 0x505050505ll))
 
6274
+    abort ();
 
6275
+
 
6276
+  return 0;
 
6277
+}
 
6278
+
 
6279
+/* { dg-final { cleanup-saved-temps } } */
 
6280
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vmaxv.c
 
6281
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vmaxv.c
 
6282
@@ -0,0 +1,117 @@
 
6283
+/* { dg-do run } */
 
6284
+/* { dg-options "-O3 --save-temps -ffast-math" } */
 
6285
+
 
6286
+#include <arm_neon.h>
 
6287
+
 
6288
+extern void abort (void);
 
6289
+
 
6290
+#define NUM_TESTS 16
 
6291
+#define DELTA 0.000001
 
6292
+
 
6293
+int8_t input_int8[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
6294
+                      -4, 34, 110, -110, 6, 4, 75, -34};
 
6295
+int16_t input_int16[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
6296
+                        -4, 34, 110, -110, 6, 4, 75, -34};
 
6297
+int32_t input_int32[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
6298
+                        -4, 34, 110, -110, 6, 4, 75, -34};
 
6299
+
 
6300
+uint8_t input_uint8[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
6301
+                        4, 34, 110, 110, 6, 4, 75, 34};
 
6302
+uint16_t input_uint16[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
6303
+                          4, 34, 110, 110, 6, 4, 75, 34};
 
6304
+uint32_t input_uint32[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
6305
+                          4, 34, 110, 110, 6, 4, 75, 34};
 
6306
+
 
6307
+#define EQUAL(a, b) (a == b)
 
6308
+
 
6309
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES)                   \
 
6310
+int                                                                    \
 
6311
+test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void)                        \
 
6312
+{                                                                      \
 
6313
+  int i, j;                                                            \
 
6314
+  int moves = (NUM_TESTS - LANES) + 1;                                 \
 
6315
+  TYPE##_t out_l[NUM_TESTS];                                           \
 
6316
+  TYPE##_t out_v[NUM_TESTS];                                           \
 
6317
+                                                                       \
 
6318
+  /* Calculate linearly.  */                                           \
 
6319
+  for (i = 0; i < moves; i++)                                          \
 
6320
+    {                                                                  \
 
6321
+      out_l[i] = input_##TYPE[i];                                      \
 
6322
+      for (j = 0; j < LANES; j++)                                      \
 
6323
+       out_l[i] = input_##TYPE[i + j] CMP_OP out_l[i]  ?               \
 
6324
+         input_##TYPE[i + j] : out_l[i];                               \
 
6325
+    }                                                                  \
 
6326
+                                                                       \
 
6327
+  /* Calculate using vector reduction intrinsics.  */                  \
 
6328
+  for (i = 0; i < moves; i++)                                          \
 
6329
+    {                                                                  \
 
6330
+      TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i);   \
 
6331
+      out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1);                      \
 
6332
+    }                                                                  \
 
6333
+                                                                       \
 
6334
+  /* Compare.  */                                                      \
 
6335
+  for (i = 0; i < moves; i++)                                          \
 
6336
+    {                                                                  \
 
6337
+      if (!EQUAL (out_v[i], out_l[i]))                                 \
 
6338
+       return 0;                                                       \
 
6339
+    }                                                                  \
 
6340
+  return 1;                                                            \
 
6341
+}
 
6342
+
 
6343
+#define BUILD_VARIANTS(TYPE, STYPE, W32, W64)          \
 
6344
+TEST (max, >, STYPE,  , TYPE, W32)                     \
 
6345
+TEST (max, >, STYPE, q, TYPE, W64)                     \
 
6346
+TEST (min, <, STYPE,  , TYPE, W32)                     \
 
6347
+TEST (min, <, STYPE, q, TYPE, W64)
 
6348
+
 
6349
+BUILD_VARIANTS (int8, s8, 8, 16)
 
6350
+/* { dg-final { scan-assembler "smaxv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */
 
6351
+/* { dg-final { scan-assembler "sminv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */
 
6352
+/* { dg-final { scan-assembler "smaxv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */
 
6353
+/* { dg-final { scan-assembler "sminv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */
 
6354
+BUILD_VARIANTS (uint8, u8, 8, 16)
 
6355
+/* { dg-final { scan-assembler "umaxv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */
 
6356
+/* { dg-final { scan-assembler "uminv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */
 
6357
+/* { dg-final { scan-assembler "umaxv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */
 
6358
+/* { dg-final { scan-assembler "uminv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */
 
6359
+BUILD_VARIANTS (int16, s16, 4, 8)
 
6360
+/* { dg-final { scan-assembler "smaxv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */
 
6361
+/* { dg-final { scan-assembler "sminv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */
 
6362
+/* { dg-final { scan-assembler "smaxv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */
 
6363
+/* { dg-final { scan-assembler "sminv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */
 
6364
+BUILD_VARIANTS (uint16, u16, 4, 8)
 
6365
+/* { dg-final { scan-assembler "umaxv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */
 
6366
+/* { dg-final { scan-assembler "uminv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */
 
6367
+/* { dg-final { scan-assembler "umaxv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */
 
6368
+/* { dg-final { scan-assembler "uminv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */
 
6369
+BUILD_VARIANTS (int32, s32, 2, 4)
 
6370
+/* { dg-final { scan-assembler "smaxp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6371
+/* { dg-final { scan-assembler "sminp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6372
+/* { dg-final { scan-assembler "smaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
6373
+/* { dg-final { scan-assembler "sminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
6374
+BUILD_VARIANTS (uint32, u32, 2, 4)
 
6375
+/* { dg-final { scan-assembler "umaxp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6376
+/* { dg-final { scan-assembler "uminp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6377
+/* { dg-final { scan-assembler "umaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
6378
+/* { dg-final { scan-assembler "uminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
6379
+
 
6380
+#undef TEST
 
6381
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES)           \
 
6382
+{                                                              \
 
6383
+  if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ())    \
 
6384
+    abort ();                                                  \
 
6385
+}
 
6386
+
 
6387
+int
 
6388
+main (int argc, char **argv)
 
6389
+{
 
6390
+  BUILD_VARIANTS (int8, s8, 8, 16)
 
6391
+  BUILD_VARIANTS (uint8, u8, 8, 16)
 
6392
+  BUILD_VARIANTS (int16, s16, 4, 8)
 
6393
+  BUILD_VARIANTS (uint16, u16, 4, 8)
 
6394
+  BUILD_VARIANTS (int32, s32, 2, 4)
 
6395
+  BUILD_VARIANTS (uint32, u32, 2, 4)
 
6396
+  return 0;
 
6397
+}
 
6398
+
 
6399
+/* { dg-final { cleanup-saved-temps } } */
 
6400
--- a/src/gcc/testsuite/gcc.target/aarch64/vrecpx.c
 
6401
+++ b/src/gcc/testsuite/gcc.target/aarch64/vrecpx.c
 
6402
@@ -0,0 +1,54 @@
 
6403
+/* { dg-do run } */
 
6404
+/* { dg-options "-O3 --save-temps" } */
 
6405
+
 
6406
+#include <arm_neon.h>
 
6407
+#include <math.h>
 
6408
+#include <stdlib.h>
 
6409
+
 
6410
+float32_t in_f[] =
 
6411
+{2.0, 4.0, 8.0, 16.0, 1.0, 0.5, 0.25, 0.125};
 
6412
+float32_t rec_f[] =
 
6413
+{1.0, 0.5, 0.25, 0.125, 2.0, 4.0, 8.0, 16.0};
 
6414
+float64_t in_d[] =
 
6415
+{2.0, 4.0, 8.0, 16.0, 1.0, 0.5, 0.25, 0.125};
 
6416
+float32_t rec_d[] =
 
6417
+{1.0, 0.5, 0.25, 0.125, 2.0, 4.0, 8.0, 16.0};
 
6418
+
 
6419
+int
 
6420
+test_frecpx_float32_t (void)
 
6421
+{
 
6422
+  int i = 0;
 
6423
+  int ret = 1;
 
6424
+  for (i = 0; i < 8; i++)
 
6425
+    ret &= fabs (vrecpxs_f32 (in_f[i]) - rec_f[i]) < 0.001;
 
6426
+
 
6427
+  return ret;
 
6428
+}
 
6429
+
 
6430
+/* { dg-final { scan-assembler "frecpx\\ts\[0-9\]+, s\[0-9\]+" } } */
 
6431
+
 
6432
+int
 
6433
+test_frecpx_float64_t (void)
 
6434
+{
 
6435
+  int i = 0;
 
6436
+  int ret = 1;
 
6437
+  for (i = 0; i < 8; i++)
 
6438
+    ret &= fabs (vrecpxd_f64 (in_d[i]) - rec_d[i]) < 0.001;
 
6439
+
 
6440
+  return ret;
 
6441
+}
 
6442
+
 
6443
+/* { dg-final { scan-assembler "frecpx\\td\[0-9\]+, d\[0-9\]+" } } */
 
6444
+
 
6445
+int
 
6446
+main (int argc, char **argv)
 
6447
+{
 
6448
+  if (!test_frecpx_float32_t ())
 
6449
+    abort ();
 
6450
+  if (!test_frecpx_float64_t ())
 
6451
+    abort ();
 
6452
+
 
6453
+  return 0;
 
6454
+}
 
6455
+
 
6456
+/* { dg-final { cleanup-saved-temps } } */
 
6457
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vca.c
 
6458
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vca.c
 
6459
@@ -0,0 +1,89 @@
 
6460
+/* { dg-do run } */
 
6461
+/* { dg-options "-O3 --save-temps" } */
 
6462
+
 
6463
+#include <arm_neon.h>
 
6464
+
 
6465
+extern void abort (void);
 
6466
+extern float fabsf (float);
 
6467
+extern double fabs (double);
 
6468
+
 
6469
+#define NUM_TESTS 8
 
6470
+
 
6471
+float input_s1[] = {0.1f, -0.1f, 0.4f, 10.3f, 200.0f, -800.0f, -13.0f, -0.5f};
 
6472
+float input_s2[] = {-0.2f, 0.4f, 0.04f, -100.3f, 2.0f, -80.0f, 13.0f, -0.5f};
 
6473
+double input_d1[] = {0.1, -0.1, 0.4, 10.3, 200.0, -800.0, -13.0, -0.5};
 
6474
+double input_d2[] = {-0.2, 0.4, 0.04, -100.3, 2.0, -80.0, 13.0, -0.5};
 
6475
+
 
6476
+#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F)                       \
 
6477
+int                                                                    \
 
6478
+test_vca##T##_float##WIDTH##x##LANES##_t (void)                                \
 
6479
+{                                                                      \
 
6480
+  int ret = 0;                                                         \
 
6481
+  int i = 0;                                                           \
 
6482
+  uint##WIDTH##_t output[NUM_TESTS];                                   \
 
6483
+                                                                       \
 
6484
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
6485
+    {                                                                  \
 
6486
+      float##WIDTH##_t f1 = fabs##F (input_##SUFFIX##1[i]);            \
 
6487
+      float##WIDTH##_t f2 = fabs##F (input_##SUFFIX##2[i]);            \
 
6488
+      /* Inhibit optimization of our linear test loop.  */             \
 
6489
+      asm volatile ("" : : : "memory");                                        \
 
6490
+      output[i] = f1 CMP f2 ? -1 : 0;                                  \
 
6491
+    }                                                                  \
 
6492
+                                                                       \
 
6493
+  for (i = 0; i < NUM_TESTS; i += LANES)                               \
 
6494
+    {                                                                  \
 
6495
+      float##WIDTH##x##LANES##_t in1 =                                 \
 
6496
+       vld1##Q##_f##WIDTH (input_##SUFFIX##1 + i);                     \
 
6497
+      float##WIDTH##x##LANES##_t in2 =                                 \
 
6498
+       vld1##Q##_f##WIDTH (input_##SUFFIX##2 + i);                     \
 
6499
+      uint##WIDTH##x##LANES##_t expected_out =                         \
 
6500
+       vld1##Q##_u##WIDTH (output + i);                                \
 
6501
+      uint##WIDTH##x##LANES##_t out =                                  \
 
6502
+       veor##Q##_u##WIDTH (vca##T##Q##_f##WIDTH (in1, in2),            \
 
6503
+                           expected_out);                              \
 
6504
+      vst1##Q##_u##WIDTH (output + i, out);                            \
 
6505
+    }                                                                  \
 
6506
+                                                                       \
 
6507
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
6508
+    ret |= output[i];                                                  \
 
6509
+                                                                       \
 
6510
+  return ret;                                                          \
 
6511
+}
 
6512
+
 
6513
+#define BUILD_VARIANTS(T, CMP) \
 
6514
+TEST (T, CMP, s, 32, 2,  , f)  \
 
6515
+TEST (T, CMP, s, 32, 4, q, f)  \
 
6516
+TEST (T, CMP, d, 64, 2, q,  )
 
6517
+
 
6518
+BUILD_VARIANTS (ge, >=)
 
6519
+/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6520
+/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6521
+/* { dg-final { scan-assembler "facge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6522
+
 
6523
+BUILD_VARIANTS (gt, >)
 
6524
+/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6525
+/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6526
+/* { dg-final { scan-assembler "facgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6527
+
 
6528
+/* No need for another scan-assembler as these tests
 
6529
+   also generate facge, facgt instructions.  */
 
6530
+BUILD_VARIANTS (le, <=)
 
6531
+BUILD_VARIANTS (lt, <)
 
6532
+
 
6533
+#undef TEST
 
6534
+#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F)       \
 
6535
+if (test_vca##T##_float##WIDTH##x##LANES##_t ())       \
 
6536
+  abort ();
 
6537
+
 
6538
+int
 
6539
+main (int argc, char **argv)
 
6540
+{
 
6541
+BUILD_VARIANTS (ge, >=)
 
6542
+BUILD_VARIANTS (gt, >)
 
6543
+BUILD_VARIANTS (le, <=)
 
6544
+BUILD_VARIANTS (lt, <)
 
6545
+  return 0;
 
6546
+}
 
6547
+
 
6548
+/* { dg-final { cleanup-saved-temps } } */
 
6549
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vrnd.c
 
6550
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vrnd.c
 
6551
@@ -0,0 +1,117 @@
 
6552
+/* { dg-do run } */
 
6553
+/* { dg-options "-O3 --save-temps" } */
 
6554
+
 
6555
+#include <arm_neon.h>
 
6556
+
 
6557
+extern void abort (void);
 
6558
+extern float fabsf (float);
 
6559
+extern double fabs (double);
 
6560
+
 
6561
+extern double trunc (double);
 
6562
+extern double round (double);
 
6563
+extern double nearbyint (double);
 
6564
+extern double floor (double);
 
6565
+extern double ceil (double);
 
6566
+extern double rint (double);
 
6567
+
 
6568
+extern float truncf (float);
 
6569
+extern float roundf (float);
 
6570
+extern float nearbyintf (float);
 
6571
+extern float floorf (float);
 
6572
+extern float ceilf (float);
 
6573
+extern float rintf (float);
 
6574
+
 
6575
+#define NUM_TESTS 8
 
6576
+#define DELTA 0.000001
 
6577
+
 
6578
+float input_f32[] = {0.1f, -0.1f, 0.4f, 10.3f,
 
6579
+                    200.0f, -800.0f, -13.0f, -0.5f};
 
6580
+double input_f64[] = {0.1, -0.1, 0.4, 10.3,
 
6581
+                     200.0, -800.0, -13.0, -0.5};
 
6582
+
 
6583
+#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F)                         \
 
6584
+int                                                                    \
 
6585
+test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t (void)                  \
 
6586
+{                                                                      \
 
6587
+  int ret = 1;                                                         \
 
6588
+  int i = 0;                                                           \
 
6589
+  int nlanes = LANES;                                                  \
 
6590
+  float##WIDTH##_t expected_out[NUM_TESTS];                            \
 
6591
+  float##WIDTH##_t actual_out[NUM_TESTS];                              \
 
6592
+                                                                       \
 
6593
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
6594
+    {                                                                  \
 
6595
+      expected_out[i] = C_FN##F (input_f##WIDTH[i]);                   \
 
6596
+      /* Don't vectorize this.  */                                     \
 
6597
+      asm volatile ("" : : : "memory");                                        \
 
6598
+    }                                                                  \
 
6599
+                                                                       \
 
6600
+  /* Prevent the compiler from noticing these two loops do the same    \
 
6601
+     thing and optimizing away the comparison.  */                     \
 
6602
+  asm volatile ("" : : : "memory");                                    \
 
6603
+                                                                       \
 
6604
+  for (i = 0; i < NUM_TESTS; i+=nlanes)                                        \
 
6605
+    {                                                                  \
 
6606
+      float##WIDTH##x##LANES##_t out =                                 \
 
6607
+       vrnd##SUFFIX##Q##_f##WIDTH                                      \
 
6608
+               (vld1##Q##_f##WIDTH (input_f##WIDTH + i));              \
 
6609
+      vst1##Q##_f##WIDTH (actual_out + i, out);                                \
 
6610
+    }                                                                  \
 
6611
+                                                                       \
 
6612
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
6613
+    ret &= fabs##F (expected_out[i] - actual_out[i]) < DELTA;          \
 
6614
+                                                                       \
 
6615
+  return ret;                                                          \
 
6616
+}                                                                      \
 
6617
+
 
6618
+
 
6619
+#define BUILD_VARIANTS(SUFFIX, C_FN)   \
 
6620
+TEST (SUFFIX,  , 32, 2, C_FN, f)       \
 
6621
+TEST (SUFFIX, q, 32, 4, C_FN, f)       \
 
6622
+TEST (SUFFIX, q, 64, 2, C_FN,  )       \
 
6623
+
 
6624
+BUILD_VARIANTS ( , trunc)
 
6625
+/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6626
+/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6627
+/* { dg-final { scan-assembler "frintz\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6628
+BUILD_VARIANTS (a, round)
 
6629
+/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6630
+/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6631
+/* { dg-final { scan-assembler "frinta\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6632
+BUILD_VARIANTS (i, nearbyint)
 
6633
+/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6634
+/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6635
+/* { dg-final { scan-assembler "frinti\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6636
+BUILD_VARIANTS (m, floor)
 
6637
+/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6638
+/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6639
+/* { dg-final { scan-assembler "frintm\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6640
+BUILD_VARIANTS (p, ceil)
 
6641
+/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6642
+/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6643
+/* { dg-final { scan-assembler "frintp\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6644
+BUILD_VARIANTS (x, rint)
 
6645
+/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
6646
+/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
6647
+/* { dg-final { scan-assembler "frintx\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
6648
+
 
6649
+#undef TEST
 
6650
+#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F)                 \
 
6651
+{                                                              \
 
6652
+  if (!test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t ())      \
 
6653
+    abort ();                                                  \
 
6654
+}
 
6655
+
 
6656
+int
 
6657
+main (int argc, char **argv)
 
6658
+{
 
6659
+  BUILD_VARIANTS ( , trunc)
 
6660
+  BUILD_VARIANTS (a, round)
 
6661
+  BUILD_VARIANTS (i, nearbyint)
 
6662
+  BUILD_VARIANTS (m, floor)
 
6663
+  BUILD_VARIANTS (p, ceil)
 
6664
+  BUILD_VARIANTS (x, rint)
 
6665
+  return 0;
 
6666
+}
 
6667
+
 
6668
+/* { dg-final { cleanup-saved-temps } } */
 
6669
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.c
 
6670
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.c
 
6671
@@ -1,43 +1,7 @@
 
6672
 /* { dg-do compile } */
 
6673
 /* { dg-options "-O2" } */
 
6674
 
 
6675
-int v = 0;
 
6676
+#include "atomic-op-relaxed.x"
 
6677
 
 
6678
-int
 
6679
-atomic_fetch_add_RELAXED (int a)
 
6680
-{
 
6681
-  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
6682
-}
 
6683
-
 
6684
-int
 
6685
-atomic_fetch_sub_RELAXED (int a)
 
6686
-{
 
6687
-  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
6688
-}
 
6689
-
 
6690
-int
 
6691
-atomic_fetch_and_RELAXED (int a)
 
6692
-{
 
6693
-  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
6694
-}
 
6695
-
 
6696
-int
 
6697
-atomic_fetch_nand_RELAXED (int a)
 
6698
-{
 
6699
-  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
6700
-}
 
6701
-
 
6702
-int
 
6703
-atomic_fetch_xor_RELAXED (int a)
 
6704
-{
 
6705
-  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
6706
-}
 
6707
-
 
6708
-int
 
6709
-atomic_fetch_or_RELAXED (int a)
 
6710
-{
 
6711
-  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
6712
-}
 
6713
-
 
6714
 /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
6715
 /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
6716
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm.x
 
6717
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm.x
 
6718
@@ -13,6 +13,8 @@
 
6719
  2.0, -4.0, 8.0, -16.0,
 
6720
  -2.125, 4.25, -8.5, 17.0};
 
6721
 
 
6722
+/* Float comparisons, float results.  */
 
6723
+
 
6724
 void
 
6725
 foo (FTYPE *in1, FTYPE *in2, FTYPE *output)
 
6726
 {
 
6727
@@ -49,11 +51,52 @@
 
6728
     output[i] = (in1[i] INV_OP 0.0) ? 4.0 : 2.0;
 
6729
 }
 
6730
 
 
6731
+/* Float comparisons, int results.  */
 
6732
+
 
6733
+void
 
6734
+foo_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
 
6735
+{
 
6736
+  int i = 0;
 
6737
+  /* Vectorizable.  */
 
6738
+  for (i = 0; i < N; i++)
 
6739
+    output[i] = (in1[i] OP in2[i]) ? 2 : 4;
 
6740
+}
 
6741
+
 
6742
+void
 
6743
+bar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
 
6744
+{
 
6745
+  int i = 0;
 
6746
+  /* Vectorizable.  */
 
6747
+  for (i = 0; i < N; i++)
 
6748
+    output[i] = (in1[i] INV_OP in2[i]) ? 4 : 2;
 
6749
+}
 
6750
+
 
6751
+void
 
6752
+foobar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
 
6753
+{
 
6754
+  int i = 0;
 
6755
+  /* Vectorizable.  */
 
6756
+  for (i = 0; i < N; i++)
 
6757
+    output[i] = (in1[i] OP 0.0) ? 4 : 2;
 
6758
+}
 
6759
+
 
6760
+void
 
6761
+foobarbar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
 
6762
+{
 
6763
+  int i = 0;
 
6764
+  /* Vectorizable.  */
 
6765
+  for (i = 0; i < N; i++)
 
6766
+    output[i] = (in1[i] INV_OP 0.0) ? 4 : 2;
 
6767
+}
 
6768
+
 
6769
 int
 
6770
 main (int argc, char **argv)
 
6771
 {
 
6772
   FTYPE out1[N];
 
6773
   FTYPE out2[N];
 
6774
+  ITYPE outi1[N];
 
6775
+  ITYPE outi2[N];
 
6776
+
 
6777
   int i = 0;
 
6778
   foo (input1, input2, out1);
 
6779
   bar (input1, input2, out2);
 
6780
@@ -65,6 +108,17 @@
 
6781
   for (i = 0; i < N; i++)
 
6782
     if (out1[i] == out2[i])
 
6783
       abort ();
 
6784
+
 
6785
+  foo_int (input1, input2, outi1);
 
6786
+  bar_int (input1, input2, outi2);
 
6787
+  for (i = 0; i < N; i++)
 
6788
+    if (outi1[i] != outi2[i])
 
6789
+      abort ();
 
6790
+  foobar_int (input1, input2, outi1);
 
6791
+  foobarbar_int (input1, input2, outi2);
 
6792
+  for (i = 0; i < N; i++)
 
6793
+    if (outi1[i] == outi2[i])
 
6794
+      abort ();
 
6795
   return 0;
 
6796
 }
 
6797
 
 
6798
--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c
 
6799
+++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c
 
6800
@@ -0,0 +1,11 @@
 
6801
+
 
6802
+/* { dg-do compile } */
 
6803
+/* { dg-options "-O3" } */
 
6804
+
 
6805
+#include "arm_neon.h"
 
6806
+
 
6807
+#include "vaddv-intrinsic.x"
 
6808
+
 
6809
+/* { dg-final { scan-assembler "faddp\\ts\[0-9\]+"} } */
 
6810
+/* { dg-final { scan-assembler-times "faddp\\tv\[0-9\]+\.4s" 2} } */
 
6811
+/* { dg-final { scan-assembler "faddp\\td\[0-9\]+"} } */
 
6812
--- a/src/gcc/testsuite/gcc.target/aarch64/movi_1.c
 
6813
+++ b/src/gcc/testsuite/gcc.target/aarch64/movi_1.c
 
6814
@@ -0,0 +1,13 @@
 
6815
+/* { dg-do compile } */
 
6816
+/* { dg-options "-O2" } */
 
6817
+
 
6818
+void
 
6819
+dummy (short* b)
 
6820
+{
 
6821
+  /* { dg-final { scan-assembler "movi\tv\[0-9\]+\.4h, 0x4, lsl 8" } } */
 
6822
+  /* { dg-final { scan-assembler-not "movi\tv\[0-9\]+\.4h, 0x400" } } */
 
6823
+  /* { dg-final { scan-assembler-not "movi\tv\[0-9\]+\.4h, 1024" } } */
 
6824
+  register short x asm ("h8") = 1024;
 
6825
+  asm volatile ("" : : "w" (x));
 
6826
+  *b = x;
 
6827
+}
 
6828
--- a/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c
 
6829
+++ b/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c
 
6830
@@ -0,0 +1,101 @@
 
6831
+/* { dg-do run } */
 
6832
+/* { dg-options "-O3 --save-temps" } */
 
6833
+
 
6834
+#include <arm_neon.h>
 
6835
+
 
6836
+extern void abort (void);
 
6837
+
 
6838
+#define ETYPE(size) int##size##_t
 
6839
+#define VTYPE(size, lanes) int##size##x##lanes##_t
 
6840
+
 
6841
+#define TEST_VABS(q, size, lanes)                              \
 
6842
+static void                                                    \
 
6843
+test_vabs##q##_##size (ETYPE (size) * res,                     \
 
6844
+                       const ETYPE (size) *in1)                \
 
6845
+{                                                              \
 
6846
+  VTYPE (size, lanes) a = vld1##q##_s##size (res);             \
 
6847
+  VTYPE (size, lanes) b = vld1##q##_s##size (in1);             \
 
6848
+  a = vabs##q##_s##size (b);                                   \
 
6849
+  vst1##q##_s##size (res, a);                                  \
 
6850
+}
 
6851
+
 
6852
+#define BUILD_VARS(width, n_lanes, n_half_lanes)               \
 
6853
+TEST_VABS (, width, n_half_lanes)                              \
 
6854
+TEST_VABS (q, width, n_lanes)                                  \
 
6855
+
 
6856
+BUILD_VARS (64, 2, 1)
 
6857
+BUILD_VARS (32, 4, 2)
 
6858
+BUILD_VARS (16, 8, 4)
 
6859
+BUILD_VARS (8, 16, 8)
 
6860
+
 
6861
+#define POOL1  {-10}
 
6862
+#define POOL2  {2, -10}
 
6863
+#define POOL4  {0, -10, 2, -3}
 
6864
+#define POOL8  {0, -10, 2, -3, 4, -50, 6, -70}
 
6865
+#define POOL16 {0, -10, 2, -3, 4, -50, 6, -70,                 \
 
6866
+               -5, 10, -2, 3, -4, 50, -6, 70}
 
6867
+
 
6868
+#define EXPECTED1  {10}
 
6869
+#define EXPECTED2  {2, 10}
 
6870
+#define EXPECTED4  {0, 10, 2, 3}
 
6871
+#define EXPECTED8  {0, 10, 2, 3, 4, 50, 6, 70}
 
6872
+#define EXPECTED16 {0, 10, 2, 3, 4, 50, 6, 70,                 \
 
6873
+                   5, 10, 2, 3, 4, 50, 6, 70}
 
6874
+
 
6875
+#define BUILD_TEST(size, lanes_64, lanes_128)                  \
 
6876
+static void                                                    \
 
6877
+test_##size (void)                                             \
 
6878
+{                                                              \
 
6879
+  int i;                                                       \
 
6880
+  ETYPE (size) pool1[lanes_64] = POOL##lanes_64;               \
 
6881
+  ETYPE (size) res1[lanes_64] = {0};                           \
 
6882
+  ETYPE (size) expected1[lanes_64] = EXPECTED##lanes_64;       \
 
6883
+  ETYPE (size) pool2[lanes_128] = POOL##lanes_128;             \
 
6884
+  ETYPE (size) res2[lanes_128] = {0};                          \
 
6885
+  ETYPE (size) expected2[lanes_128] = EXPECTED##lanes_128;     \
 
6886
+                                                               \
 
6887
+  /* Forcefully avoid optimization.  */                                \
 
6888
+  asm volatile ("" : : : "memory");                            \
 
6889
+  test_vabs_##size (res1, pool1);                              \
 
6890
+  for (i = 0; i < lanes_64; i++)                               \
 
6891
+    if (res1[i] != expected1[i])                               \
 
6892
+      abort ();                                                        \
 
6893
+                                                               \
 
6894
+  /* Forcefully avoid optimization.  */                                \
 
6895
+  asm volatile ("" : : : "memory");                            \
 
6896
+  test_vabsq_##size (res2, pool2);                             \
 
6897
+  for (i = 0; i < lanes_128; i++)                              \
 
6898
+    if (res2[i] != expected2[i])                               \
 
6899
+      abort ();                                                        \
 
6900
+}
 
6901
+
 
6902
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 1 } } */
 
6903
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */
 
6904
+BUILD_TEST (8 , 8, 16)
 
6905
+
 
6906
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 1 } } */
 
6907
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */
 
6908
+BUILD_TEST (16, 4, 8)
 
6909
+
 
6910
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 1 } } */
 
6911
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
 
6912
+BUILD_TEST (32, 2, 4)
 
6913
+
 
6914
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
 
6915
+BUILD_TEST (64, 1, 2)
 
6916
+
 
6917
+#undef BUILD_TEST
 
6918
+
 
6919
+#define BUILD_TEST(size) test_##size ()
 
6920
+
 
6921
+int
 
6922
+main (int argc, char **argv)
 
6923
+{
 
6924
+  BUILD_TEST (8);
 
6925
+  BUILD_TEST (16);
 
6926
+  BUILD_TEST (32);
 
6927
+  BUILD_TEST (64);
 
6928
+  return 0;
 
6929
+}
 
6930
+
 
6931
+/* { dg-final { cleanup-saved-temps } } */
 
6932
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.x
 
6933
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-relaxed.x
 
6934
@@ -0,0 +1,37 @@
 
6935
+int v = 0;
 
6936
+
 
6937
+int
 
6938
+atomic_fetch_add_RELAXED (int a)
 
6939
+{
 
6940
+  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
6941
+}
 
6942
+
 
6943
+int
 
6944
+atomic_fetch_sub_RELAXED (int a)
 
6945
+{
 
6946
+  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
6947
+}
 
6948
+
 
6949
+int
 
6950
+atomic_fetch_and_RELAXED (int a)
 
6951
+{
 
6952
+  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
6953
+}
 
6954
+
 
6955
+int
 
6956
+atomic_fetch_nand_RELAXED (int a)
 
6957
+{
 
6958
+  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
6959
+}
 
6960
+
 
6961
+int
 
6962
+atomic_fetch_xor_RELAXED (int a)
 
6963
+{
 
6964
+  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
6965
+}
 
6966
+
 
6967
+int
 
6968
+atomic_fetch_or_RELAXED (int a)
 
6969
+{
 
6970
+  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
6971
+}
 
6972
--- a/src/gcc/testsuite/gcc.target/aarch64/vect.c
 
6973
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect.c
 
6974
@@ -55,6 +55,8 @@
 
6975
   int smin_vector[] = {0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15};
 
6976
   unsigned int umax_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
6977
   unsigned int umin_vector[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
6978
+  int sabd_vector[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
6979
+  int saba_vector[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 
6980
   int reduce_smax_value = 0;
 
6981
   int reduce_smin_value = -15;
 
6982
   unsigned int reduce_umax_value = 15;
 
6983
@@ -81,6 +83,8 @@
 
6984
   TEST (smin, s);
 
6985
   TEST (umax, u);
 
6986
   TEST (umin, u);
 
6987
+  TEST (sabd, s);
 
6988
+  TEST (saba, s);
 
6989
   TESTV (reduce_smax, s);
 
6990
   TESTV (reduce_smin, s);
 
6991
   TESTV (reduce_umax, u);
 
6992
--- a/src/gcc/testsuite/gcc.target/aarch64/scalar-mov.c
 
6993
+++ b/src/gcc/testsuite/gcc.target/aarch64/scalar-mov.c
 
6994
@@ -0,0 +1,9 @@
 
6995
+/* { dg-do compile } */
 
6996
+/* { dg-options "-g -mgeneral-regs-only" } */
 
6997
+
 
6998
+void
 
6999
+foo (const char *c, ...)
 
7000
+{
 
7001
+  char buf[256];
 
7002
+  buf[256 - 1] = '\0';
 
7003
+}
 
7004
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c
 
7005
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c
 
7006
@@ -0,0 +1,74 @@
 
7007
+/* { dg-do run } */
 
7008
+/* { dg-options "-O3 --save-temps -fno-inline" } */
 
7009
+
 
7010
+extern void abort (void);
 
7011
+
 
7012
+#define N 16
 
7013
+
 
7014
+static void
 
7015
+movi_msl8 (int *__restrict a)
 
7016
+{
 
7017
+  int i;
 
7018
+
 
7019
+  /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */
 
7020
+  for (i = 0; i < N; i++)
 
7021
+    a[i] = 0xabff;
 
7022
+}
 
7023
+
 
7024
+static void
 
7025
+movi_msl16 (int *__restrict a)
 
7026
+{
 
7027
+  int i;
 
7028
+
 
7029
+  /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */
 
7030
+  for (i = 0; i < N; i++)
 
7031
+    a[i] = 0xabffff;
 
7032
+}
 
7033
+
 
7034
+static void
 
7035
+mvni_msl8 (int *__restrict a)
 
7036
+{
 
7037
+  int i;
 
7038
+
 
7039
+  /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */
 
7040
+  for (i = 0; i < N; i++)
 
7041
+    a[i] = 0xffff5400;
 
7042
+}
 
7043
+
 
7044
+static void
 
7045
+mvni_msl16 (int *__restrict a)
 
7046
+{
 
7047
+  int i;
 
7048
+
 
7049
+  /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */
 
7050
+  for (i = 0; i < N; i++)
 
7051
+    a[i] = 0xff540000;
 
7052
+}
 
7053
+
 
7054
+int
 
7055
+main (void)
 
7056
+{
 
7057
+  int a[N] = { 0 };
 
7058
+  int i;
 
7059
+
 
7060
+#define CHECK_ARRAY(a, val)    \
 
7061
+  for (i = 0; i < N; i++)      \
 
7062
+    if (a[i] != val)           \
 
7063
+      abort ();
 
7064
+
 
7065
+  movi_msl8 (a);
 
7066
+  CHECK_ARRAY (a, 0xabff);
 
7067
+
 
7068
+  movi_msl16 (a);
 
7069
+  CHECK_ARRAY (a, 0xabffff);
 
7070
+
 
7071
+  mvni_msl8 (a);
 
7072
+  CHECK_ARRAY (a, 0xffff5400);
 
7073
+
 
7074
+  mvni_msl16 (a);
 
7075
+  CHECK_ARRAY (a, 0xff540000);
 
7076
+
 
7077
+  return 0;
 
7078
+}
 
7079
+
 
7080
+/* { dg-final { cleanup-saved-temps } } */
 
7081
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-d.c
 
7082
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-d.c
 
7083
@@ -2,12 +2,13 @@
 
7084
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
7085
 
 
7086
 #define FTYPE double
 
7087
+#define ITYPE long
 
7088
 #define OP >=
 
7089
 #define INV_OP <
 
7090
 
 
7091
 #include "vect-fcm.x"
 
7092
 
 
7093
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
7094
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
7095
 /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
7096
 /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */
 
7097
 /* { dg-final { scan-assembler "fcmlt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */
 
7098
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.c
 
7099
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.c
 
7100
@@ -1,43 +1,7 @@
 
7101
 /* { dg-do compile } */
 
7102
 /* { dg-options "-O2" } */
 
7103
 
 
7104
-int v = 0;
 
7105
+#include "atomic-op-acquire.x"
 
7106
 
 
7107
-int
 
7108
-atomic_fetch_add_ACQUIRE (int a)
 
7109
-{
 
7110
-  return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE);
 
7111
-}
 
7112
-
 
7113
-int
 
7114
-atomic_fetch_sub_ACQUIRE (int a)
 
7115
-{
 
7116
-  return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE);
 
7117
-}
 
7118
-
 
7119
-int
 
7120
-atomic_fetch_and_ACQUIRE (int a)
 
7121
-{
 
7122
-  return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE);
 
7123
-}
 
7124
-
 
7125
-int
 
7126
-atomic_fetch_nand_ACQUIRE (int a)
 
7127
-{
 
7128
-  return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE);
 
7129
-}
 
7130
-
 
7131
-int
 
7132
-atomic_fetch_xor_ACQUIRE (int a)
 
7133
-{
 
7134
-  return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE);
 
7135
-}
 
7136
-
 
7137
-int
 
7138
-atomic_fetch_or_ACQUIRE (int a)
 
7139
-{
 
7140
-  return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE);
 
7141
-}
 
7142
-
 
7143
 /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
7144
 /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
7145
--- a/src/gcc/testsuite/gcc.target/aarch64/abs_1.c
 
7146
+++ b/src/gcc/testsuite/gcc.target/aarch64/abs_1.c
 
7147
@@ -0,0 +1,53 @@
 
7148
+/* { dg-do run } */
 
7149
+/* { dg-options "-O2 -fno-inline --save-temps" } */
 
7150
+
 
7151
+extern long long llabs (long long);
 
7152
+extern void abort (void);
 
7153
+
 
7154
+long long
 
7155
+abs64 (long long a)
 
7156
+{
 
7157
+  /* { dg-final { scan-assembler "eor\t" } } */
 
7158
+  /* { dg-final { scan-assembler "sub\t" } } */
 
7159
+  return llabs (a);
 
7160
+}
 
7161
+
 
7162
+long long
 
7163
+abs64_in_dreg (long long a)
 
7164
+{
 
7165
+  /* { dg-final { scan-assembler "abs\td\[0-9\]+, d\[0-9\]+" } } */
 
7166
+  register long long x asm ("d8") = a;
 
7167
+  register long long y asm ("d9");
 
7168
+  asm volatile ("" : : "w" (x));
 
7169
+  y = llabs (x);
 
7170
+  asm volatile ("" : : "w" (y));
 
7171
+  return y;
 
7172
+}
 
7173
+
 
7174
+int
 
7175
+main (void)
 
7176
+{
 
7177
+  volatile long long ll0 = 0LL, ll1 = 1LL, llm1 = -1LL;
 
7178
+
 
7179
+  if (abs64 (ll0) != 0LL)
 
7180
+    abort ();
 
7181
+
 
7182
+  if (abs64 (ll1) != 1LL)
 
7183
+    abort ();
 
7184
+
 
7185
+  if (abs64 (llm1) != 1LL)
 
7186
+    abort ();
 
7187
+
 
7188
+  if (abs64_in_dreg (ll0) != 0LL)
 
7189
+    abort ();
 
7190
+
 
7191
+  if (abs64_in_dreg (ll1) != 1LL)
 
7192
+    abort ();
 
7193
+
 
7194
+  if (abs64_in_dreg (llm1) != 1LL)
 
7195
+    abort ();
 
7196
+
 
7197
+  return 0;
 
7198
+}
 
7199
+
 
7200
+/* { dg-final { cleanup-saved-temps } } */
 
7201
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.c
 
7202
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.c
 
7203
@@ -1,41 +1,7 @@
 
7204
 /* { dg-do compile } */
 
7205
 /* { dg-options "-O2" } */
 
7206
 
 
7207
-#define STRONG 0
 
7208
-#define WEAK 1
 
7209
-int v = 0;
 
7210
+#include "atomic-comp-swap-release-acquire.x"
 
7211
 
 
7212
-int
 
7213
-atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b)
 
7214
-{
 
7215
-  return __atomic_compare_exchange (&v, &a, &b,
 
7216
-                                   STRONG, __ATOMIC_RELEASE,
 
7217
-                                   __ATOMIC_ACQUIRE);
 
7218
-}
 
7219
-
 
7220
-int
 
7221
-atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b)
 
7222
-{
 
7223
-  return __atomic_compare_exchange (&v, &a, &b,
 
7224
-                                   WEAK, __ATOMIC_RELEASE,
 
7225
-                                   __ATOMIC_ACQUIRE);
 
7226
-}
 
7227
-
 
7228
-int
 
7229
-atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b)
 
7230
-{
 
7231
-  return __atomic_compare_exchange_n (&v, &a, b,
 
7232
-                                     STRONG, __ATOMIC_RELEASE,
 
7233
-                                     __ATOMIC_ACQUIRE);
 
7234
-}
 
7235
-
 
7236
-int
 
7237
-atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b)
 
7238
-{
 
7239
-  return __atomic_compare_exchange_n (&v, &a, b,
 
7240
-                                     WEAK, __ATOMIC_RELEASE,
 
7241
-                                     __ATOMIC_ACQUIRE);
 
7242
-}
 
7243
-
 
7244
 /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 4 } } */
 
7245
 /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 4 } } */
 
7246
--- a/src/gcc/testsuite/gcc.target/aarch64/vect.x
 
7247
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect.x
 
7248
@@ -138,3 +138,17 @@
 
7249
 
 
7250
   return s;
 
7251
 }
 
7252
+
 
7253
+void sabd (pRINT a, pRINT b, pRINT c)
 
7254
+{
 
7255
+  int i;
 
7256
+  for (i = 0; i < 16; i++)
 
7257
+    c[i] = abs (a[i] - b[i]);
 
7258
+}
 
7259
+
 
7260
+void saba (pRINT a, pRINT b, pRINT c)
 
7261
+{
 
7262
+  int i;
 
7263
+  for (i = 0; i < 16; i++)
 
7264
+    c[i] += abs (a[i] - b[i]);
 
7265
+}
 
7266
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c
 
7267
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c
 
7268
@@ -0,0 +1,35 @@
 
7269
+/* { dg-do run } */
 
7270
+/* { dg-options "-O3 -save-temps -fno-inline" } */
 
7271
+
 
7272
+extern void abort ();
 
7273
+
 
7274
+void
 
7275
+count_lz_v4si (unsigned *__restrict a, int *__restrict b)
 
7276
+{
 
7277
+  int i;
 
7278
+
 
7279
+  for (i = 0; i < 4; i++)
 
7280
+    b[i] = __builtin_clz (a[i]);
 
7281
+}
 
7282
+
 
7283
+/* { dg-final { scan-assembler "clz\tv\[0-9\]+\.4s" } } */
 
7284
+
 
7285
+int
 
7286
+main ()
 
7287
+{
 
7288
+  unsigned int x[4] = { 0x0, 0xFFFF, 0x1FFFF, 0xFFFFFFFF };
 
7289
+  int r[4] = { 32, 16, 15, 0 };
 
7290
+  int d[4], i;
 
7291
+
 
7292
+  count_lz_v4si (x, d);
 
7293
+
 
7294
+  for (i = 0; i < 4; i++)
 
7295
+    {
 
7296
+      if (d[i] != r[i])
 
7297
+       abort ();
 
7298
+    }
 
7299
+
 
7300
+  return 0;
 
7301
+}
 
7302
+
 
7303
+/* { dg-final { cleanup-saved-temps } } */
 
7304
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-f.c
 
7305
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-f.c
 
7306
@@ -2,12 +2,13 @@
 
7307
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
7308
 
 
7309
 #define FTYPE float
 
7310
+#define ITYPE int
 
7311
 #define OP >
 
7312
 #define INV_OP <=
 
7313
 
 
7314
 #include "vect-fcm.x"
 
7315
 
 
7316
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
7317
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
7318
 /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */
 
7319
 /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */
 
7320
 /* { dg-final { scan-assembler "fcmle\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */
 
7321
--- a/src/gcc/testsuite/gcc.target/aarch64/subs3.c
 
7322
+++ b/src/gcc/testsuite/gcc.target/aarch64/subs3.c
 
7323
@@ -0,0 +1,61 @@
 
7324
+/* { dg-do run } */
 
7325
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
7326
+
 
7327
+extern void abort (void);
 
7328
+typedef long long s64;
 
7329
+
 
7330
+int
 
7331
+subs_ext (s64 a, int b, int c)
 
7332
+{
 
7333
+ s64 d = a - b;
 
7334
+
 
7335
+  if (d == 0)
 
7336
+    return a + c;
 
7337
+  else
 
7338
+    return b + d + c;
 
7339
+}
 
7340
+
 
7341
+int
 
7342
+subs_shift_ext (s64 a, int b, int c)
 
7343
+{
 
7344
+ s64 d = (a - ((s64)b << 3));
 
7345
+
 
7346
+  if (d == 0)
 
7347
+    return a + c;
 
7348
+  else
 
7349
+    return b + d + c;
 
7350
+}
 
7351
+
 
7352
+int main ()
 
7353
+{
 
7354
+  int x;
 
7355
+  s64 y;
 
7356
+
 
7357
+  x = subs_ext (0x13000002ll, 41, 15);
 
7358
+  if (x != 318767121)
 
7359
+    abort ();
 
7360
+
 
7361
+  x = subs_ext (0x50505050ll, 29, 4);
 
7362
+  if (x != 1347440724)
 
7363
+    abort ();
 
7364
+
 
7365
+  x = subs_ext (0x12121212121ll, 2, 14);
 
7366
+  if (x != 555819311)
 
7367
+    abort ();
 
7368
+
 
7369
+  x = subs_shift_ext (0x123456789ll, 4, 12);
 
7370
+  if (x != 591751033)
 
7371
+    abort ();
 
7372
+
 
7373
+  x = subs_shift_ext (0x02020202ll, 9, 8);
 
7374
+  if (x != 33685963)
 
7375
+    abort ();
 
7376
+
 
7377
+  x = subs_shift_ext (0x987987987987ll, 23, 41);
 
7378
+  if (x != -2020050673)
 
7379
+    abort ();
 
7380
+
 
7381
+  return 0;
 
7382
+}
 
7383
+
 
7384
+/* { dg-final { scan-assembler-times "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, sxtw" 2 } } */
 
7385
--- a/src/gcc/testsuite/gcc.target/aarch64/bics_2.c
 
7386
+++ b/src/gcc/testsuite/gcc.target/aarch64/bics_2.c
 
7387
@@ -0,0 +1,111 @@
 
7388
+/* { dg-do run } */
 
7389
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
7390
+
 
7391
+extern void abort (void);
 
7392
+
 
7393
+int
 
7394
+bics_si_test1 (int a, int b, int c)
 
7395
+{
 
7396
+  int d = a & ~b;
 
7397
+
 
7398
+  /* { dg-final { scan-assembler-not "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
7399
+  /* { dg-final { scan-assembler-times "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
 
7400
+  if (d <= 0)
 
7401
+    return a + c;
 
7402
+  else
 
7403
+    return b + d + c;
 
7404
+}
 
7405
+
 
7406
+int
 
7407
+bics_si_test2 (int a, int b, int c)
 
7408
+{
 
7409
+  int d = a & ~(b << 3);
 
7410
+
 
7411
+  /* { dg-final { scan-assembler-not "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
7412
+  /* { dg-final { scan-assembler "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
7413
+  if (d <= 0)
 
7414
+    return a + c;
 
7415
+  else
 
7416
+    return b + d + c;
 
7417
+}
 
7418
+
 
7419
+typedef long long s64;
 
7420
+
 
7421
+s64
 
7422
+bics_di_test1 (s64 a, s64 b, s64 c)
 
7423
+{
 
7424
+  s64 d = a & ~b;
 
7425
+
 
7426
+  /* { dg-final { scan-assembler-not "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
7427
+  /* { dg-final { scan-assembler-times "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
 
7428
+  if (d <= 0)
 
7429
+    return a + c;
 
7430
+  else
 
7431
+    return b + d + c;
 
7432
+}
 
7433
+
 
7434
+s64
 
7435
+bics_di_test2 (s64 a, s64 b, s64 c)
 
7436
+{
 
7437
+  s64 d = a & ~(b << 3);
 
7438
+
 
7439
+  /* { dg-final { scan-assembler-not "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
7440
+  /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
7441
+  if (d <= 0)
 
7442
+    return a + c;
 
7443
+  else
 
7444
+    return b + d + c;
 
7445
+}
 
7446
+
 
7447
+int
 
7448
+main ()
 
7449
+{
 
7450
+  int x;
 
7451
+  s64 y;
 
7452
+
 
7453
+  x = bics_si_test1 (29, ~4, 5);
 
7454
+  if (x != ((29 & 4) + ~4 + 5))
 
7455
+    abort ();
 
7456
+
 
7457
+  x = bics_si_test1 (5, ~2, 20);
 
7458
+  if (x != 25)
 
7459
+    abort ();
 
7460
+
 
7461
+  x = bics_si_test2 (35, ~4, 5);
 
7462
+  if (x != ((35 & ~(~4 << 3)) + ~4 + 5))
 
7463
+    abort ();
 
7464
+
 
7465
+  x = bics_si_test2 (96, ~2, 20);
 
7466
+  if (x != 116)
 
7467
+    abort ();
 
7468
+
 
7469
+  y = bics_di_test1 (0x130000029ll,
 
7470
+                     ~0x320000004ll,
 
7471
+                     0x505050505ll);
 
7472
+
 
7473
+  if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll))
 
7474
+    abort ();
 
7475
+
 
7476
+  y = bics_di_test1 (0x5000500050005ll,
 
7477
+                     ~0x2111211121112ll,
 
7478
+                     0x0000000002020ll);
 
7479
+  if (y != 0x5000500052025ll)
 
7480
+    abort ();
 
7481
+
 
7482
+  y = bics_di_test2 (0x130000029ll,
 
7483
+                     ~0x064000008ll,
 
7484
+                     0x505050505ll);
 
7485
+  if (y != ((0x130000029ll & ~(~0x064000008ll << 3))
 
7486
+           + ~0x064000008ll + 0x505050505ll))
 
7487
+    abort ();
 
7488
+
 
7489
+  y = bics_di_test2 (0x130002900ll,
 
7490
+                     ~0x088000008ll,
 
7491
+                     0x505050505ll);
 
7492
+  if (y != (0x130002900ll + 0x505050505ll))
 
7493
+    abort ();
 
7494
+
 
7495
+  return 0;
 
7496
+}
 
7497
+
 
7498
+/* { dg-final { cleanup-saved-temps } } */
 
7499
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.x
 
7500
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acquire.x
 
7501
@@ -0,0 +1,37 @@
 
7502
+int v = 0;
 
7503
+
 
7504
+int
 
7505
+atomic_fetch_add_ACQUIRE (int a)
 
7506
+{
 
7507
+  return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE);
 
7508
+}
 
7509
+
 
7510
+int
 
7511
+atomic_fetch_sub_ACQUIRE (int a)
 
7512
+{
 
7513
+  return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE);
 
7514
+}
 
7515
+
 
7516
+int
 
7517
+atomic_fetch_and_ACQUIRE (int a)
 
7518
+{
 
7519
+  return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE);
 
7520
+}
 
7521
+
 
7522
+int
 
7523
+atomic_fetch_nand_ACQUIRE (int a)
 
7524
+{
 
7525
+  return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE);
 
7526
+}
 
7527
+
 
7528
+int
 
7529
+atomic_fetch_xor_ACQUIRE (int a)
 
7530
+{
 
7531
+  return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE);
 
7532
+}
 
7533
+
 
7534
+int
 
7535
+atomic_fetch_or_ACQUIRE (int a)
 
7536
+{
 
7537
+  return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE);
 
7538
+}
 
7539
--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c
 
7540
+++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c
 
7541
@@ -0,0 +1,28 @@
 
7542
+
 
7543
+/* { dg-do run } */
 
7544
+/* { dg-options "-O3" } */
 
7545
+
 
7546
+#include "arm_neon.h"
 
7547
+
 
7548
+extern void abort (void);
 
7549
+
 
7550
+#include "vaddv-intrinsic.x"
 
7551
+
 
7552
+int
 
7553
+main (void)
 
7554
+{
 
7555
+  const float32_t pool_v2sf[] = {4.0f, 9.0f};
 
7556
+  const float32_t pool_v4sf[] = {4.0f, 9.0f, 16.0f, 25.0f};
 
7557
+  const float64_t pool_v2df[] = {4.0, 9.0};
 
7558
+
 
7559
+  if (test_vaddv_v2sf (pool_v2sf) != 13.0f)
 
7560
+    abort ();
 
7561
+
 
7562
+  if (test_vaddv_v4sf (pool_v4sf) != 54.0f)
 
7563
+    abort ();
 
7564
+
 
7565
+  if (test_vaddv_v2df (pool_v2df) != 13.0)
 
7566
+    abort ();
 
7567
+
 
7568
+  return 0;
 
7569
+}
 
7570
--- a/src/gcc/testsuite/gcc.target/aarch64/sbc.c
 
7571
+++ b/src/gcc/testsuite/gcc.target/aarch64/sbc.c
 
7572
@@ -0,0 +1,41 @@
 
7573
+/* { dg-do run } */
 
7574
+/* { dg-options "-O2 --save-temps" } */
 
7575
+
 
7576
+extern void abort (void);
 
7577
+
 
7578
+typedef unsigned int u32int;
 
7579
+typedef unsigned long long u64int;
 
7580
+
 
7581
+u32int
 
7582
+test_si (u32int w1, u32int w2, u32int w3, u32int w4)
 
7583
+{
 
7584
+  u32int w0;
 
7585
+  /* { dg-final { scan-assembler "sbc\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+\n" } } */
 
7586
+  w0 = w1 - w2 - (w3 < w4);
 
7587
+  return w0;
 
7588
+}
 
7589
+
 
7590
+u64int
 
7591
+test_di (u64int x1, u64int x2, u64int x3, u64int x4)
 
7592
+{
 
7593
+  u64int x0;
 
7594
+  /* { dg-final { scan-assembler "sbc\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+\n" } } */
 
7595
+  x0 = x1 - x2 - (x3 < x4);
 
7596
+  return x0;
 
7597
+}
 
7598
+
 
7599
+int
 
7600
+main ()
 
7601
+{
 
7602
+  u32int x;
 
7603
+  u64int y;
 
7604
+  x = test_si (7, 8, 12, 15);
 
7605
+  if (x != -2)
 
7606
+    abort();
 
7607
+  y = test_di (0x987654321ll, 0x123456789ll, 0x345345345ll, 0x123123123ll);
 
7608
+  if (y != 0x8641fdb98ll)
 
7609
+    abort();
 
7610
+  return 0;
 
7611
+}
 
7612
+
 
7613
+/* { dg-final { cleanup-saved-temps } } */
 
7614
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.x
 
7615
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-comp-swap-release-acquire.x
 
7616
@@ -0,0 +1,36 @@
 
7617
+
 
7618
+#define STRONG 0
 
7619
+#define WEAK 1
 
7620
+int v = 0;
 
7621
+
 
7622
+int
 
7623
+atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b)
 
7624
+{
 
7625
+  return __atomic_compare_exchange (&v, &a, &b,
 
7626
+                                   STRONG, __ATOMIC_RELEASE,
 
7627
+                                   __ATOMIC_ACQUIRE);
 
7628
+}
 
7629
+
 
7630
+int
 
7631
+atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b)
 
7632
+{
 
7633
+  return __atomic_compare_exchange (&v, &a, &b,
 
7634
+                                   WEAK, __ATOMIC_RELEASE,
 
7635
+                                   __ATOMIC_ACQUIRE);
 
7636
+}
 
7637
+
 
7638
+int
 
7639
+atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b)
 
7640
+{
 
7641
+  return __atomic_compare_exchange_n (&v, &a, b,
 
7642
+                                     STRONG, __ATOMIC_RELEASE,
 
7643
+                                     __ATOMIC_ACQUIRE);
 
7644
+}
 
7645
+
 
7646
+int
 
7647
+atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b)
 
7648
+{
 
7649
+  return __atomic_compare_exchange_n (&v, &a, b,
 
7650
+                                     WEAK, __ATOMIC_RELEASE,
 
7651
+                                     __ATOMIC_ACQUIRE);
 
7652
+}
 
7653
--- a/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
 
7654
+++ b/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
 
7655
@@ -1,8 +1,14 @@
 
7656
 /* { dg-do compile } */
 
7657
-/* { dg-options "-O2" } */
 
7658
+/* { dg-options "-O2 -dp" } */
 
7659
 
 
7660
-#include "../../../config/aarch64/arm_neon.h"
 
7661
+#include <arm_neon.h>
 
7662
 
 
7663
+/* Used to force a variable to a SIMD register.  */
 
7664
+#define force_simd(V1)   asm volatile ("mov %d0, %1.d[0]"      \
 
7665
+          : "=w"(V1)                                           \
 
7666
+          : "w"(V1)                                            \
 
7667
+          : /* No clobbers */);
 
7668
+
 
7669
 /* { dg-final { scan-assembler-times "\\tadd\\tx\[0-9\]+" 2 } } */
 
7670
 
 
7671
 uint64x1_t
 
7672
@@ -26,12 +32,29 @@
 
7673
                     vqaddd_s64 (a, d));
 
7674
 }
 
7675
 
 
7676
+/* { dg-final { scan-assembler-times "\\tabs\\td\[0-9\]+, d\[0-9\]+" 1 } } */
 
7677
+
 
7678
+int64x1_t
 
7679
+test_vabs_s64 (int64x1_t a)
 
7680
+{
 
7681
+  uint64x1_t res;
 
7682
+  force_simd (a);
 
7683
+  res = vabs_s64 (a);
 
7684
+  force_simd (res);
 
7685
+  return res;
 
7686
+}
 
7687
+
 
7688
 /* { dg-final { scan-assembler-times "\\tcmeq\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
 
7689
 
 
7690
 uint64x1_t
 
7691
 test_vceqd_s64 (int64x1_t a, int64x1_t b)
 
7692
 {
 
7693
-  return vceqd_s64 (a, b);
 
7694
+  uint64x1_t res;
 
7695
+  force_simd (a);
 
7696
+  force_simd (b);
 
7697
+  res = vceqd_s64 (a, b);
 
7698
+  force_simd (res);
 
7699
+  return res;
 
7700
 }
 
7701
 
 
7702
 /* { dg-final { scan-assembler-times "\\tcmeq\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
 
7703
@@ -39,7 +62,11 @@
 
7704
 uint64x1_t
 
7705
 test_vceqzd_s64 (int64x1_t a)
 
7706
 {
 
7707
-  return vceqzd_s64 (a);
 
7708
+  uint64x1_t res;
 
7709
+  force_simd (a);
 
7710
+  res = vceqzd_s64 (a);
 
7711
+  force_simd (res);
 
7712
+  return res;
 
7713
 }
 
7714
 
 
7715
 /* { dg-final { scan-assembler-times "\\tcmge\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
 
7716
@@ -47,21 +74,36 @@
 
7717
 uint64x1_t
 
7718
 test_vcged_s64 (int64x1_t a, int64x1_t b)
 
7719
 {
 
7720
-  return vcged_s64 (a, b);
 
7721
+  uint64x1_t res;
 
7722
+  force_simd (a);
 
7723
+  force_simd (b);
 
7724
+  res = vcged_s64 (a, b);
 
7725
+  force_simd (res);
 
7726
+  return res;
 
7727
 }
 
7728
 
 
7729
 uint64x1_t
 
7730
 test_vcled_s64 (int64x1_t a, int64x1_t b)
 
7731
 {
 
7732
-  return vcled_s64 (a, b);
 
7733
+  uint64x1_t res;
 
7734
+  force_simd (a);
 
7735
+  force_simd (b);
 
7736
+  res = vcled_s64 (a, b);
 
7737
+  force_simd (res);
 
7738
+  return res;
 
7739
 }
 
7740
 
 
7741
-/* { dg-final { scan-assembler-times "\\tcmge\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
 
7742
+/* Idiom recognition will cause this testcase not to generate
 
7743
+   the expected cmge instruction, so do not check for it.  */
 
7744
 
 
7745
 uint64x1_t
 
7746
 test_vcgezd_s64 (int64x1_t a)
 
7747
 {
 
7748
-  return vcgezd_s64 (a);
 
7749
+  uint64x1_t res;
 
7750
+  force_simd (a);
 
7751
+  res = vcgezd_s64 (a);
 
7752
+  force_simd (res);
 
7753
+  return res;
 
7754
 }
 
7755
 
 
7756
 /* { dg-final { scan-assembler-times "\\tcmhs\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
 
7757
@@ -69,7 +111,12 @@
 
7758
 uint64x1_t
 
7759
 test_vcged_u64 (uint64x1_t a, uint64x1_t b)
 
7760
 {
 
7761
-  return vcged_u64 (a, b);
 
7762
+  uint64x1_t res;
 
7763
+  force_simd (a);
 
7764
+  force_simd (b);
 
7765
+  res = vcged_u64 (a, b);
 
7766
+  force_simd (res);
 
7767
+  return res;
 
7768
 }
 
7769
 
 
7770
 /* { dg-final { scan-assembler-times "\\tcmgt\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
 
7771
@@ -77,13 +124,23 @@
 
7772
 uint64x1_t
 
7773
 test_vcgtd_s64 (int64x1_t a, int64x1_t b)
 
7774
 {
 
7775
-  return vcgtd_s64 (a, b);
 
7776
+  uint64x1_t res;
 
7777
+  force_simd (a);
 
7778
+  force_simd (b);
 
7779
+  res = vcgtd_s64 (a, b);
 
7780
+  force_simd (res);
 
7781
+  return res;
 
7782
 }
 
7783
 
 
7784
 uint64x1_t
 
7785
 test_vcltd_s64 (int64x1_t a, int64x1_t b)
 
7786
 {
 
7787
-  return vcltd_s64 (a, b);
 
7788
+  uint64x1_t res;
 
7789
+  force_simd (a);
 
7790
+  force_simd (b);
 
7791
+  res = vcltd_s64 (a, b);
 
7792
+  force_simd (res);
 
7793
+  return res;
 
7794
 }
 
7795
 
 
7796
 /* { dg-final { scan-assembler-times "\\tcmgt\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
 
7797
@@ -91,7 +148,11 @@
 
7798
 uint64x1_t
 
7799
 test_vcgtzd_s64 (int64x1_t a)
 
7800
 {
 
7801
-  return vcgtzd_s64 (a);
 
7802
+  uint64x1_t res;
 
7803
+  force_simd (a);
 
7804
+  res = vcgtzd_s64 (a);
 
7805
+  force_simd (res);
 
7806
+  return res;
 
7807
 }
 
7808
 
 
7809
 /* { dg-final { scan-assembler-times "\\tcmhi\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
 
7810
@@ -99,7 +160,12 @@
 
7811
 uint64x1_t
 
7812
 test_vcgtd_u64 (uint64x1_t a, uint64x1_t b)
 
7813
 {
 
7814
-  return vcgtd_u64 (a, b);
 
7815
+  uint64x1_t res;
 
7816
+  force_simd (a);
 
7817
+  force_simd (b);
 
7818
+  res = vcgtd_u64 (a, b);
 
7819
+  force_simd (res);
 
7820
+  return res;
 
7821
 }
 
7822
 
 
7823
 /* { dg-final { scan-assembler-times "\\tcmle\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
 
7824
@@ -107,18 +173,27 @@
 
7825
 uint64x1_t
 
7826
 test_vclezd_s64 (int64x1_t a)
 
7827
 {
 
7828
-  return vclezd_s64 (a);
 
7829
+  uint64x1_t res;
 
7830
+  force_simd (a);
 
7831
+  res = vclezd_s64 (a);
 
7832
+  force_simd (res);
 
7833
+  return res;
 
7834
 }
 
7835
 
 
7836
-/* { dg-final { scan-assembler-times "\\tcmlt\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
 
7837
+/* Idiom recognition will cause this testcase not to generate
 
7838
+   the expected cmlt instruction, so do not check for it.  */
 
7839
 
 
7840
 uint64x1_t
 
7841
 test_vcltzd_s64 (int64x1_t a)
 
7842
 {
 
7843
-  return vcltzd_s64 (a);
 
7844
+  uint64x1_t res;
 
7845
+  force_simd (a);
 
7846
+  res = vcltzd_s64 (a);
 
7847
+  force_simd (res);
 
7848
+  return res;
 
7849
 }
 
7850
 
 
7851
-/* { dg-final { scan-assembler-times "\\tdup\\tb\[0-9\]+, v\[0-9\]+\.b" 2 } } */
 
7852
+/* { dg-final { scan-assembler-times "aarch64_get_lanev16qi" 2 } } */
 
7853
 
 
7854
 int8x1_t
 
7855
 test_vdupb_lane_s8 (int8x16_t a)
 
7856
@@ -132,7 +207,7 @@
 
7857
   return vdupb_lane_u8 (a, 2);
 
7858
 }
 
7859
 
 
7860
-/* { dg-final { scan-assembler-times "\\tdup\\th\[0-9\]+, v\[0-9\]+\.h" 2 } } */
 
7861
+/* { dg-final { scan-assembler-times "aarch64_get_lanev8hi" 2 } } */
 
7862
 
 
7863
 int16x1_t
 
7864
 test_vduph_lane_s16 (int16x8_t a)
 
7865
@@ -146,7 +221,7 @@
 
7866
   return vduph_lane_u16 (a, 2);
 
7867
 }
 
7868
 
 
7869
-/* { dg-final { scan-assembler-times "\\tdup\\ts\[0-9\]+, v\[0-9\]+\.s" 2 } } */
 
7870
+/* { dg-final { scan-assembler-times "aarch64_get_lanev4si" 2 } } */
 
7871
 
 
7872
 int32x1_t
 
7873
 test_vdups_lane_s32 (int32x4_t a)
 
7874
@@ -160,18 +235,18 @@
 
7875
   return vdups_lane_u32 (a, 2);
 
7876
 }
 
7877
 
 
7878
-/* { dg-final { scan-assembler-times "\\tdup\\td\[0-9\]+, v\[0-9\]+\.d" 2 } } */
 
7879
+/* { dg-final { scan-assembler-times "aarch64_get_lanev2di" 2 } } */
 
7880
 
 
7881
 int64x1_t
 
7882
 test_vdupd_lane_s64 (int64x2_t a)
 
7883
 {
 
7884
-  return vdupd_lane_s64 (a, 2);
 
7885
+  return vdupd_lane_s64 (a, 1);
 
7886
 }
 
7887
 
 
7888
 uint64x1_t
 
7889
 test_vdupd_lane_u64 (uint64x2_t a)
 
7890
 {
 
7891
-  return vdupd_lane_u64 (a, 2);
 
7892
+  return vdupd_lane_u64 (a, 1);
 
7893
 }
 
7894
 
 
7895
 /* { dg-final { scan-assembler-times "\\tcmtst\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
 
7896
@@ -179,13 +254,23 @@
 
7897
 int64x1_t
 
7898
 test_vtst_s64 (int64x1_t a, int64x1_t b)
 
7899
 {
 
7900
-  return vtstd_s64 (a, b);
 
7901
+  uint64x1_t res;
 
7902
+  force_simd (a);
 
7903
+  force_simd (b);
 
7904
+  res = vtstd_s64 (a, b);
 
7905
+  force_simd (res);
 
7906
+  return res;
 
7907
 }
 
7908
 
 
7909
 uint64x1_t
 
7910
 test_vtst_u64 (uint64x1_t a, uint64x1_t b)
 
7911
 {
 
7912
-  return vtstd_u64 (a, b);
 
7913
+  uint64x1_t res;
 
7914
+  force_simd (a);
 
7915
+  force_simd (b);
 
7916
+  res = vtstd_s64 (a, b);
 
7917
+  force_simd (res);
 
7918
+  return res;
 
7919
 }
 
7920
 
 
7921
 /* { dg-final { scan-assembler-times "\\taddp\\td\[0-9\]+, v\[0-9\]+\.2d" 1 } } */
 
7922
@@ -722,8 +807,11 @@
 
7923
   return vrshld_u64 (a, b);
 
7924
 }
 
7925
 
 
7926
-/* { dg-final { scan-assembler-times "\\tasr\\tx\[0-9\]+" 1 } } */
 
7927
+/* Other intrinsics can generate an asr instruction (vcltzd, vcgezd),
 
7928
+   so we cannot check scan-assembler-times.  */
 
7929
 
 
7930
+/* { dg-final { scan-assembler "\\tasr\\tx\[0-9\]+" } } */
 
7931
+
 
7932
 int64x1_t
 
7933
 test_vshrd_n_s64 (int64x1_t a)
 
7934
 {
 
7935
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c
 
7936
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c
 
7937
@@ -1,43 +1,7 @@
 
7938
 /* { dg-do compile } */
 
7939
 /* { dg-options "-O2" } */
 
7940
 
 
7941
-int v = 0;
 
7942
+#include "atomic-op-int.x"
 
7943
 
 
7944
-int
 
7945
-atomic_fetch_add_RELAXED (int a)
 
7946
-{
 
7947
-  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
7948
-}
 
7949
-
 
7950
-int
 
7951
-atomic_fetch_sub_RELAXED (int a)
 
7952
-{
 
7953
-  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
7954
-}
 
7955
-
 
7956
-int
 
7957
-atomic_fetch_and_RELAXED (int a)
 
7958
-{
 
7959
-  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
7960
-}
 
7961
-
 
7962
-int
 
7963
-atomic_fetch_nand_RELAXED (int a)
 
7964
-{
 
7965
-  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
7966
-}
 
7967
-
 
7968
-int
 
7969
-atomic_fetch_xor_RELAXED (int a)
 
7970
-{
 
7971
-  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
7972
-}
 
7973
-
 
7974
-int
 
7975
-atomic_fetch_or_RELAXED (int a)
 
7976
-{
 
7977
-  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
7978
-}
 
7979
-
 
7980
 /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
7981
 /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
7982
--- a/src/gcc/testsuite/gcc.target/aarch64/cmn-neg.c
 
7983
+++ b/src/gcc/testsuite/gcc.target/aarch64/cmn-neg.c
 
7984
@@ -0,0 +1,33 @@
 
7985
+/* { dg-do run } */
 
7986
+/* { dg-options "-O2 --save-temps" } */
 
7987
+
 
7988
+extern void abort (void);
 
7989
+
 
7990
+void __attribute__ ((noinline))
 
7991
+foo_s32 (int a, int b)
 
7992
+{
 
7993
+  if (a < -b)
 
7994
+    abort ();
 
7995
+}
 
7996
+/* { dg-final { scan-assembler "cmn\tw\[0-9\]" } } */
 
7997
+
 
7998
+void __attribute__ ((noinline))
 
7999
+foo_s64 (long long a, long long b)
 
8000
+{
 
8001
+  if (a < -b)
 
8002
+    abort ();
 
8003
+}
 
8004
+/* { dg-final { scan-assembler "cmn\tx\[0-9\]" } } */
 
8005
+
 
8006
+
 
8007
+int
 
8008
+main (void)
 
8009
+{
 
8010
+  int a = 30;
 
8011
+  int b = 42;
 
8012
+  foo_s32 (a, b);
 
8013
+  foo_s64 (a, b);
 
8014
+  return 0;
 
8015
+}
 
8016
+
 
8017
+/* { dg-final { cleanup-saved-temps } } */
 
8018
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.c
 
8019
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.c
 
8020
@@ -1,43 +1,7 @@
 
8021
 /* { dg-do compile } */
 
8022
 /* { dg-options "-O2" } */
 
8023
 
 
8024
-int v = 0;
 
8025
+#include "atomic-op-seq_cst.x"
 
8026
 
 
8027
-int
 
8028
-atomic_fetch_add_SEQ_CST (int a)
 
8029
-{
 
8030
-  return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST);
 
8031
-}
 
8032
-
 
8033
-int
 
8034
-atomic_fetch_sub_SEQ_CST (int a)
 
8035
-{
 
8036
-  return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST);
 
8037
-}
 
8038
-
 
8039
-int
 
8040
-atomic_fetch_and_SEQ_CST (int a)
 
8041
-{
 
8042
-  return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST);
 
8043
-}
 
8044
-
 
8045
-int
 
8046
-atomic_fetch_nand_SEQ_CST (int a)
 
8047
-{
 
8048
-  return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST);
 
8049
-}
 
8050
-
 
8051
-int
 
8052
-atomic_fetch_xor_SEQ_CST (int a)
 
8053
-{
 
8054
-  return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST);
 
8055
-}
 
8056
-
 
8057
-int
 
8058
-atomic_fetch_or_SEQ_CST (int a)
 
8059
-{
 
8060
-  return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST);
 
8061
-}
 
8062
-
 
8063
 /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8064
 /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8065
--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.x
 
8066
+++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.x
 
8067
@@ -0,0 +1,27 @@
 
8068
+
 
8069
+float32_t
 
8070
+test_vaddv_v2sf (const float32_t *pool)
 
8071
+{
 
8072
+  float32x2_t val;
 
8073
+
 
8074
+  val = vld1_f32 (pool);
 
8075
+  return vaddv_f32 (val);
 
8076
+}
 
8077
+
 
8078
+float32_t
 
8079
+test_vaddv_v4sf (const float32_t *pool)
 
8080
+{
 
8081
+  float32x4_t val;
 
8082
+
 
8083
+  val = vld1q_f32 (pool);
 
8084
+  return vaddvq_f32 (val);
 
8085
+}
 
8086
+
 
8087
+float64_t
 
8088
+test_vaddv_v2df (const float64_t *pool)
 
8089
+{
 
8090
+  float64x2_t val;
 
8091
+
 
8092
+  val = vld1q_f64 (pool);
 
8093
+  return vaddvq_f64 (val);
 
8094
+}
 
8095
--- a/src/gcc/testsuite/gcc.target/aarch64/negs.c
 
8096
+++ b/src/gcc/testsuite/gcc.target/aarch64/negs.c
 
8097
@@ -0,0 +1,108 @@
 
8098
+/* { dg-do run } */
 
8099
+/* { dg-options "-O2 --save-temps" } */
 
8100
+
 
8101
+extern void abort (void);
 
8102
+int z;
 
8103
+
 
8104
+int
 
8105
+negs_si_test1 (int a, int b, int c)
 
8106
+{
 
8107
+  int d = -b;
 
8108
+
 
8109
+  /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+" } } */
 
8110
+  if (d < 0)
 
8111
+    return a + c;
 
8112
+
 
8113
+  z = d;
 
8114
+    return b + c + d;
 
8115
+}
 
8116
+
 
8117
+int
 
8118
+negs_si_test3 (int a, int b, int c)
 
8119
+{
 
8120
+  int d = -(b) << 3;
 
8121
+
 
8122
+  /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
8123
+  if (d == 0)
 
8124
+    return a + c;
 
8125
+
 
8126
+  z = d;
 
8127
+    return b + c + d;
 
8128
+}
 
8129
+
 
8130
+typedef long long s64;
 
8131
+s64 zz;
 
8132
+
 
8133
+s64
 
8134
+negs_di_test1 (s64 a, s64 b, s64 c)
 
8135
+{
 
8136
+  s64 d = -b;
 
8137
+
 
8138
+  /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+" } } */
 
8139
+  if (d < 0)
 
8140
+    return a + c;
 
8141
+
 
8142
+  zz = d;
 
8143
+    return b + c + d;
 
8144
+}
 
8145
+
 
8146
+s64
 
8147
+negs_di_test3 (s64 a, s64 b, s64 c)
 
8148
+{
 
8149
+  s64 d = -(b) << 3;
 
8150
+
 
8151
+  /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
8152
+  if (d == 0)
 
8153
+    return a + c;
 
8154
+
 
8155
+  zz = d;
 
8156
+    return b + c + d;
 
8157
+}
 
8158
+
 
8159
+int main ()
 
8160
+{
 
8161
+  int x;
 
8162
+  s64 y;
 
8163
+
 
8164
+  x = negs_si_test1 (2, 12, 5);
 
8165
+  if (x != 7)
 
8166
+    abort ();
 
8167
+
 
8168
+  x = negs_si_test1 (1, 2, 32);
 
8169
+  if (x != 33)
 
8170
+    abort ();
 
8171
+
 
8172
+  x = negs_si_test3 (13, 14, 5);
 
8173
+  if (x != -93)
 
8174
+    abort ();
 
8175
+
 
8176
+  x = negs_si_test3 (15, 21, 2);
 
8177
+  if (x != -145)
 
8178
+    abort ();
 
8179
+
 
8180
+  y = negs_di_test1 (0x20202020ll,
 
8181
+                    0x65161611ll,
 
8182
+                    0x42434243ll);
 
8183
+  if (y != 0x62636263ll)
 
8184
+    abort ();
 
8185
+
 
8186
+  y = negs_di_test1 (0x1010101010101ll,
 
8187
+                    0x123456789abcdll,
 
8188
+                    0x5555555555555ll);
 
8189
+  if (y != 0x6565656565656ll)
 
8190
+    abort ();
 
8191
+
 
8192
+  y = negs_di_test3 (0x62523781ll,
 
8193
+                    0x64234978ll,
 
8194
+                    0x12345123ll);
 
8195
+  if (y != 0xfffffffd553d4edbll)
 
8196
+    abort ();
 
8197
+
 
8198
+  y = negs_di_test3 (0x763526268ll,
 
8199
+                    0x101010101ll,
 
8200
+                    0x222222222ll);
 
8201
+  if (y != 0xfffffffb1b1b1b1bll)
 
8202
+    abort ();
 
8203
+
 
8204
+  return 0;
 
8205
+}
 
8206
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c
 
8207
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c
 
8208
@@ -1,43 +1,7 @@
 
8209
 /* { dg-do compile } */
 
8210
 /* { dg-options "-O2" } */
 
8211
 
 
8212
-int v = 0;
 
8213
+#include "atomic-op-consume.x"
 
8214
 
 
8215
-int
 
8216
-atomic_fetch_add_CONSUME (int a)
 
8217
-{
 
8218
-  return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME);
 
8219
-}
 
8220
-
 
8221
-int
 
8222
-atomic_fetch_sub_CONSUME (int a)
 
8223
-{
 
8224
-  return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME);
 
8225
-}
 
8226
-
 
8227
-int
 
8228
-atomic_fetch_and_CONSUME (int a)
 
8229
-{
 
8230
-  return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME);
 
8231
-}
 
8232
-
 
8233
-int
 
8234
-atomic_fetch_nand_CONSUME (int a)
 
8235
-{
 
8236
-  return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME);
 
8237
-}
 
8238
-
 
8239
-int
 
8240
-atomic_fetch_xor_CONSUME (int a)
 
8241
-{
 
8242
-  return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME);
 
8243
-}
 
8244
-
 
8245
-int
 
8246
-atomic_fetch_or_CONSUME (int a)
 
8247
-{
 
8248
-  return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME);
 
8249
-}
 
8250
-
 
8251
 /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8252
 /* { dg-final { scan-assembler-times "stxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8253
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vaddv.c
 
8254
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vaddv.c
 
8255
@@ -0,0 +1,128 @@
 
8256
+/* { dg-do run } */
 
8257
+/* { dg-options "-O3 --save-temps -ffast-math" } */
 
8258
+
 
8259
+#include <arm_neon.h>
 
8260
+
 
8261
+extern void abort (void);
 
8262
+extern float fabsf (float);
 
8263
+extern double fabs (double);
 
8264
+
 
8265
+#define NUM_TESTS 16
 
8266
+#define DELTA 0.000001
 
8267
+
 
8268
+int8_t input_int8[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
8269
+                      -4, 34, 110, -110, 6, 4, 75, -34};
 
8270
+int16_t input_int16[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
8271
+                        -4, 34, 110, -110, 6, 4, 75, -34};
 
8272
+int32_t input_int32[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
8273
+                        -4, 34, 110, -110, 6, 4, 75, -34};
 
8274
+int64_t input_int64[] = {1, 56, 2, -9, -90, 23, 54, 76,
 
8275
+                        -4, 34, 110, -110, 6, 4, 75, -34};
 
8276
+
 
8277
+uint8_t input_uint8[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
8278
+                        4, 34, 110, 110, 6, 4, 75, 34};
 
8279
+uint16_t input_uint16[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
8280
+                          4, 34, 110, 110, 6, 4, 75, 34};
 
8281
+uint32_t input_uint32[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
8282
+                          4, 34, 110, 110, 6, 4, 75, 34};
 
8283
+
 
8284
+uint64_t input_uint64[] = {1, 56, 2, 9, 90, 23, 54, 76,
 
8285
+                          4, 34, 110, 110, 6, 4, 75, 34};
 
8286
+
 
8287
+float input_float32[] = {0.1f, -0.1f, 0.4f, 10.3f,
 
8288
+                        200.0f, -800.0f, -13.0f, -0.5f,
 
8289
+                        7.9f, -870.0f, 10.4f, 310.11f,
 
8290
+                        0.0f, -865.0f, -2213.0f, -1.5f};
 
8291
+
 
8292
+double input_float64[] = {0.1, -0.1, 0.4, 10.3,
 
8293
+                         200.0, -800.0, -13.0, -0.5,
 
8294
+                         7.9, -870.0, 10.4, 310.11,
 
8295
+                         0.0, -865.0, -2213.0, -1.5};
 
8296
+
 
8297
+#define EQUALF(a, b) (fabsf (a - b) < DELTA)
 
8298
+#define EQUALD(a, b) (fabs (a - b) < DELTA)
 
8299
+#define EQUALL(a, b) (a == b)
 
8300
+
 
8301
+#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT)                            \
 
8302
+int                                                                    \
 
8303
+test_vaddv##SUFFIX##_##TYPE##x##LANES##_t (void)                       \
 
8304
+{                                                                      \
 
8305
+  int i, j;                                                            \
 
8306
+  int moves = (NUM_TESTS - LANES) + 1;                                 \
 
8307
+  TYPE##_t out_l[NUM_TESTS];                                           \
 
8308
+  TYPE##_t out_v[NUM_TESTS];                                           \
 
8309
+                                                                       \
 
8310
+  /* Calculate linearly.  */                                           \
 
8311
+  for (i = 0; i < moves; i++)                                          \
 
8312
+    {                                                                  \
 
8313
+      out_l[i] = input_##TYPE[i];                                      \
 
8314
+      for (j = 1; j < LANES; j++)                                      \
 
8315
+       out_l[i] += input_##TYPE[i + j];                                \
 
8316
+    }                                                                  \
 
8317
+                                                                       \
 
8318
+  /* Calculate using vector reduction intrinsics.  */                  \
 
8319
+  for (i = 0; i < moves; i++)                                          \
 
8320
+    {                                                                  \
 
8321
+      TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i);   \
 
8322
+      out_v[i] = vaddv##Q##_##SUFFIX (t1);                             \
 
8323
+    }                                                                  \
 
8324
+                                                                       \
 
8325
+  /* Compare.  */                                                      \
 
8326
+  for (i = 0; i < moves; i++)                                          \
 
8327
+    {                                                                  \
 
8328
+      if (!EQUAL##FLOAT (out_v[i], out_l[i]))                          \
 
8329
+       return 0;                                                       \
 
8330
+    }                                                                  \
 
8331
+  return 1;                                                            \
 
8332
+}
 
8333
+
 
8334
+#define BUILD_VARIANTS(TYPE, STYPE, W32, W64, F)       \
 
8335
+TEST (STYPE,  , TYPE, W32, F)                          \
 
8336
+TEST (STYPE, q, TYPE, W64, F)                          \
 
8337
+
 
8338
+BUILD_VARIANTS (int8, s8, 8, 16, L)
 
8339
+BUILD_VARIANTS (uint8, u8, 8, 16, L)
 
8340
+/* { dg-final { scan-assembler "addv\\tb\[0-9\]+, v\[0-9\]+\.8b" } } */
 
8341
+/* { dg-final { scan-assembler "addv\\tb\[0-9\]+, v\[0-9\]+\.16b" } } */
 
8342
+BUILD_VARIANTS (int16, s16, 4, 8, L)
 
8343
+BUILD_VARIANTS (uint16, u16, 4, 8, L)
 
8344
+/* { dg-final { scan-assembler "addv\\th\[0-9\]+, v\[0-9\]+\.4h" } } */
 
8345
+/* { dg-final { scan-assembler "addv\\th\[0-9\]+, v\[0-9\]+\.8h" } } */
 
8346
+BUILD_VARIANTS (int32, s32, 2, 4, L)
 
8347
+BUILD_VARIANTS (uint32, u32, 2, 4, L)
 
8348
+/* { dg-final { scan-assembler "addp\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
8349
+/* { dg-final { scan-assembler "addv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
8350
+TEST (s64, q, int64, 2, D)
 
8351
+TEST (u64, q, uint64, 2, D)
 
8352
+/* { dg-final { scan-assembler "addp\\td\[0-9\]+\, v\[0-9\]+\.2d" } } */
 
8353
+
 
8354
+BUILD_VARIANTS (float32, f32, 2, 4, F)
 
8355
+/* { dg-final { scan-assembler "faddp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */
 
8356
+/* { dg-final { scan-assembler "faddp\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
8357
+TEST (f64, q, float64, 2, D)
 
8358
+/* { dg-final { scan-assembler "faddp\\td\[0-9\]+\, v\[0-9\]+\.2d" } } */
 
8359
+
 
8360
+#undef TEST
 
8361
+#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT)            \
 
8362
+{                                                      \
 
8363
+  if (!test_vaddv##SUFFIX##_##TYPE##x##LANES##_t ())   \
 
8364
+    abort ();                                          \
 
8365
+}
 
8366
+
 
8367
+int
 
8368
+main (int argc, char **argv)
 
8369
+{
 
8370
+BUILD_VARIANTS (int8, s8, 8, 16, L)
 
8371
+BUILD_VARIANTS (uint8, u8, 8, 16, L)
 
8372
+BUILD_VARIANTS (int16, s16, 4, 8, L)
 
8373
+BUILD_VARIANTS (uint16, u16, 4, 8, L)
 
8374
+BUILD_VARIANTS (int32, s32, 2, 4, L)
 
8375
+BUILD_VARIANTS (uint32, u32, 2, 4, L)
 
8376
+
 
8377
+BUILD_VARIANTS (float32, f32, 2, 4, F)
 
8378
+TEST (f64, q, float64, 2, D)
 
8379
+
 
8380
+  return 0;
 
8381
+}
 
8382
+
 
8383
+/* { dg-final { cleanup-saved-temps } } */
 
8384
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.c
 
8385
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.c
 
8386
@@ -1,43 +1,7 @@
 
8387
 /* { dg-do compile } */
 
8388
 /* { dg-options "-O2" } */
 
8389
 
 
8390
-char v = 0;
 
8391
+#include "atomic-op-char.x"
 
8392
 
 
8393
-char
 
8394
-atomic_fetch_add_RELAXED (char a)
 
8395
-{
 
8396
-  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
8397
-}
 
8398
-
 
8399
-char
 
8400
-atomic_fetch_sub_RELAXED (char a)
 
8401
-{
 
8402
-  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
8403
-}
 
8404
-
 
8405
-char
 
8406
-atomic_fetch_and_RELAXED (char a)
 
8407
-{
 
8408
-  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
8409
-}
 
8410
-
 
8411
-char
 
8412
-atomic_fetch_nand_RELAXED (char a)
 
8413
-{
 
8414
-  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
8415
-}
 
8416
-
 
8417
-char
 
8418
-atomic_fetch_xor_RELAXED (char a)
 
8419
-{
 
8420
-  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
8421
-}
 
8422
-
 
8423
-char
 
8424
-atomic_fetch_or_RELAXED (char a)
 
8425
-{
 
8426
-  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
8427
-}
 
8428
-
 
8429
 /* { dg-final { scan-assembler-times "ldxrb\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8430
 /* { dg-final { scan-assembler-times "stxrb\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8431
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.x
 
8432
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.x
 
8433
@@ -0,0 +1,37 @@
 
8434
+int v = 0;
 
8435
+
 
8436
+int
 
8437
+atomic_fetch_add_RELAXED (int a)
 
8438
+{
 
8439
+  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
8440
+}
 
8441
+
 
8442
+int
 
8443
+atomic_fetch_sub_RELAXED (int a)
 
8444
+{
 
8445
+  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
8446
+}
 
8447
+
 
8448
+int
 
8449
+atomic_fetch_and_RELAXED (int a)
 
8450
+{
 
8451
+  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
8452
+}
 
8453
+
 
8454
+int
 
8455
+atomic_fetch_nand_RELAXED (int a)
 
8456
+{
 
8457
+  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
8458
+}
 
8459
+
 
8460
+int
 
8461
+atomic_fetch_xor_RELAXED (int a)
 
8462
+{
 
8463
+  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
8464
+}
 
8465
+
 
8466
+int
 
8467
+atomic_fetch_or_RELAXED (int a)
 
8468
+{
 
8469
+  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
8470
+}
 
8471
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.x
 
8472
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-seq_cst.x
 
8473
@@ -0,0 +1,37 @@
 
8474
+int v = 0;
 
8475
+
 
8476
+int
 
8477
+atomic_fetch_add_SEQ_CST (int a)
 
8478
+{
 
8479
+  return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST);
 
8480
+}
 
8481
+
 
8482
+int
 
8483
+atomic_fetch_sub_SEQ_CST (int a)
 
8484
+{
 
8485
+  return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST);
 
8486
+}
 
8487
+
 
8488
+int
 
8489
+atomic_fetch_and_SEQ_CST (int a)
 
8490
+{
 
8491
+  return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST);
 
8492
+}
 
8493
+
 
8494
+int
 
8495
+atomic_fetch_nand_SEQ_CST (int a)
 
8496
+{
 
8497
+  return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST);
 
8498
+}
 
8499
+
 
8500
+int
 
8501
+atomic_fetch_xor_SEQ_CST (int a)
 
8502
+{
 
8503
+  return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST);
 
8504
+}
 
8505
+
 
8506
+int
 
8507
+atomic_fetch_or_SEQ_CST (int a)
 
8508
+{
 
8509
+  return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST);
 
8510
+}
 
8511
--- a/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c
 
8512
+++ b/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c
 
8513
@@ -0,0 +1,40 @@
 
8514
+/* { dg-do run { target aarch64*-*-* } } */
 
8515
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
8516
+/* { dg-require-effective-target aarch64_little_endian } */
 
8517
+
 
8518
+extern void abort (void);
 
8519
+
 
8520
+typedef struct bitfield
 
8521
+{
 
8522
+  unsigned short eight1: 8;
 
8523
+  unsigned short four: 4;
 
8524
+  unsigned short eight2: 8;
 
8525
+  unsigned short seven: 7;
 
8526
+  unsigned int sixteen: 16;
 
8527
+} bitfield;
 
8528
+
 
8529
+bitfield
 
8530
+bfxil (bitfield a)
 
8531
+{
 
8532
+  /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 16, 8" } } */
 
8533
+  a.eight1 = a.eight2;
 
8534
+  return a;
 
8535
+}
 
8536
+
 
8537
+int
 
8538
+main (void)
 
8539
+{
 
8540
+  static bitfield a;
 
8541
+  bitfield b;
 
8542
+
 
8543
+  a.eight1 = 9;
 
8544
+  a.eight2 = 57;
 
8545
+  b = bfxil (a);
 
8546
+
 
8547
+  if (b.eight1 != a.eight2)
 
8548
+    abort ();
 
8549
+
 
8550
+  return 0;
 
8551
+}
 
8552
+
 
8553
+/* { dg-final { cleanup-saved-temps } } */
 
8554
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.x
 
8555
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.x
 
8556
@@ -0,0 +1,37 @@
 
8557
+int v = 0;
 
8558
+
 
8559
+int
 
8560
+atomic_fetch_add_CONSUME (int a)
 
8561
+{
 
8562
+  return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME);
 
8563
+}
 
8564
+
 
8565
+int
 
8566
+atomic_fetch_sub_CONSUME (int a)
 
8567
+{
 
8568
+  return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME);
 
8569
+}
 
8570
+
 
8571
+int
 
8572
+atomic_fetch_and_CONSUME (int a)
 
8573
+{
 
8574
+  return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME);
 
8575
+}
 
8576
+
 
8577
+int
 
8578
+atomic_fetch_nand_CONSUME (int a)
 
8579
+{
 
8580
+  return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME);
 
8581
+}
 
8582
+
 
8583
+int
 
8584
+atomic_fetch_xor_CONSUME (int a)
 
8585
+{
 
8586
+  return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME);
 
8587
+}
 
8588
+
 
8589
+int
 
8590
+atomic_fetch_or_CONSUME (int a)
 
8591
+{
 
8592
+  return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME);
 
8593
+}
 
8594
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c
 
8595
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c
 
8596
@@ -1,43 +1,7 @@
 
8597
 /* { dg-do compile } */
 
8598
 /* { dg-options "-O2" } */
 
8599
 
 
8600
-short v = 0;
 
8601
+#include "atomic-op-short.x"
 
8602
 
 
8603
-short
 
8604
-atomic_fetch_add_RELAXED (short a)
 
8605
-{
 
8606
-  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
8607
-}
 
8608
-
 
8609
-short
 
8610
-atomic_fetch_sub_RELAXED (short a)
 
8611
-{
 
8612
-  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
8613
-}
 
8614
-
 
8615
-short
 
8616
-atomic_fetch_and_RELAXED (short a)
 
8617
-{
 
8618
-  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
8619
-}
 
8620
-
 
8621
-short
 
8622
-atomic_fetch_nand_RELAXED (short a)
 
8623
-{
 
8624
-  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
8625
-}
 
8626
-
 
8627
-short
 
8628
-atomic_fetch_xor_RELAXED (short a)
 
8629
-{
 
8630
-  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
8631
-}
 
8632
-
 
8633
-short
 
8634
-atomic_fetch_or_RELAXED (short a)
 
8635
-{
 
8636
-  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
8637
-}
 
8638
-
 
8639
 /* { dg-final { scan-assembler-times "ldxrh\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8640
 /* { dg-final { scan-assembler-times "stxrh\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
8641
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.x
 
8642
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-char.x
 
8643
@@ -0,0 +1,37 @@
 
8644
+char v = 0;
 
8645
+
 
8646
+char
 
8647
+atomic_fetch_add_RELAXED (char a)
 
8648
+{
 
8649
+  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
8650
+}
 
8651
+
 
8652
+char
 
8653
+atomic_fetch_sub_RELAXED (char a)
 
8654
+{
 
8655
+  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
8656
+}
 
8657
+
 
8658
+char
 
8659
+atomic_fetch_and_RELAXED (char a)
 
8660
+{
 
8661
+  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
8662
+}
 
8663
+
 
8664
+char
 
8665
+atomic_fetch_nand_RELAXED (char a)
 
8666
+{
 
8667
+  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
8668
+}
 
8669
+
 
8670
+char
 
8671
+atomic_fetch_xor_RELAXED (char a)
 
8672
+{
 
8673
+  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
8674
+}
 
8675
+
 
8676
+char
 
8677
+atomic_fetch_or_RELAXED (char a)
 
8678
+{
 
8679
+  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
8680
+}
 
8681
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-f.c
 
8682
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-eq-f.c
 
8683
@@ -2,12 +2,13 @@
 
8684
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
8685
 
 
8686
 #define FTYPE float
 
8687
+#define ITYPE int
 
8688
 #define OP ==
 
8689
 #define INV_OP !=
 
8690
 
 
8691
 #include "vect-fcm.x"
 
8692
 
 
8693
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
8694
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
8695
 /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */
 
8696
 /* { dg-final { scan-assembler "fcmeq\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */
 
8697
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
8698
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp-compile.c
 
8699
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp-compile.c
 
8700
@@ -11,3 +11,4 @@
 
8701
 /* { dg-final { scan-assembler "fdiv\\tv" } } */
 
8702
 /* { dg-final { scan-assembler "fneg\\tv" } } */
 
8703
 /* { dg-final { scan-assembler "fabs\\tv" } } */
 
8704
+/* { dg-final { scan-assembler "fabd\\tv" } } */
 
8705
--- a/src/gcc/testsuite/gcc.target/aarch64/adds1.c
 
8706
+++ b/src/gcc/testsuite/gcc.target/aarch64/adds1.c
 
8707
@@ -0,0 +1,149 @@
 
8708
+/* { dg-do run } */
 
8709
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
8710
+
 
8711
+extern void abort (void);
 
8712
+
 
8713
+int
 
8714
+adds_si_test1 (int a, int b, int c)
 
8715
+{
 
8716
+  int d = a + b;
 
8717
+
 
8718
+  /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
8719
+  if (d == 0)
 
8720
+    return a + c;
 
8721
+  else
 
8722
+    return b + d + c;
 
8723
+}
 
8724
+
 
8725
+int
 
8726
+adds_si_test2 (int a, int b, int c)
 
8727
+{
 
8728
+  int d = a + 0xff;
 
8729
+
 
8730
+  /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, 255" } } */
 
8731
+  if (d == 0)
 
8732
+    return a + c;
 
8733
+  else
 
8734
+    return b + d + c;
 
8735
+}
 
8736
+
 
8737
+int
 
8738
+adds_si_test3 (int a, int b, int c)
 
8739
+{
 
8740
+  int d = a + (b << 3);
 
8741
+
 
8742
+  /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
8743
+  if (d == 0)
 
8744
+    return a + c;
 
8745
+  else
 
8746
+    return b + d + c;
 
8747
+}
 
8748
+
 
8749
+typedef long long s64;
 
8750
+
 
8751
+s64
 
8752
+adds_di_test1 (s64 a, s64 b, s64 c)
 
8753
+{
 
8754
+  s64 d = a + b;
 
8755
+
 
8756
+  /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
8757
+  if (d == 0)
 
8758
+    return a + c;
 
8759
+  else
 
8760
+    return b + d + c;
 
8761
+}
 
8762
+
 
8763
+s64
 
8764
+adds_di_test2 (s64 a, s64 b, s64 c)
 
8765
+{
 
8766
+  s64 d = a + 0xff;
 
8767
+
 
8768
+  /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, 255" } } */
 
8769
+  if (d == 0)
 
8770
+    return a + c;
 
8771
+  else
 
8772
+    return b + d + c;
 
8773
+}
 
8774
+
 
8775
+s64
 
8776
+adds_di_test3 (s64 a, s64 b, s64 c)
 
8777
+{
 
8778
+  s64 d = a + (b << 3);
 
8779
+
 
8780
+  /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
8781
+  if (d == 0)
 
8782
+    return a + c;
 
8783
+  else
 
8784
+    return b + d + c;
 
8785
+}
 
8786
+
 
8787
+int main ()
 
8788
+{
 
8789
+  int x;
 
8790
+  s64 y;
 
8791
+
 
8792
+  x = adds_si_test1 (29, 4, 5);
 
8793
+  if (x != 42)
 
8794
+    abort ();
 
8795
+
 
8796
+  x = adds_si_test1 (5, 2, 20);
 
8797
+  if (x != 29)
 
8798
+    abort ();
 
8799
+
 
8800
+  x = adds_si_test2 (29, 4, 5);
 
8801
+  if (x != 293)
 
8802
+    abort ();
 
8803
+
 
8804
+  x = adds_si_test2 (1024, 2, 20);
 
8805
+  if (x != 1301)
 
8806
+    abort ();
 
8807
+
 
8808
+  x = adds_si_test3 (35, 4, 5);
 
8809
+  if (x != 76)
 
8810
+    abort ();
 
8811
+
 
8812
+  x = adds_si_test3 (5, 2, 20);
 
8813
+  if (x != 43)
 
8814
+    abort ();
 
8815
+
 
8816
+  y = adds_di_test1 (0x130000029ll,
 
8817
+                    0x320000004ll,
 
8818
+                    0x505050505ll);
 
8819
+
 
8820
+  if (y != 0xc75050536)
 
8821
+    abort ();
 
8822
+
 
8823
+  y = adds_di_test1 (0x5000500050005ll,
 
8824
+                    0x2111211121112ll,
 
8825
+                    0x0000000002020ll);
 
8826
+  if (y != 0x9222922294249)
 
8827
+    abort ();
 
8828
+
 
8829
+  y = adds_di_test2 (0x130000029ll,
 
8830
+                    0x320000004ll,
 
8831
+                    0x505050505ll);
 
8832
+  if (y != 0x955050631)
 
8833
+    abort ();
 
8834
+
 
8835
+  y = adds_di_test2 (0x130002900ll,
 
8836
+                    0x320000004ll,
 
8837
+                    0x505050505ll);
 
8838
+  if (y != 0x955052f08)
 
8839
+    abort ();
 
8840
+
 
8841
+  y = adds_di_test3 (0x130000029ll,
 
8842
+                    0x064000008ll,
 
8843
+                    0x505050505ll);
 
8844
+  if (y != 0x9b9050576)
 
8845
+    abort ();
 
8846
+
 
8847
+  y = adds_di_test3 (0x130002900ll,
 
8848
+                    0x088000008ll,
 
8849
+                    0x505050505ll);
 
8850
+  if (y != 0xafd052e4d)
 
8851
+    abort ();
 
8852
+
 
8853
+  return 0;
 
8854
+}
 
8855
+
 
8856
+/* { dg-final { cleanup-saved-temps } } */
 
8857
--- a/src/gcc/testsuite/gcc.target/aarch64/insv_1.c
 
8858
+++ b/src/gcc/testsuite/gcc.target/aarch64/insv_1.c
 
8859
@@ -0,0 +1,85 @@
 
8860
+/* { dg-do run { target aarch64*-*-* } } */
 
8861
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
8862
+/* { dg-require-effective-target aarch64_little_endian } */
 
8863
+
 
8864
+extern void abort (void);
 
8865
+
 
8866
+typedef struct bitfield
 
8867
+{
 
8868
+  unsigned short eight: 8;
 
8869
+  unsigned short four: 4;
 
8870
+  unsigned short five: 5;
 
8871
+  unsigned short seven: 7;
 
8872
+  unsigned int sixteen: 16;
 
8873
+} bitfield;
 
8874
+
 
8875
+bitfield
 
8876
+bfi1 (bitfield a)
 
8877
+{
 
8878
+  /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 0, 8" } } */
 
8879
+  a.eight = 3;
 
8880
+  return a;
 
8881
+}
 
8882
+
 
8883
+bitfield
 
8884
+bfi2 (bitfield a)
 
8885
+{
 
8886
+  /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 16, 5" } } */
 
8887
+  a.five = 7;
 
8888
+  return a;
 
8889
+}
 
8890
+
 
8891
+bitfield
 
8892
+movk (bitfield a)
 
8893
+{
 
8894
+  /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 32" } } */
 
8895
+  a.sixteen = 7531;
 
8896
+  return a;
 
8897
+}
 
8898
+
 
8899
+bitfield
 
8900
+set1 (bitfield a)
 
8901
+{
 
8902
+  /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 2031616" } } */
 
8903
+  a.five = 0x1f;
 
8904
+  return a;
 
8905
+}
 
8906
+
 
8907
+bitfield
 
8908
+set0 (bitfield a)
 
8909
+{
 
8910
+  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -2031617" } } */
 
8911
+  a.five = 0;
 
8912
+  return a;
 
8913
+}
 
8914
+
 
8915
+
 
8916
+int
 
8917
+main (int argc, char** argv)
 
8918
+{
 
8919
+  static bitfield a;
 
8920
+  bitfield b = bfi1 (a);
 
8921
+  bitfield c = bfi2 (b);
 
8922
+  bitfield d = movk (c);
 
8923
+
 
8924
+  if (d.eight != 3)
 
8925
+    abort ();
 
8926
+
 
8927
+  if (d.five != 7)
 
8928
+    abort ();
 
8929
+
 
8930
+  if (d.sixteen != 7531)
 
8931
+    abort ();
 
8932
+
 
8933
+  d = set1 (d);
 
8934
+  if (d.five != 0x1f)
 
8935
+    abort ();
 
8936
+
 
8937
+  d = set0 (d);
 
8938
+  if (d.five != 0)
 
8939
+    abort ();
 
8940
+
 
8941
+  return 0;
 
8942
+}
 
8943
+
 
8944
+/* { dg-final { cleanup-saved-temps } } */
 
8945
--- a/src/gcc/testsuite/gcc.target/aarch64/ror.c
 
8946
+++ b/src/gcc/testsuite/gcc.target/aarch64/ror.c
 
8947
@@ -0,0 +1,34 @@
 
8948
+/* { dg-options "-O2 --save-temps" } */
 
8949
+/* { dg-do run } */
 
8950
+
 
8951
+extern void abort (void);
 
8952
+
 
8953
+int
 
8954
+test_si (int a)
 
8955
+{
 
8956
+  /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 27\n" } } */
 
8957
+  return (a << 5) | ((unsigned int) a >> 27);
 
8958
+}
 
8959
+
 
8960
+long long
 
8961
+test_di (long long a)
 
8962
+{
 
8963
+  /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 45\n" } } */
 
8964
+  return (a << 19) | ((unsigned long long) a >> 45);
 
8965
+}
 
8966
+
 
8967
+int
 
8968
+main ()
 
8969
+{
 
8970
+  int v;
 
8971
+  long long w;
 
8972
+  v = test_si (0x0203050);
 
8973
+  if (v != 0x4060a00)
 
8974
+    abort();
 
8975
+  w = test_di (0x0000020506010304ll);
 
8976
+  if (w != 0x1028300818200000ll)
 
8977
+    abort();
 
8978
+  return 0;
 
8979
+}
 
8980
+
 
8981
+/* { dg-final { cleanup-saved-temps } } */
 
8982
--- a/src/gcc/testsuite/gcc.target/aarch64/ands_1.c
 
8983
+++ b/src/gcc/testsuite/gcc.target/aarch64/ands_1.c
 
8984
@@ -0,0 +1,151 @@
 
8985
+/* { dg-do run } */
 
8986
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
8987
+
 
8988
+extern void abort (void);
 
8989
+
 
8990
+int
 
8991
+ands_si_test1 (int a, int b, int c)
 
8992
+{
 
8993
+  int d = a & b;
 
8994
+
 
8995
+  /* { dg-final { scan-assembler-times "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
 
8996
+  if (d == 0)
 
8997
+    return a + c;
 
8998
+  else
 
8999
+    return b + d + c;
 
9000
+}
 
9001
+
 
9002
+int
 
9003
+ands_si_test2 (int a, int b, int c)
 
9004
+{
 
9005
+  int d = a & 0xff;
 
9006
+
 
9007
+  /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, 255" } } */
 
9008
+  if (d == 0)
 
9009
+    return a + c;
 
9010
+  else
 
9011
+    return b + d + c;
 
9012
+}
 
9013
+
 
9014
+int
 
9015
+ands_si_test3 (int a, int b, int c)
 
9016
+{
 
9017
+  int d = a & (b << 3);
 
9018
+
 
9019
+  /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
9020
+  if (d == 0)
 
9021
+    return a + c;
 
9022
+  else
 
9023
+    return b + d + c;
 
9024
+}
 
9025
+
 
9026
+typedef long long s64;
 
9027
+
 
9028
+s64
 
9029
+ands_di_test1 (s64 a, s64 b, s64 c)
 
9030
+{
 
9031
+  s64 d = a & b;
 
9032
+
 
9033
+  /* { dg-final { scan-assembler-times "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
 
9034
+  if (d == 0)
 
9035
+    return a + c;
 
9036
+  else
 
9037
+    return b + d + c;
 
9038
+}
 
9039
+
 
9040
+s64
 
9041
+ands_di_test2 (s64 a, s64 b, s64 c)
 
9042
+{
 
9043
+  s64 d = a & 0xff;
 
9044
+
 
9045
+  /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, 255" } } */
 
9046
+  if (d == 0)
 
9047
+    return a + c;
 
9048
+  else
 
9049
+    return b + d + c;
 
9050
+}
 
9051
+
 
9052
+s64
 
9053
+ands_di_test3 (s64 a, s64 b, s64 c)
 
9054
+{
 
9055
+  s64 d = a & (b << 3);
 
9056
+
 
9057
+  /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
9058
+  if (d == 0)
 
9059
+    return a + c;
 
9060
+  else
 
9061
+    return b + d + c;
 
9062
+}
 
9063
+
 
9064
+int
 
9065
+main ()
 
9066
+{
 
9067
+  int x;
 
9068
+  s64 y;
 
9069
+
 
9070
+  x = ands_si_test1 (29, 4, 5);
 
9071
+  if (x != 13)
 
9072
+    abort ();
 
9073
+
 
9074
+  x = ands_si_test1 (5, 2, 20);
 
9075
+  if (x != 25)
 
9076
+    abort ();
 
9077
+
 
9078
+  x = ands_si_test2 (29, 4, 5);
 
9079
+  if (x != 38)
 
9080
+    abort ();
 
9081
+
 
9082
+  x = ands_si_test2 (1024, 2, 20);
 
9083
+  if (x != 1044)
 
9084
+    abort ();
 
9085
+
 
9086
+  x = ands_si_test3 (35, 4, 5);
 
9087
+  if (x != 41)
 
9088
+    abort ();
 
9089
+
 
9090
+  x = ands_si_test3 (5, 2, 20);
 
9091
+  if (x != 25)
 
9092
+    abort ();
 
9093
+
 
9094
+  y = ands_di_test1 (0x130000029ll,
 
9095
+                     0x320000004ll,
 
9096
+                     0x505050505ll);
 
9097
+
 
9098
+  if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll))
 
9099
+    abort ();
 
9100
+
 
9101
+  y = ands_di_test1 (0x5000500050005ll,
 
9102
+                     0x2111211121112ll,
 
9103
+                     0x0000000002020ll);
 
9104
+  if (y != 0x5000500052025ll)
 
9105
+    abort ();
 
9106
+
 
9107
+  y = ands_di_test2 (0x130000029ll,
 
9108
+                     0x320000004ll,
 
9109
+                     0x505050505ll);
 
9110
+  if (y != ((0x130000029ll & 0xff) + 0x320000004ll + 0x505050505ll))
 
9111
+    abort ();
 
9112
+
 
9113
+  y = ands_di_test2 (0x130002900ll,
 
9114
+                     0x320000004ll,
 
9115
+                     0x505050505ll);
 
9116
+  if (y != (0x130002900ll + 0x505050505ll))
 
9117
+    abort ();
 
9118
+
 
9119
+  y = ands_di_test3 (0x130000029ll,
 
9120
+                     0x064000008ll,
 
9121
+                     0x505050505ll);
 
9122
+  if (y != ((0x130000029ll & (0x064000008ll << 3))
 
9123
+           + 0x064000008ll + 0x505050505ll))
 
9124
+    abort ();
 
9125
+
 
9126
+  y = ands_di_test3 (0x130002900ll,
 
9127
+                     0x088000008ll,
 
9128
+                     0x505050505ll);
 
9129
+  if (y != (0x130002900ll + 0x505050505ll))
 
9130
+    abort ();
 
9131
+
 
9132
+  return 0;
 
9133
+}
 
9134
+
 
9135
+/* { dg-final { cleanup-saved-temps } } */
 
9136
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.c
 
9137
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.c
 
9138
@@ -1,43 +1,7 @@
 
9139
 /* { dg-do compile } */
 
9140
 /* { dg-options "-O2" } */
 
9141
 
 
9142
-int v = 0;
 
9143
+#include "atomic-op-release.x"
 
9144
 
 
9145
-int
 
9146
-atomic_fetch_add_RELEASE (int a)
 
9147
-{
 
9148
-  return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE);
 
9149
-}
 
9150
-
 
9151
-int
 
9152
-atomic_fetch_sub_RELEASE (int a)
 
9153
-{
 
9154
-  return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE);
 
9155
-}
 
9156
-
 
9157
-int
 
9158
-atomic_fetch_and_RELEASE (int a)
 
9159
-{
 
9160
-  return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE);
 
9161
-}
 
9162
-
 
9163
-int
 
9164
-atomic_fetch_nand_RELEASE (int a)
 
9165
-{
 
9166
-  return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE);
 
9167
-}
 
9168
-
 
9169
-int
 
9170
-atomic_fetch_xor_RELEASE (int a)
 
9171
-{
 
9172
-  return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE);
 
9173
-}
 
9174
-
 
9175
-int
 
9176
-atomic_fetch_or_RELEASE (int a)
 
9177
-{
 
9178
-  return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE);
 
9179
-}
 
9180
-
 
9181
 /* { dg-final { scan-assembler-times "ldxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
9182
 /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
9183
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vfmaxv.c
 
9184
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vfmaxv.c
 
9185
@@ -0,0 +1,169 @@
 
9186
+/* { dg-do run } */
 
9187
+/* { dg-options "-O3 --save-temps -ffast-math" } */
 
9188
+
 
9189
+#include <arm_neon.h>
 
9190
+
 
9191
+extern void abort (void);
 
9192
+
 
9193
+extern float fabsf (float);
 
9194
+extern double fabs (double);
 
9195
+extern int isnan (double);
 
9196
+extern float fmaxf (float, float);
 
9197
+extern float fminf (float, float);
 
9198
+extern double fmax (double, double);
 
9199
+extern double fmin (double, double);
 
9200
+
 
9201
+#define NUM_TESTS 16
 
9202
+#define DELTA 0.000001
 
9203
+#define NAN (0.0 / 0.0)
 
9204
+
 
9205
+float input_float32[] = {0.1f, -0.1f, 0.4f, 10.3f,
 
9206
+                        200.0f, -800.0f, -13.0f, -0.5f,
 
9207
+                        NAN, -870.0f, 10.4f, 310.11f,
 
9208
+                        0.0f, -865.0f, -2213.0f, -1.5f};
 
9209
+
 
9210
+double input_float64[] = {0.1, -0.1, 0.4, 10.3,
 
9211
+                         200.0, -800.0, -13.0, -0.5,
 
9212
+                         NAN, -870.0, 10.4, 310.11,
 
9213
+                         0.0, -865.0, -2213.0, -1.5};
 
9214
+
 
9215
+#define EQUALF(a, b) (fabsf (a - b) < DELTA)
 
9216
+#define EQUALD(a, b) (fabs (a - b) < DELTA)
 
9217
+
 
9218
+/* Floating point 'unordered' variants.  */
 
9219
+
 
9220
+#undef TEST
 
9221
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT)            \
 
9222
+int                                                                    \
 
9223
+test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void)                        \
 
9224
+{                                                                      \
 
9225
+  int i, j;                                                            \
 
9226
+  int moves = (NUM_TESTS - LANES) + 1;                                 \
 
9227
+  TYPE##_t out_l[NUM_TESTS];                                           \
 
9228
+  TYPE##_t out_v[NUM_TESTS];                                           \
 
9229
+                                                                       \
 
9230
+  /* Calculate linearly.  */                                           \
 
9231
+  for (i = 0; i < moves; i++)                                          \
 
9232
+    {                                                                  \
 
9233
+      out_l[i] = input_##TYPE[i];                                      \
 
9234
+      for (j = 0; j < LANES; j++)                                      \
 
9235
+       {                                                               \
 
9236
+         if (isnan (out_l[i]))                                         \
 
9237
+           continue;                                                   \
 
9238
+         if (isnan (input_##TYPE[i + j])                               \
 
9239
+             || input_##TYPE[i + j] CMP_OP out_l[i])                   \
 
9240
+           out_l[i] = input_##TYPE[i + j];                             \
 
9241
+       }                                                               \
 
9242
+    }                                                                  \
 
9243
+                                                                       \
 
9244
+  /* Calculate using vector reduction intrinsics.  */                  \
 
9245
+  for (i = 0; i < moves; i++)                                          \
 
9246
+    {                                                                  \
 
9247
+      TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i);   \
 
9248
+      out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1);                      \
 
9249
+    }                                                                  \
 
9250
+                                                                       \
 
9251
+  /* Compare.  */                                                      \
 
9252
+  for (i = 0; i < moves; i++)                                          \
 
9253
+    {                                                                  \
 
9254
+      if (!EQUAL##FLOAT (out_v[i], out_l[i])                           \
 
9255
+                        && !(isnan (out_v[i]) && isnan (out_l[i])))    \
 
9256
+       return 0;                                                       \
 
9257
+    }                                                                  \
 
9258
+  return 1;                                                            \
 
9259
+}
 
9260
+
 
9261
+#define BUILD_VARIANTS(TYPE, STYPE, W32, W64, F)       \
 
9262
+TEST (max, >, STYPE,  , TYPE, W32, F)                  \
 
9263
+TEST (max, >, STYPE, q, TYPE, W64, F)                  \
 
9264
+TEST (min, <, STYPE,  , TYPE, W32, F)                  \
 
9265
+TEST (min, <, STYPE, q, TYPE, W64, F)
 
9266
+
 
9267
+BUILD_VARIANTS (float32, f32, 2, 4, F)
 
9268
+/* { dg-final { scan-assembler "fmaxp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */
 
9269
+/* { dg-final { scan-assembler "fminp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */
 
9270
+/* { dg-final { scan-assembler "fmaxv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
9271
+/* { dg-final { scan-assembler "fminv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
9272
+TEST (max, >, f64, q, float64, 2, D)
 
9273
+/* { dg-final { scan-assembler "fmaxp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */
 
9274
+TEST (min, <, f64, q, float64, 2, D)
 
9275
+/* { dg-final { scan-assembler "fminp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */
 
9276
+
 
9277
+/* Floating point 'nm' variants.  */
 
9278
+
 
9279
+#undef TEST
 
9280
+#define TEST(MAXMIN, F, SUFFIX, Q, TYPE, LANES, FLOAT)                 \
 
9281
+int                                                                    \
 
9282
+test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t (void)              \
 
9283
+{                                                                      \
 
9284
+  int i, j;                                                            \
 
9285
+  int moves = (NUM_TESTS - LANES) + 1;                                 \
 
9286
+  TYPE##_t out_l[NUM_TESTS];                                           \
 
9287
+  TYPE##_t out_v[NUM_TESTS];                                           \
 
9288
+                                                                       \
 
9289
+  /* Calculate linearly.  */                                           \
 
9290
+  for (i = 0; i < moves; i++)                                          \
 
9291
+    {                                                                  \
 
9292
+      out_l[i] = input_##TYPE[i];                                      \
 
9293
+      for (j = 0; j < LANES; j++)                                      \
 
9294
+       out_l[i] = f##MAXMIN##F (input_##TYPE[i + j],  out_l[i]);       \
 
9295
+    }                                                                  \
 
9296
+                                                                       \
 
9297
+  /* Calculate using vector reduction intrinsics.  */                  \
 
9298
+  for (i = 0; i < moves; i++)                                          \
 
9299
+    {                                                                  \
 
9300
+      TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i);   \
 
9301
+      out_v[i] = v##MAXMIN##nmv##Q##_##SUFFIX (t1);                    \
 
9302
+    }                                                                  \
 
9303
+                                                                       \
 
9304
+  /* Compare.  */                                                      \
 
9305
+  for (i = 0; i < moves; i++)                                          \
 
9306
+    {                                                                  \
 
9307
+      if (!EQUAL##FLOAT (out_v[i], out_l[i]))                          \
 
9308
+       return 0;                                                       \
 
9309
+    }                                                                  \
 
9310
+  return 1;                                                            \
 
9311
+}
 
9312
+
 
9313
+TEST (max, f, f32, , float32, 2, D)
 
9314
+/* { dg-final { scan-assembler "fmaxnmp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */
 
9315
+TEST (min, f, f32, , float32, 2, D)
 
9316
+/* { dg-final { scan-assembler "fminnmp\\ts\[0-9\]+, v\[0-9\]+\.2s" } } */
 
9317
+TEST (max, f, f32, q, float32, 4, D)
 
9318
+/* { dg-final { scan-assembler "fmaxnmv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
9319
+TEST (min, f, f32, q, float32, 4, D)
 
9320
+/* { dg-final { scan-assembler "fminnmv\\ts\[0-9\]+, v\[0-9\]+\.4s" } } */
 
9321
+TEST (max, , f64, q, float64, 2, D)
 
9322
+/* { dg-final { scan-assembler "fmaxnmp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */
 
9323
+TEST (min, , f64, q, float64, 2, D)
 
9324
+/* { dg-final { scan-assembler "fminnmp\\td\[0-9\]+, v\[0-9\]+\.2d" } } */
 
9325
+
 
9326
+#undef TEST
 
9327
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT)            \
 
9328
+{                                                                      \
 
9329
+  if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ())            \
 
9330
+    abort ();                                                          \
 
9331
+}
 
9332
+
 
9333
+int
 
9334
+main (int argc, char **argv)
 
9335
+{
 
9336
+  BUILD_VARIANTS (float32, f32, 2, 4, F)
 
9337
+  TEST (max, >, f64, q, float64, 2, D)
 
9338
+  TEST (min, <, f64, q, float64, 2, D)
 
9339
+
 
9340
+#undef TEST
 
9341
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT)            \
 
9342
+{                                                                      \
 
9343
+  if (!test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t ())          \
 
9344
+    abort ();                                                          \
 
9345
+}
 
9346
+
 
9347
+  BUILD_VARIANTS (float32, f32, 2, 4, F)
 
9348
+  TEST (max, >, f64, q, float64, 2, D)
 
9349
+  TEST (min, <, f64, q, float64, 2, D)
 
9350
+
 
9351
+  return 0;
 
9352
+}
 
9353
+
 
9354
+/* { dg-final { cleanup-saved-temps } } */
 
9355
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.x
 
9356
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.x
 
9357
@@ -0,0 +1,37 @@
 
9358
+short v = 0;
 
9359
+
 
9360
+short
 
9361
+atomic_fetch_add_RELAXED (short a)
 
9362
+{
 
9363
+  return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
 
9364
+}
 
9365
+
 
9366
+short
 
9367
+atomic_fetch_sub_RELAXED (short a)
 
9368
+{
 
9369
+  return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
 
9370
+}
 
9371
+
 
9372
+short
 
9373
+atomic_fetch_and_RELAXED (short a)
 
9374
+{
 
9375
+  return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
 
9376
+}
 
9377
+
 
9378
+short
 
9379
+atomic_fetch_nand_RELAXED (short a)
 
9380
+{
 
9381
+  return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
 
9382
+}
 
9383
+
 
9384
+short
 
9385
+atomic_fetch_xor_RELAXED (short a)
 
9386
+{
 
9387
+  return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
 
9388
+}
 
9389
+
 
9390
+short
 
9391
+atomic_fetch_or_RELAXED (short a)
 
9392
+{
 
9393
+  return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
 
9394
+}
 
9395
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c
 
9396
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c
 
9397
@@ -0,0 +1,132 @@
 
9398
+/* { dg-do run } */
 
9399
+/* { dg-options "-O3 --save-temps -ffast-math" } */
 
9400
+
 
9401
+#include <arm_neon.h>
 
9402
+
 
9403
+extern void abort (void);
 
9404
+extern double fabs (double);
 
9405
+
 
9406
+#define NUM_TESTS 8
 
9407
+#define DELTA 0.000001
 
9408
+
 
9409
+float input_f32[] = {0.1f, -0.1f, 0.4f, 10.3f,
 
9410
+                    200.0f, -800.0f, -13.0f, -0.5f};
 
9411
+double input_f64[] = {0.1, -0.1, 0.4, 10.3,
 
9412
+                     200.0, -800.0, -13.0, -0.5};
 
9413
+
 
9414
+#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D)                         \
 
9415
+int                                                                    \
 
9416
+test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t (void)         \
 
9417
+{                                                                      \
 
9418
+  int ret = 1;                                                         \
 
9419
+  int i = 0;                                                           \
 
9420
+  int nlanes = LANES;                                                  \
 
9421
+  U##int##WIDTH##_t expected_out[NUM_TESTS];                           \
 
9422
+  U##int##WIDTH##_t actual_out[NUM_TESTS];                             \
 
9423
+                                                                       \
 
9424
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
9425
+    {                                                                  \
 
9426
+      expected_out[i]                                                  \
 
9427
+       = vcvt##SUFFIX##D##_##S##WIDTH##_f##WIDTH (input_f##WIDTH[i]);  \
 
9428
+      /* Don't vectorize this.  */                                     \
 
9429
+      asm volatile ("" : : : "memory");                                        \
 
9430
+    }                                                                  \
 
9431
+                                                                       \
 
9432
+  for (i = 0; i < NUM_TESTS; i+=nlanes)                                        \
 
9433
+    {                                                                  \
 
9434
+      U##int##WIDTH##x##LANES##_t out =                                        \
 
9435
+       vcvt##SUFFIX##Q##_##S##WIDTH##_f##WIDTH                         \
 
9436
+               (vld1##Q##_f##WIDTH (input_f##WIDTH + i));              \
 
9437
+      vst1##Q##_##S##WIDTH (actual_out + i, out);                      \
 
9438
+    }                                                                  \
 
9439
+                                                                       \
 
9440
+  for (i = 0; i < NUM_TESTS; i++)                                      \
 
9441
+    ret &= fabs (expected_out[i] - actual_out[i]) < DELTA;             \
 
9442
+                                                                       \
 
9443
+  return ret;                                                          \
 
9444
+}                                                                      \
 
9445
+
 
9446
+
 
9447
+#define BUILD_VARIANTS(SUFFIX)                 \
 
9448
+TEST (SUFFIX,  , 32, 2, s, ,s)                 \
 
9449
+TEST (SUFFIX, q, 32, 4, s, ,s)                 \
 
9450
+TEST (SUFFIX, q, 64, 2, s, ,d)                 \
 
9451
+TEST (SUFFIX,  , 32, 2, u,u,s)                 \
 
9452
+TEST (SUFFIX, q, 32, 4, u,u,s)                 \
 
9453
+TEST (SUFFIX, q, 64, 2, u,u,d)                 \
 
9454
+
 
9455
+BUILD_VARIANTS ( )
 
9456
+/* { dg-final { scan-assembler "fcvtzs\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9457
+/* { dg-final { scan-assembler "fcvtzs\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9458
+/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9459
+/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9460
+/* { dg-final { scan-assembler "fcvtzs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9461
+/* { dg-final { scan-assembler "fcvtzu\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9462
+/* { dg-final { scan-assembler "fcvtzu\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9463
+/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9464
+/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9465
+/* { dg-final { scan-assembler "fcvtzu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9466
+BUILD_VARIANTS (a)
 
9467
+/* { dg-final { scan-assembler "fcvtas\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9468
+/* { dg-final { scan-assembler "fcvtas\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9469
+/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9470
+/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9471
+/* { dg-final { scan-assembler "fcvtas\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9472
+/* { dg-final { scan-assembler "fcvtau\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9473
+/* { dg-final { scan-assembler "fcvtau\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9474
+/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9475
+/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9476
+/* { dg-final { scan-assembler "fcvtau\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9477
+BUILD_VARIANTS (m)
 
9478
+/* { dg-final { scan-assembler "fcvtms\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9479
+/* { dg-final { scan-assembler "fcvtms\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9480
+/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9481
+/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9482
+/* { dg-final { scan-assembler "fcvtms\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9483
+/* { dg-final { scan-assembler "fcvtmu\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9484
+/* { dg-final { scan-assembler "fcvtmu\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9485
+/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9486
+/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9487
+/* { dg-final { scan-assembler "fcvtmu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9488
+BUILD_VARIANTS (n)
 
9489
+/* { dg-final { scan-assembler "fcvtns\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9490
+/* { dg-final { scan-assembler "fcvtns\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9491
+/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9492
+/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9493
+/* { dg-final { scan-assembler "fcvtns\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9494
+/* { dg-final { scan-assembler "fcvtnu\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9495
+/* { dg-final { scan-assembler "fcvtnu\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9496
+/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9497
+/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9498
+/* { dg-final { scan-assembler "fcvtnu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9499
+BUILD_VARIANTS (p)
 
9500
+/* { dg-final { scan-assembler "fcvtps\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9501
+/* { dg-final { scan-assembler "fcvtps\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9502
+/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9503
+/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9504
+/* { dg-final { scan-assembler "fcvtps\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9505
+/* { dg-final { scan-assembler "fcvtpu\\tw\[0-9\]+, s\[0-9\]+" } } */
 
9506
+/* { dg-final { scan-assembler "fcvtpu\\tx\[0-9\]+, d\[0-9\]+" } } */
 
9507
+/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" } } */
 
9508
+/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" } } */
 
9509
+/* { dg-final { scan-assembler "fcvtpu\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
9510
+
 
9511
+#undef TEST
 
9512
+#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D)                         \
 
9513
+{                                                                      \
 
9514
+  if (!test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t ())     \
 
9515
+    abort ();                                                          \
 
9516
+}
 
9517
+
 
9518
+int
 
9519
+main (int argc, char **argv)
 
9520
+{
 
9521
+  BUILD_VARIANTS ( )
 
9522
+  BUILD_VARIANTS (a)
 
9523
+  BUILD_VARIANTS (m)
 
9524
+  BUILD_VARIANTS (n)
 
9525
+  BUILD_VARIANTS (p)
 
9526
+  return 0;
 
9527
+}
 
9528
+
 
9529
+/* { dg-final { cleanup-saved-temps } } */
 
9530
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.x
 
9531
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-release.x
 
9532
@@ -0,0 +1,37 @@
 
9533
+int v = 0;
 
9534
+
 
9535
+int
 
9536
+atomic_fetch_add_RELEASE (int a)
 
9537
+{
 
9538
+  return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE);
 
9539
+}
 
9540
+
 
9541
+int
 
9542
+atomic_fetch_sub_RELEASE (int a)
 
9543
+{
 
9544
+  return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE);
 
9545
+}
 
9546
+
 
9547
+int
 
9548
+atomic_fetch_and_RELEASE (int a)
 
9549
+{
 
9550
+  return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE);
 
9551
+}
 
9552
+
 
9553
+int
 
9554
+atomic_fetch_nand_RELEASE (int a)
 
9555
+{
 
9556
+  return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE);
 
9557
+}
 
9558
+
 
9559
+int
 
9560
+atomic_fetch_xor_RELEASE (int a)
 
9561
+{
 
9562
+  return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE);
 
9563
+}
 
9564
+
 
9565
+int
 
9566
+atomic_fetch_or_RELEASE (int a)
 
9567
+{
 
9568
+  return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE);
 
9569
+}
 
9570
--- a/src/gcc/testsuite/gcc.target/aarch64/fabd.c
 
9571
+++ b/src/gcc/testsuite/gcc.target/aarch64/fabd.c
 
9572
@@ -0,0 +1,38 @@
 
9573
+/* { dg-do run } */
 
9574
+/* { dg-options "-O1 -fno-inline --save-temps" } */
 
9575
+
 
9576
+extern double fabs (double);
 
9577
+extern float fabsf (float);
 
9578
+extern void abort ();
 
9579
+extern void exit (int);
 
9580
+
 
9581
+void
 
9582
+fabd_d (double x, double y, double d)
 
9583
+{
 
9584
+  if ((fabs (x - y) - d) > 0.00001)
 
9585
+    abort ();
 
9586
+}
 
9587
+
 
9588
+/* { dg-final { scan-assembler "fabd\td\[0-9\]+" } } */
 
9589
+
 
9590
+void
 
9591
+fabd_f (float x, float y, float d)
 
9592
+{
 
9593
+  if ((fabsf (x - y) - d) > 0.00001)
 
9594
+    abort ();
 
9595
+}
 
9596
+
 
9597
+/* { dg-final { scan-assembler "fabd\ts\[0-9\]+" } } */
 
9598
+
 
9599
+int
 
9600
+main ()
 
9601
+{
 
9602
+  fabd_d (10.0, 5.0, 5.0);
 
9603
+  fabd_d (5.0, 10.0, 5.0);
 
9604
+  fabd_f (10.0, 5.0, 5.0);
 
9605
+  fabd_f (5.0, 10.0, 5.0);
 
9606
+
 
9607
+  return 0;
 
9608
+}
 
9609
+
 
9610
+/* { dg-final { cleanup-saved-temps } } */
 
9611
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp.c
 
9612
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp.c
 
9613
@@ -117,6 +117,16 @@
 
9614
                            9.0, 10.0, 11.0, 12.0,
 
9615
                            13.0, 14.0, 15.0, 16.0 };
 
9616
 
 
9617
+  F32  fabd_F32_vector[] = { 1.0f, 1.0f, 1.0f, 1.0f,
 
9618
+                            1.0f, 1.0f, 1.0f, 1.0f,
 
9619
+                            1.0f, 1.0f, 1.0f, 1.0f,
 
9620
+                            1.0f, 1.0f, 1.0f, 1.0f };
 
9621
+
 
9622
+  F64  fabd_F64_vector[] = { 1.0, 1.0, 1.0, 1.0,
 
9623
+                            1.0, 1.0, 1.0, 1.0,
 
9624
+                            1.0, 1.0, 1.0, 1.0,
 
9625
+                            1.0, 1.0, 1.0, 1.0 };
 
9626
+
 
9627
   /* Setup input vectors.  */
 
9628
   for (i=1; i<=16; i++)
 
9629
     {
 
9630
@@ -132,6 +142,7 @@
 
9631
   TEST (div, 3);
 
9632
   TEST (neg, 2);
 
9633
   TEST (abs, 2);
 
9634
+  TEST (fabd, 3);
 
9635
 
 
9636
   return 0;
 
9637
 }
 
9638
--- a/src/gcc/testsuite/gcc.target/aarch64/ngc.c
 
9639
+++ b/src/gcc/testsuite/gcc.target/aarch64/ngc.c
 
9640
@@ -0,0 +1,66 @@
 
9641
+/* { dg-do run } */
 
9642
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
9643
+
 
9644
+extern void abort (void);
 
9645
+typedef unsigned int u32;
 
9646
+
 
9647
+u32
 
9648
+ngc_si (u32 a, u32 b, u32 c, u32 d)
 
9649
+{
 
9650
+  a = -b - (c < d);
 
9651
+  return a;
 
9652
+}
 
9653
+
 
9654
+typedef unsigned long long u64;
 
9655
+
 
9656
+u64
 
9657
+ngc_si_tst (u64 a, u32 b, u32 c, u32 d)
 
9658
+{
 
9659
+  a = -b - (c < d);
 
9660
+  return a;
 
9661
+}
 
9662
+
 
9663
+u64
 
9664
+ngc_di (u64 a, u64 b, u64 c, u64 d)
 
9665
+{
 
9666
+  a = -b - (c < d);
 
9667
+  return a;
 
9668
+}
 
9669
+
 
9670
+int
 
9671
+main ()
 
9672
+{
 
9673
+  int x;
 
9674
+  u64 y;
 
9675
+
 
9676
+  x = ngc_si (29, 4, 5, 4);
 
9677
+  if (x != -4)
 
9678
+    abort ();
 
9679
+
 
9680
+  x = ngc_si (1024, 2, 20, 13);
 
9681
+  if (x != -2)
 
9682
+    abort ();
 
9683
+
 
9684
+  y = ngc_si_tst (0x130000029ll, 32, 50, 12);
 
9685
+  if (y != 0xffffffe0)
 
9686
+    abort ();
 
9687
+
 
9688
+  y = ngc_si_tst (0x5000500050005ll, 21, 2, 14);
 
9689
+  if (y != 0xffffffea)
 
9690
+    abort ();
 
9691
+
 
9692
+  y = ngc_di (0x130000029ll, 0x320000004ll, 0x505050505ll, 0x123123123ll);
 
9693
+  if (y != 0xfffffffcdffffffc)
 
9694
+    abort ();
 
9695
+
 
9696
+  y = ngc_di (0x5000500050005ll,
 
9697
+             0x2111211121112ll, 0x0000000002020ll, 0x1414575046477ll);
 
9698
+  if (y != 0xfffdeeedeeedeeed)
 
9699
+    abort ();
 
9700
+
 
9701
+  return 0;
 
9702
+}
 
9703
+
 
9704
+/* { dg-final { scan-assembler-times "ngc\tw\[0-9\]+, w\[0-9\]+" 2 } } */
 
9705
+/* { dg-final { scan-assembler-times "ngc\tx\[0-9\]+, x\[0-9\]+" 1 } } */
 
9706
+/* { dg-final { cleanup-saved-temps } } */
 
9707
--- a/src/gcc/testsuite/gcc.target/aarch64/cmp.c
 
9708
+++ b/src/gcc/testsuite/gcc.target/aarch64/cmp.c
 
9709
@@ -0,0 +1,61 @@
 
9710
+/* { dg-do compile } */
 
9711
+/* { dg-options "-O2" } */
 
9712
+
 
9713
+int
 
9714
+cmp_si_test1 (int a, int b, int c)
 
9715
+{
 
9716
+  if (a > b)
 
9717
+    return a + c;
 
9718
+  else
 
9719
+    return a + b + c;
 
9720
+}
 
9721
+
 
9722
+int
 
9723
+cmp_si_test2 (int a, int b, int c)
 
9724
+{
 
9725
+  if ((a >> 3) > b)
 
9726
+    return a + c;
 
9727
+  else
 
9728
+    return a + b + c;
 
9729
+}
 
9730
+
 
9731
+typedef long long s64;
 
9732
+
 
9733
+s64
 
9734
+cmp_di_test1 (s64 a, s64 b, s64 c)
 
9735
+{
 
9736
+  if (a > b)
 
9737
+    return a + c;
 
9738
+  else
 
9739
+    return a + b + c;
 
9740
+}
 
9741
+
 
9742
+s64
 
9743
+cmp_di_test2 (s64 a, s64 b, s64 c)
 
9744
+{
 
9745
+  if ((a >> 3) > b)
 
9746
+    return a + c;
 
9747
+  else
 
9748
+    return a + b + c;
 
9749
+}
 
9750
+
 
9751
+int
 
9752
+cmp_di_test3 (int a, s64 b, s64 c)
 
9753
+{
 
9754
+  if (a > b)
 
9755
+    return a + c;
 
9756
+  else
 
9757
+    return a + b + c;
 
9758
+}
 
9759
+
 
9760
+int
 
9761
+cmp_di_test4 (int a, s64 b, s64 c)
 
9762
+{
 
9763
+  if (((s64)a << 3) > b)
 
9764
+    return a + c;
 
9765
+  else
 
9766
+    return a + b + c;
 
9767
+}
 
9768
+
 
9769
+/* { dg-final { scan-assembler-times "cmp\tw\[0-9\]+, w\[0-9\]+" 2 } } */
 
9770
+/* { dg-final { scan-assembler-times "cmp\tx\[0-9\]+, x\[0-9\]+" 4 } } */
 
9771
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-f.c
 
9772
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-ge-f.c
 
9773
@@ -2,12 +2,13 @@
 
9774
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
9775
 
 
9776
 #define FTYPE float
 
9777
+#define ITYPE int
 
9778
 #define OP >=
 
9779
 #define INV_OP <
 
9780
 
 
9781
 #include "vect-fcm.x"
 
9782
 
 
9783
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
9784
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
9785
 /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s" } } */
 
9786
 /* { dg-final { scan-assembler "fcmge\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */
 
9787
 /* { dg-final { scan-assembler "fcmlt\\tv\[0-9\]+\.\[24\]s, v\[0-9\]+\.\[24\]s, 0" } } */
 
9788
--- a/src/gcc/testsuite/gcc.target/aarch64/bfxil_2.c
 
9789
+++ b/src/gcc/testsuite/gcc.target/aarch64/bfxil_2.c
 
9790
@@ -0,0 +1,42 @@
 
9791
+/* { dg-do run { target aarch64*-*-* } } */
 
9792
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
9793
+/* { dg-require-effective-target aarch64_big_endian } */
 
9794
+
 
9795
+extern void abort (void);
 
9796
+
 
9797
+typedef struct bitfield
 
9798
+{
 
9799
+  unsigned short eight1: 8;
 
9800
+  unsigned short four: 4;
 
9801
+  unsigned short eight2: 8;
 
9802
+  unsigned short seven: 7;
 
9803
+  unsigned int sixteen: 16;
 
9804
+  unsigned short eight3: 8;
 
9805
+  unsigned short eight4: 8;
 
9806
+} bitfield;
 
9807
+
 
9808
+bitfield
 
9809
+bfxil (bitfield a)
 
9810
+{
 
9811
+  /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 40, 8" } } */
 
9812
+  a.eight4 = a.eight2;
 
9813
+  return a;
 
9814
+}
 
9815
+
 
9816
+int
 
9817
+main (void)
 
9818
+{
 
9819
+  static bitfield a;
 
9820
+  bitfield b;
 
9821
+
 
9822
+  a.eight4 = 9;
 
9823
+  a.eight2 = 57;
 
9824
+  b = bfxil (a);
 
9825
+
 
9826
+  if (b.eight4 != a.eight2)
 
9827
+    abort ();
 
9828
+
 
9829
+  return 0;
 
9830
+}
 
9831
+
 
9832
+/* { dg-final { cleanup-saved-temps } } */
 
9833
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fp.x
 
9834
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fp.x
 
9835
@@ -7,13 +7,23 @@
 
9836
 extern float fabsf (float);
 
9837
 extern double fabs (double);
 
9838
 
 
9839
+#define DEF3a(fname, type, op) \
 
9840
+                        void  fname##_##type (pR##type a,   \
 
9841
+                                              pR##type b,   \
 
9842
+                                              pR##type c)   \
 
9843
+                        {                                   \
 
9844
+                          int i;                            \
 
9845
+                          for (i = 0; i < 16; i++)          \
 
9846
+                            a[i] = op (b[i] - c[i]);        \
 
9847
+                        }
 
9848
+
 
9849
 #define DEF3(fname, type, op) \
 
9850
                        void  fname##_##type (pR##type a,   \
 
9851
                                              pR##type b,   \
 
9852
                                              pR##type c)   \
 
9853
                        {                                   \
 
9854
                          int i;                            \
 
9855
-                         for (i=0; i<16; i++)              \
 
9856
+                         for (i = 0; i < 16; i++)          \
 
9857
                            a[i] = b[i] op c[i];            \
 
9858
                        }
 
9859
 
 
9860
@@ -22,11 +32,15 @@
 
9861
                                             pR##type b) \
 
9862
                        {                                 \
 
9863
                          int i;                          \
 
9864
-                         for (i=0; i<16; i++)            \
 
9865
+                         for (i = 0; i < 16; i++)        \
 
9866
                            a[i] = op(b[i]);              \
 
9867
                        }
 
9868
 
 
9869
 
 
9870
+#define DEFN3a(fname, op) \
 
9871
+                DEF3a (fname, F32, op) \
 
9872
+                DEF3a (fname, F64, op)
 
9873
+
 
9874
 #define DEFN3(fname, op) \
 
9875
                DEF3 (fname, F32, op) \
 
9876
                DEF3 (fname, F64, op)
 
9877
@@ -42,3 +56,5 @@
 
9878
 DEFN2 (neg, -)
 
9879
 DEF2 (abs, F32, fabsf)
 
9880
 DEF2 (abs, F64, fabs)
 
9881
+DEF3a (fabd, F32, fabsf)
 
9882
+DEF3a (fabd, F64, fabs)
 
9883
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.c
 
9884
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-acq_rel.c
 
9885
@@ -1,43 +1,7 @@
 
9886
 /* { dg-do compile } */
 
9887
 /* { dg-options "-O2" } */
 
9888
 
 
9889
-int v = 0;
 
9890
+#include "atomic-op-acq_rel.x"
 
9891
 
 
9892
-int
 
9893
-atomic_fetch_add_ACQ_REL (int a)
 
9894
-{
 
9895
-  return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL);
 
9896
-}
 
9897
-
 
9898
-int
 
9899
-atomic_fetch_sub_ACQ_REL (int a)
 
9900
-{
 
9901
-  return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL);
 
9902
-}
 
9903
-
 
9904
-int
 
9905
-atomic_fetch_and_ACQ_REL (int a)
 
9906
-{
 
9907
-  return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL);
 
9908
-}
 
9909
-
 
9910
-int
 
9911
-atomic_fetch_nand_ACQ_REL (int a)
 
9912
-{
 
9913
-  return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL);
 
9914
-}
 
9915
-
 
9916
-int
 
9917
-atomic_fetch_xor_ACQ_REL (int a)
 
9918
-{
 
9919
-  return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL);
 
9920
-}
 
9921
-
 
9922
-int
 
9923
-atomic_fetch_or_ACQ_REL (int a)
 
9924
-{
 
9925
-  return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL);
 
9926
-}
 
9927
-
 
9928
 /* { dg-final { scan-assembler-times "ldaxr\tw\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
9929
 /* { dg-final { scan-assembler-times "stlxr\tw\[0-9\]+, w\[0-9\]+, \\\[x\[0-9\]+\\\]" 6 } } */
 
9930
--- a/src/gcc/testsuite/gcc.target/aarch64/subs1.c
 
9931
+++ b/src/gcc/testsuite/gcc.target/aarch64/subs1.c
 
9932
@@ -0,0 +1,149 @@
 
9933
+/* { dg-do run } */
 
9934
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
9935
+
 
9936
+extern void abort (void);
 
9937
+
 
9938
+int
 
9939
+subs_si_test1 (int a, int b, int c)
 
9940
+{
 
9941
+  int d = a - c;
 
9942
+
 
9943
+  /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
9944
+  if (d == 0)
 
9945
+    return a + c;
 
9946
+  else
 
9947
+    return b + d + c;
 
9948
+}
 
9949
+
 
9950
+int
 
9951
+subs_si_test2 (int a, int b, int c)
 
9952
+{
 
9953
+  int d = a - 0xff;
 
9954
+
 
9955
+  /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, #255" } } */
 
9956
+  if (d == 0)
 
9957
+    return a + c;
 
9958
+  else
 
9959
+    return b + d + c;
 
9960
+}
 
9961
+
 
9962
+int
 
9963
+subs_si_test3 (int a, int b, int c)
 
9964
+{
 
9965
+  int d = a - (b << 3);
 
9966
+
 
9967
+  /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
9968
+  if (d == 0)
 
9969
+    return a + c;
 
9970
+  else
 
9971
+    return b + d + c;
 
9972
+}
 
9973
+
 
9974
+typedef long long s64;
 
9975
+
 
9976
+s64
 
9977
+subs_di_test1 (s64 a, s64 b, s64 c)
 
9978
+{
 
9979
+  s64 d = a - c;
 
9980
+
 
9981
+  /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
9982
+  if (d == 0)
 
9983
+    return a + c;
 
9984
+  else
 
9985
+    return b + d + c;
 
9986
+}
 
9987
+
 
9988
+s64
 
9989
+subs_di_test2 (s64 a, s64 b, s64 c)
 
9990
+{
 
9991
+  s64 d = a - 0xff;
 
9992
+
 
9993
+  /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, #255" } } */
 
9994
+  if (d == 0)
 
9995
+    return a + c;
 
9996
+  else
 
9997
+    return b + d + c;
 
9998
+}
 
9999
+
 
10000
+s64
 
10001
+subs_di_test3 (s64 a, s64 b, s64 c)
 
10002
+{
 
10003
+  s64 d = a - (b << 3);
 
10004
+
 
10005
+  /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
10006
+  if (d == 0)
 
10007
+    return a + c;
 
10008
+  else
 
10009
+    return b + d + c;
 
10010
+}
 
10011
+
 
10012
+int main ()
 
10013
+{
 
10014
+  int x;
 
10015
+  s64 y;
 
10016
+
 
10017
+  x = subs_si_test1 (29, 4, 5);
 
10018
+  if (x != 33)
 
10019
+    abort ();
 
10020
+
 
10021
+  x = subs_si_test1 (5, 2, 20);
 
10022
+  if (x != 7)
 
10023
+    abort ();
 
10024
+
 
10025
+  x = subs_si_test2 (29, 4, 5);
 
10026
+  if (x != -217)
 
10027
+    abort ();
 
10028
+
 
10029
+  x = subs_si_test2 (1024, 2, 20);
 
10030
+  if (x != 791)
 
10031
+    abort ();
 
10032
+
 
10033
+  x = subs_si_test3 (35, 4, 5);
 
10034
+  if (x != 12)
 
10035
+    abort ();
 
10036
+
 
10037
+  x = subs_si_test3 (5, 2, 20);
 
10038
+  if (x != 11)
 
10039
+    abort ();
 
10040
+
 
10041
+  y = subs_di_test1 (0x130000029ll,
 
10042
+                    0x320000004ll,
 
10043
+                    0x505050505ll);
 
10044
+
 
10045
+  if (y != 0x45000002d)
 
10046
+    abort ();
 
10047
+
 
10048
+  y = subs_di_test1 (0x5000500050005ll,
 
10049
+                    0x2111211121112ll,
 
10050
+                    0x0000000002020ll);
 
10051
+  if (y != 0x7111711171117)
 
10052
+    abort ();
 
10053
+
 
10054
+  y = subs_di_test2 (0x130000029ll,
 
10055
+                    0x320000004ll,
 
10056
+                    0x505050505ll);
 
10057
+  if (y != 0x955050433)
 
10058
+    abort ();
 
10059
+
 
10060
+  y = subs_di_test2 (0x130002900ll,
 
10061
+                    0x320000004ll,
 
10062
+                    0x505050505ll);
 
10063
+  if (y != 0x955052d0a)
 
10064
+    abort ();
 
10065
+
 
10066
+  y = subs_di_test3 (0x130000029ll,
 
10067
+                    0x064000008ll,
 
10068
+                    0x505050505ll);
 
10069
+  if (y != 0x3790504f6)
 
10070
+    abort ();
 
10071
+
 
10072
+  y = subs_di_test3 (0x130002900ll,
 
10073
+                    0x088000008ll,
 
10074
+                    0x505050505ll);
 
10075
+  if (y != 0x27d052dcd)
 
10076
+    abort ();
 
10077
+
 
10078
+  return 0;
 
10079
+}
 
10080
+
 
10081
+/* { dg-final { cleanup-saved-temps } } */
 
10082
--- a/src/gcc/testsuite/gcc.target/aarch64/adds2.c
 
10083
+++ b/src/gcc/testsuite/gcc.target/aarch64/adds2.c
 
10084
@@ -0,0 +1,155 @@
 
10085
+/* { dg-do run } */
 
10086
+/* { dg-options "-O2 --save-temps -fno-inline" } */
 
10087
+
 
10088
+extern void abort (void);
 
10089
+
 
10090
+int
 
10091
+adds_si_test1 (int a, int b, int c)
 
10092
+{
 
10093
+  int d = a + b;
 
10094
+
 
10095
+  /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
10096
+  /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
 
10097
+  if (d <= 0)
 
10098
+    return a + c;
 
10099
+  else
 
10100
+    return b + d + c;
 
10101
+}
 
10102
+
 
10103
+int
 
10104
+adds_si_test2 (int a, int b, int c)
 
10105
+{
 
10106
+  int d = a + 0xfff;
 
10107
+
 
10108
+  /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, 4095" } } */
 
10109
+  /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, 4095" } } */
 
10110
+  if (d <= 0)
 
10111
+    return a + c;
 
10112
+  else
 
10113
+    return b + d + c;
 
10114
+}
 
10115
+
 
10116
+int
 
10117
+adds_si_test3 (int a, int b, int c)
 
10118
+{
 
10119
+  int d = a + (b << 3);
 
10120
+
 
10121
+  /* { dg-final { scan-assembler-not "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
10122
+  /* { dg-final { scan-assembler "add\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
 
10123
+  if (d <= 0)
 
10124
+    return a + c;
 
10125
+  else
 
10126
+    return b + d + c;
 
10127
+}
 
10128
+
 
10129
+typedef long long s64;
 
10130
+
 
10131
+s64
 
10132
+adds_di_test1 (s64 a, s64 b, s64 c)
 
10133
+{
 
10134
+  s64 d = a + b;
 
10135
+
 
10136
+  /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
10137
+  /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
 
10138
+  if (d <= 0)
 
10139
+    return a + c;
 
10140
+  else
 
10141
+    return b + d + c;
 
10142
+}
 
10143
+
 
10144
+s64
 
10145
+adds_di_test2 (s64 a, s64 b, s64 c)
 
10146
+{
 
10147
+  s64 d = a + 0x1000ll;
 
10148
+
 
10149
+  /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, 4096" } } */
 
10150
+  /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, 4096" } } */
 
10151
+  if (d <= 0)
 
10152
+    return a + c;
 
10153
+  else
 
10154
+    return b + d + c;
 
10155
+}
 
10156
+
 
10157
+s64
 
10158
+adds_di_test3 (s64 a, s64 b, s64 c)
 
10159
+{
 
10160
+  s64 d = a + (b << 3);
 
10161
+
 
10162
+  /* { dg-final { scan-assembler-not "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
10163
+  /* { dg-final { scan-assembler "add\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
 
10164
+  if (d <= 0)
 
10165
+    return a + c;
 
10166
+  else
 
10167
+    return b + d + c;
 
10168
+}
 
10169
+
 
10170
+int main ()
 
10171
+{
 
10172
+  int x;
 
10173
+  s64 y;
 
10174
+
 
10175
+  x = adds_si_test1 (29, 4, 5);
 
10176
+  if (x != 42)
 
10177
+    abort ();
 
10178
+
 
10179
+  x = adds_si_test1 (5, 2, 20);
 
10180
+  if (x != 29)
 
10181
+    abort ();
 
10182
+
 
10183
+  x = adds_si_test2 (29, 4, 5);
 
10184
+  if (x != 4133)
 
10185
+    abort ();
 
10186
+
 
10187
+  x = adds_si_test2 (1024, 2, 20);
 
10188
+  if (x != 5141)
 
10189
+    abort ();
 
10190
+
 
10191
+  x = adds_si_test3 (35, 4, 5);
 
10192
+  if (x != 76)
 
10193
+    abort ();
 
10194
+
 
10195
+  x = adds_si_test3 (5, 2, 20);
 
10196
+  if (x != 43)
 
10197
+    abort ();
 
10198
+
 
10199
+  y = adds_di_test1 (0x130000029ll,
 
10200
+                    0x320000004ll,
 
10201
+                    0x505050505ll);
 
10202
+
 
10203
+  if (y != 0xc75050536)
 
10204
+    abort ();
 
10205
+
 
10206
+  y = adds_di_test1 (0x5000500050005ll,
 
10207
+                    0x2111211121112ll,
 
10208
+                    0x0000000002020ll);
 
10209
+  if (y != 0x9222922294249)
 
10210
+    abort ();
 
10211
+
 
10212
+  y = adds_di_test2 (0x130000029ll,
 
10213
+                    0x320000004ll,
 
10214
+                    0x505050505ll);
 
10215
+  if (y != 0x955051532)
 
10216
+    abort ();
 
10217
+
 
10218
+  y = adds_di_test2 (0x540004100ll,
 
10219
+                    0x320000004ll,
 
10220
+                    0x805050205ll);
 
10221
+  if (y != 0x1065055309)
 
10222
+    abort ();
 
10223
+
 
10224
+  y = adds_di_test3 (0x130000029ll,
 
10225
+                    0x064000008ll,
 
10226
+                    0x505050505ll);
 
10227
+  if (y != 0x9b9050576)
 
10228
+    abort ();
 
10229
+
 
10230
+  y = adds_di_test3 (0x130002900ll,
 
10231
+                    0x088000008ll,
 
10232
+                    0x505050505ll);
 
10233
+  if (y != 0xafd052e4d)
 
10234
+    abort ();
 
10235
+
 
10236
+  return 0;
 
10237
+}
 
10238
+
 
10239
+/* { dg-final { cleanup-saved-temps } } */
 
10240
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-d.c
 
10241
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-fcm-gt-d.c
 
10242
@@ -2,12 +2,13 @@
 
10243
 /* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
 
10244
 
 
10245
 #define FTYPE double
 
10246
+#define ITYPE long
 
10247
 #define OP >
 
10248
 #define INV_OP <=
 
10249
 
 
10250
 #include "vect-fcm.x"
 
10251
 
 
10252
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" } } */
 
10253
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 8 "vect" } } */
 
10254
 /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" } } */
 
10255
 /* { dg-final { scan-assembler "fcmgt\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */
 
10256
 /* { dg-final { scan-assembler "fcmle\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, 0" } } */
 
10257
--- a/src/gcc/testsuite/lib/target-supports.exp
 
10258
+++ b/src/gcc/testsuite/lib/target-supports.exp
 
10259
@@ -487,13 +487,6 @@
 
10260
        return 0
 
10261
     }
 
10262
 
 
10263
-    # We don't yet support profiling for AArch64.
 
10264
-    if { [istarget aarch64*-*-*]
 
10265
-        && ([lindex $test_what 1] == "-p"
 
10266
-            || [lindex $test_what 1] == "-pg") } {
 
10267
-       return 0
 
10268
-    }
 
10269
-
 
10270
     # cygwin does not support -p.
 
10271
     if { [istarget *-*-cygwin*] && $test_what == "-p" } {
 
10272
        return 0
 
10273
@@ -2012,6 +2005,7 @@
 
10274
              || ([istarget powerpc*-*-*]
 
10275
                  && ![istarget powerpc-*-linux*paired*])
 
10276
              || [istarget x86_64-*-*] 
 
10277
+             || [istarget aarch64*-*-*]
 
10278
              || ([istarget arm*-*-*]
 
10279
                  && [check_effective_target_arm_neon_ok])} {
 
10280
            set et_vect_uintfloat_cvt_saved 1
 
10281
@@ -2078,6 +2072,15 @@
 
10282
     }]
 
10283
 }
 
10284
 
 
10285
+# Return 1 if this is a AArch64 target supporting little endian
 
10286
+proc check_effective_target_aarch64_little_endian { } {
 
10287
+    return [check_no_compiler_messages aarch64_little_endian assembly {
 
10288
+        #if !defined(__aarch64__) || defined(__AARCH64EB__)
 
10289
+        #error FOO
 
10290
+        #endif
 
10291
+    }]
 
10292
+}
 
10293
+
 
10294
 # Return 1 is this is an arm target using 32-bit instructions
 
10295
 proc check_effective_target_arm32 { } {
 
10296
     return [check_no_compiler_messages arm32 assembly {
 
10297
@@ -2147,22 +2150,6 @@
 
10298
     }
 
10299
 }
 
10300
 
 
10301
-# Return 1 if this is an ARM target supporting -mfpu=neon-fp-armv8
 
10302
-# -mfloat-abi=softfp
 
10303
-proc check_effective_target_arm_v8_neon_ok {} {
 
10304
-    if { [check_effective_target_arm32] } {
 
10305
-       return [check_no_compiler_messages arm_v8_neon_ok object {
 
10306
-         int foo (void)
 
10307
-         {
 
10308
-            __asm__ volatile ("vrintn.f32 q0, q0");
 
10309
-              return 0;
 
10310
-         }
 
10311
-       } "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"]
 
10312
-    } else {
 
10313
-       return 0
 
10314
-    }
 
10315
-}
 
10316
-
 
10317
 # Return 1 if this is an ARM target supporting -mfpu=vfp
 
10318
 # -mfloat-abi=hard.  Some multilibs may be incompatible with these
 
10319
 # options.
 
10320
@@ -2226,7 +2213,8 @@
 
10321
     if { ! [check_effective_target_arm_v8_neon_ok] } {
 
10322
         return "$flags"
 
10323
     }
 
10324
-    return "$flags -march=armv8-a -mfpu=neon-fp-armv8 -mfloat-abi=softfp"
 
10325
+    global et_arm_v8_neon_flags
 
10326
+    return "$flags $et_arm_v8_neon_flags -march=armv8-a"
 
10327
 }
 
10328
 
 
10329
 # Add the options needed for NEON.  We need either -mfloat-abi=softfp
 
10330
@@ -2270,6 +2258,79 @@
 
10331
                check_effective_target_arm_neon_ok_nocache]
 
10332
 }
 
10333
 
 
10334
+# Return 1 if this is an ARM target supporting -mfpu=neon-fp16
 
10335
+# -mfloat-abi=softfp or equivalent options.  Some multilibs may be
 
10336
+# incompatible with these options.  Also set et_arm_neon_flags to the
 
10337
+# best options to add.
 
10338
+
 
10339
+proc check_effective_target_arm_neon_fp16_ok_nocache { } {
 
10340
+    global et_arm_neon_fp16_flags
 
10341
+    set et_arm_neon_fp16_flags ""
 
10342
+    if { [check_effective_target_arm32] } {
 
10343
+       foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp16"
 
10344
+                      "-mfpu=neon-fp16 -mfloat-abi=softfp"} {
 
10345
+           if { [check_no_compiler_messages_nocache arm_neon_fp_16_ok object {
 
10346
+               #include "arm_neon.h"
 
10347
+               float16x4_t
 
10348
+               foo (float32x4_t arg)
 
10349
+               {
 
10350
+                  return vcvt_f16_f32 (arg);
 
10351
+               }
 
10352
+           } "$flags"] } {
 
10353
+               set et_arm_neon_fp16_flags $flags
 
10354
+               return 1
 
10355
+           }
 
10356
+       }
 
10357
+    }
 
10358
+
 
10359
+    return 0
 
10360
+}
 
10361
+
 
10362
+proc check_effective_target_arm_neon_fp16_ok { } {
 
10363
+    return [check_cached_effective_target arm_neon_fp16_ok \
 
10364
+               check_effective_target_arm_neon_fp16_ok_nocache]
 
10365
+}
 
10366
+
 
10367
+proc add_options_for_arm_neon_fp16 { flags } {
 
10368
+    if { ! [check_effective_target_arm_neon_fp16_ok] } {
 
10369
+       return "$flags"
 
10370
+    }
 
10371
+    global et_arm_neon_fp16_flags
 
10372
+    return "$flags $et_arm_neon_fp16_flags"
 
10373
+}
 
10374
+
 
10375
+# Return 1 if this is an ARM target supporting -mfpu=neon-fp-armv8
 
10376
+# -mfloat-abi=softfp or equivalent options.  Some multilibs may be
 
10377
+# incompatible with these options.  Also set et_arm_v8_neon_flags to the
 
10378
+# best options to add.
 
10379
+
 
10380
+proc check_effective_target_arm_v8_neon_ok_nocache { } {
 
10381
+    global et_arm_v8_neon_flags
 
10382
+    set et_arm_v8_neon_flags ""
 
10383
+    if { [check_effective_target_arm32] } {
 
10384
+       foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-fp-armv8" "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"} {
 
10385
+           if { [check_no_compiler_messages_nocache arm_v8_neon_ok object {
 
10386
+               #include "arm_neon.h"
 
10387
+               void
 
10388
+               foo ()
 
10389
+               {
 
10390
+                 __asm__ volatile ("vrintn.f32 q0, q0");
 
10391
+               }
 
10392
+           } "$flags"] } {
 
10393
+               set et_arm_v8_neon_flags $flags
 
10394
+               return 1
 
10395
+           }
 
10396
+       }
 
10397
+    }
 
10398
+
 
10399
+    return 0
 
10400
+}
 
10401
+
 
10402
+proc check_effective_target_arm_v8_neon_ok { } {
 
10403
+    return [check_cached_effective_target arm_v8_neon_ok \
 
10404
+               check_effective_target_arm_v8_neon_ok_nocache]
 
10405
+}
 
10406
+
 
10407
 # Return 1 if this is an ARM target supporting -mfpu=neon-vfpv4
 
10408
 # -mfloat-abi=softfp or equivalent options.  Some multilibs may be
 
10409
 # incompatible with these options.  Also set et_arm_neonv2_flags to the
 
10410
@@ -2509,6 +2570,24 @@
 
10411
     } [add_options_for_arm_neonv2 ""]]
 
10412
 }
 
10413
 
 
10414
+# Return 1 if the target supports executing ARMv8 NEON instructions, 0
 
10415
+# otherwise.
 
10416
+
 
10417
+proc check_effective_target_arm_v8_neon_hw { } {
 
10418
+    return [check_runtime arm_v8_neon_hw_available {
 
10419
+        #include "arm_neon.h"
 
10420
+       int
 
10421
+       main (void)
 
10422
+       {
 
10423
+         float32x2_t a;
 
10424
+         asm ("vrinta.f32 %P0, %P1"
 
10425
+              : "=w" (a)
 
10426
+              : "0" (a));
 
10427
+         return 0;
 
10428
+       }
 
10429
+    } [add_options_for_arm_v8_neon ""]]
 
10430
+}
 
10431
+
 
10432
 # Return 1 if this is a ARM target with NEON enabled.
 
10433
 
 
10434
 proc check_effective_target_arm_neon { } {
 
10435
@@ -4591,6 +4670,33 @@
 
10436
     return 0
 
10437
 }
 
10438
 
 
10439
+# Return 1 if programs are intended to be run on hardware rather than
 
10440
+# on a simulator
 
10441
+
 
10442
+proc check_effective_target_hw { } {
 
10443
+
 
10444
+    # All "src/sim" simulators set this one.
 
10445
+    if [board_info target exists is_simulator] {
 
10446
+       if [board_info target is_simulator] {
 
10447
+         return 0
 
10448
+       } else {
 
10449
+         return 1
 
10450
+       }
 
10451
+    }
 
10452
+
 
10453
+    # The "sid" simulators don't set that one, but at least they set
 
10454
+    # this one.
 
10455
+    if [board_info target exists slow_simulator] {
 
10456
+       if [board_info target slow_simulator] {
 
10457
+         return 0
 
10458
+       } else {
 
10459
+         return 1
 
10460
+       }
 
10461
+    }
 
10462
+
 
10463
+    return 1
 
10464
+}
 
10465
+
 
10466
 # Return 1 if the target is a VxWorks kernel.
 
10467
 
 
10468
 proc check_effective_target_vxworks_kernel { } {
 
10469
--- a/src/gcc/testsuite/ChangeLog.linaro
 
10470
+++ b/src/gcc/testsuite/ChangeLog.linaro
 
10471
@@ -0,0 +1,681 @@
 
10472
+2013-10-09  Christophe Lyon  <christophe.lyon@linaro.org>
 
10473
+
 
10474
+       Backport from trunk r198526,200595,200597.
 
10475
+       2013-05-02  Ian Bolton  <ian.bolton@arm.com>
 
10476
+
 
10477
+       * gcc.target/aarch64/bics_1.c: New test.
 
10478
+       * gcc.target/aarch64/bics_2.c: Likewise.
 
10479
+
 
10480
+       2013-07-02  Ian Bolton  <ian.bolton@arm.com>
 
10481
+
 
10482
+       * gcc.target/aarch64/bfxil_1.c: New test.
 
10483
+       * gcc.target/aarch64/bfxil_2.c: Likewise.
 
10484
+
 
10485
+       2013-07-02  Ian Bolton  <ian.bolton@arm.com>
 
10486
+
 
10487
+       * gcc.target/config/aarch64/insv_1.c: Update to show it doesn't work
 
10488
+       on big endian.
 
10489
+       * gcc.target/config/aarch64/insv_2.c: New test for big endian.
 
10490
+       * lib/target-supports.exp: Define aarch64_little_endian.
 
10491
+
 
10492
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
10493
+
 
10494
+       Backport from trunk r202400.
 
10495
+       2013-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10496
+
 
10497
+       * gcc.target/aarch64/cmn-neg.c: New test.
 
10498
+
 
10499
+2013-10-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
10500
+
 
10501
+       Backport from trunk r202164.
 
10502
+       2013-09-02  Bin Cheng  <bin.cheng@arm.com>
 
10503
+
 
10504
+       * gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.
 
10505
+
 
10506
+2013-10-01  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
10507
+
 
10508
+       Backport from trunk r203059,203116.
 
10509
+       2013-10-01  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
10510
+
 
10511
+       PR Target/58578
 
10512
+       * gcc.target/arm/pr58578.c: New test.
 
10513
+
 
10514
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
10515
+
 
10516
+        GCC Linaro 4.8-2013.09 released.
 
10517
+
 
10518
+2013-09-06  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
10519
+
 
10520
+       Backport from trunk r201411.
 
10521
+       2013-08-01  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10522
+
 
10523
+       * gcc.target/arm/pr46972-2.c: New test.
 
10524
+
 
10525
+2013-09-05  Yvan Roux  <yvan.roux@linaro.org>
 
10526
+
 
10527
+       Backport from trunk r201267.
 
10528
+       2013-07-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10529
+
 
10530
+       * gcc.target/arm/minmax_minus.c: Scan for absence of mov.
 
10531
+
 
10532
+2013-09-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
10533
+
 
10534
+       Backport from trunk r199527,199814,201435.
 
10535
+       2013-05-31  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10536
+
 
10537
+       PR target/56315
 
10538
+       * gcc.target/arm/iordi3-opt.c: New test.
 
10539
+
 
10540
+       2013-06-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10541
+
 
10542
+       PR target/56315
 
10543
+       * gcc.target/arm/xordi3-opt.c: New test.
 
10544
+
 
10545
+       2013-08-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10546
+
 
10547
+       * gcc.target/arm/neon-for-64bits-2.c: Delete.
 
10548
+
 
10549
+2013-09-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
10550
+
 
10551
+       Backport from trunk r201730,201731.
 
10552
+
 
10553
+       2013-08-14  Janis Johnson  <janisjo@codesourcery.com>
 
10554
+
 
10555
+       * gcc.target/arm/atomic-comp-swap-release-acquire.c: Move dg-do
 
10556
+       to be the first test directive.
 
10557
+       * gcc.target/arm/atomic-op-acq_rel.c: Likewise.
 
10558
+       * gcc.target/arm/atomic-op-acquire.c: Likewise.
 
10559
+       * gcc.target/arm/atomic-op-char.c: Likewise.
 
10560
+       * gcc.target/arm/atomic-op-consume.c: Likewise.
 
10561
+       * gcc.target/arm/atomic-op-int.c: Likewise.
 
10562
+       * gcc.target/arm/atomic-op-relaxed.c: Likewise.
 
10563
+       * gcc.target/arm/atomic-op-release.c: Likewise.
 
10564
+       * gcc.target/arm/atomic-op-seq_cst.c: Likewise.
 
10565
+       * gcc.target/arm/atomic-op-short.c: Likewise.
 
10566
+
 
10567
+       2013-08-14  Janis Johnson  <janisjo@codesourcery.com>
 
10568
+
 
10569
+       * gcc.target/arm/pr19599.c: Skip for -mthumb.
 
10570
+
 
10571
+2013-09-03  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
10572
+
 
10573
+       Backport from trunk r201624.
 
10574
+       2013-08-09  James Greenhalgh  <james.greenhalgh@arm.com>
 
10575
+
 
10576
+       * gcc.target/aarch64/scalar_intrinsics.c: Update expected
 
10577
+       output of vdup intrinsics
 
10578
+
 
10579
+2013-08-26  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
10580
+
 
10581
+       Backport from trunk r201636.
 
10582
+       2013-08-09  Yufeng Zhang  <yufeng.zhang@arm.com>
 
10583
+
 
10584
+       * gcc.dg/lower-subreg-1.c: Skip aarch64*-*-*.
 
10585
+
 
10586
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
10587
+
 
10588
+       GCC Linaro 4.8-2013.08 released.
 
10589
+
 
10590
+2013-08-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
10591
+
 
10592
+       Backport from trunk r199720
 
10593
+       2013-06-06  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
10594
+
 
10595
+       * gcc.dg/vect/no-section-anchors-vect-68.c:
 
10596
+       Add dg-skip-if aarch64_tiny.
 
10597
+
 
10598
+2013-08-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
10599
+
 
10600
+       Backport from trunk r201237.
 
10601
+       2013-07-25  Terry Guo  <terry.guo@arm.com>
 
10602
+
 
10603
+       * gcc.target/arm/thumb1-Os-mult.c: New test case.
 
10604
+
 
10605
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
10606
+
 
10607
+       Backport from trunk r200596,201067,201083.
 
10608
+       2013-07-02  Ian Bolton  <ian.bolton@arm.com>
 
10609
+
 
10610
+       * gcc.target/aarch64/abs_1.c: New test.
 
10611
+
 
10612
+       2013-07-19  Ian Bolton  <ian.bolton@arm.com>
 
10613
+
 
10614
+       * gcc.target/aarch64/scalar_intrinsics.c (test_vabs_s64): Added
 
10615
+       new testcase.
 
10616
+
 
10617
+       2013-07-20  James Greenhalgh  <james.greenhalgh@arm.com>
 
10618
+
 
10619
+       * gcc.target/aarch64/vabs_intrinsic_1.c: New file.
 
10620
+
 
10621
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
10622
+
 
10623
+       Backport from trunk r198864.
 
10624
+       2013-05-07  Ian Bolton  <ian.bolton@arm.com>
 
10625
+
 
10626
+       * gcc.target/aarch64/ands_1.c: New test.
 
10627
+       * gcc.target/aarch64/ands_2.c: Likewise
 
10628
+
 
10629
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
10630
+
 
10631
+       Backport from trunk r199439,199533,201326.
 
10632
+
 
10633
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
10634
+
 
10635
+       * gcc.dg/shrink-wrap-alloca.c: New added.
 
10636
+       * gcc.dg/shrink-wrap-pretend.c: New added.
 
10637
+       * gcc.dg/shrink-wrap-sibcall.c: New added.
 
10638
+
 
10639
+       2013-05-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
10640
+
 
10641
+       * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
 
10642
+
 
10643
+       2013-07-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
10644
+
 
10645
+       * gcc.target/arm/pr57637.c: New testcase.
 
10646
+
 
10647
+2013-08-06  Christophe Lyon  <christophe.lyon@linaro.org>
 
10648
+
 
10649
+       Backport from trunk r198928,198973,199203,201240,201241.
 
10650
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
10651
+
 
10652
+       PR target/19599
 
10653
+       * gcc.target/arm/pr40887.c: Adjust testcase.
 
10654
+       * gcc.target/arm/pr19599.c: New test.
 
10655
+
 
10656
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
10657
+
 
10658
+       Backport from trunk r200922.
 
10659
+       2013-07-12  Tejas Belagod  <tejas.belagod@arm.com>
 
10660
+
 
10661
+       * gcc.target/aarch64/vect-movi.c: New.
 
10662
+
 
10663
+2013-08-05  Yvan Roux  <yvan.roux@linaro.org>
 
10664
+
 
10665
+       Backport from trunk r200720.
 
10666
+       2013-07-05  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
10667
+
 
10668
+       * gcc.dg/pr57518.c: Adjust scan-rtl-dump-not pattern.
 
10669
+
 
10670
+2013-07-21  Yvan Roux  <yvan.roux@linaro.org>
 
10671
+
 
10672
+       Backport from trunk r200204.
 
10673
+       2013-06-19  Yufeng Zhang  <yufeng.zhang@arm.com>
 
10674
+
 
10675
+       * gcc.dg/torture/stackalign/builtin-apply-2.c: set
 
10676
+       STACK_ARGUMENTS_SIZE with 0 if __aarch64__ is defined.
 
10677
+
 
10678
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10679
+
 
10680
+        GCC Linaro 4.8-2013.07-1 released.
 
10681
+
 
10682
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
10683
+
 
10684
+       GCC Linaro 4.8-2013.07 released.
 
10685
+
 
10686
+2013-07-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
10687
+
 
10688
+       Revert backport from trunk r198928.
 
10689
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
10690
+
 
10691
+       PR target/19599
 
10692
+       * gcc.target/arm/pr40887.c: Adjust testcase.
 
10693
+       * gcc.target/arm/pr19599.c: New test.
 
10694
+
 
10695
+2013-07-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
10696
+
 
10697
+       Revert backport from trunk 199439, 199533
 
10698
+       2013-05-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
10699
+
 
10700
+       * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
 
10701
+
 
10702
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
10703
+
 
10704
+       * gcc.dg/shrink-wrap-alloca.c: New added.
 
10705
+       * gcc.dg/shrink-wrap-pretend.c: New added.
 
10706
+       * gcc.dg/shrink-wrap-sibcall.c: New added.
 
10707
+
 
10708
+2013-07-02  Rob Savoye  <rob.savoye@linaro.org>
 
10709
+
 
10710
+       Backport from trunk 200096
 
10711
+
 
10712
+       2013-06-14  Vidya Praveen <vidyapraveen@arm.com>
 
10713
+
 
10714
+       * gcc.target/aarch64/vect_smlal_1.c: New file.
 
10715
+
 
10716
+2013-07-02  Rob Savoye  <rob.savoye@linaro.org>
 
10717
+
 
10718
+       Backport from trunk 200019
 
10719
+       2013-06-12  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
10720
+
 
10721
+       * gcc.target/arm/unaligned-memcpy-4.c (src, dst): Initialize
 
10722
+       to ensure alignment.
 
10723
+       * gcc.target/arm/unaligned-memcpy-3.c (src): Likewise.
 
10724
+
 
10725
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
10726
+
 
10727
+       Backport from trunk 200152
 
10728
+       2013-06-17  Sofiane Naci  <sofiane.naci@arm.com>
 
10729
+
 
10730
+       * gcc.target/aarch64/scalar_intrinsics.c: Update.
 
10731
+
 
10732
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
10733
+
 
10734
+       Backport from trunk 200148
 
10735
+       2013-06-17  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10736
+
 
10737
+       * gcc.target/arm/unaligned-memcpy-2.c (dest): Initialize to
 
10738
+       ensure alignment.
 
10739
+
 
10740
+2013-06-20  Rob Savoye  <rob.savoye@linaro.org>
 
10741
+
 
10742
+       Backport from trunk 199533
 
10743
+       2013-05-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
10744
+
 
10745
+       * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
 
10746
+
 
10747
+2013-06-20  Christophe Lyon  <christophe.lyon@linaro.org>
 
10748
+
 
10749
+       Backport from trunk r198683.
 
10750
+       2013-05-07  Christophe Lyon  <christophe.lyon@linaro.org>
 
10751
+
 
10752
+       * lib/target-supports.exp (check_effective_target_hw): New
 
10753
+       function.
 
10754
+       * c-c++-common/asan/clone-test-1.c: Call
 
10755
+       check_effective_target_hw.
 
10756
+       * c-c++-common/asan/rlimit-mmap-test-1.c: Likewise.
 
10757
+       * c-c++-common/asan/heap-overflow-1.c: Update regexps to accept
 
10758
+       possible decorations.
 
10759
+       * c-c++-common/asan/null-deref-1.c: Likewise.
 
10760
+       * c-c++-common/asan/stack-overflow-1.c: Likewise.
 
10761
+       * c-c++-common/asan/strncpy-overflow-1.c: Likewise.
 
10762
+       * c-c++-common/asan/use-after-free-1.c: Likewise.
 
10763
+       * g++.dg/asan/deep-thread-stack-1.C: Likewise.
 
10764
+       * g++.dg/asan/large-func-test-1.C: Likewise.
 
10765
+
 
10766
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
10767
+
 
10768
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
10769
+
 
10770
+2013-06-06  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
10771
+
 
10772
+       Backport from mainline r199439.
 
10773
+       2013-05-30  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
10774
+
 
10775
+       * gcc.dg/shrink-wrap-alloca.c: New added.
 
10776
+       * gcc.dg/shrink-wrap-pretend.c: New added.
 
10777
+       * gcc.dg/shrink-wrap-sibcall.c: New added.
 
10778
+
 
10779
+2013-06-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
10780
+
 
10781
+       Backport from trunk r199658.
 
10782
+       2013-06-04  Ian Bolton  <ian.bolton@arm.com>
 
10783
+
 
10784
+       * gcc.target/aarch64/movi_1.c: New test.
 
10785
+
 
10786
+2013-06-04  Christophe Lyon  <christophe.lyon@linaro.org>
 
10787
+
 
10788
+       Backport from trunk r199261.
 
10789
+       2013-05-23  Christian Bruel  <christian.bruel@st.com>
 
10790
+
 
10791
+       PR debug/57351
 
10792
+       * gcc.dg/debug/pr57351.c: New test
 
10793
+
 
10794
+2013-06-03  Christophe Lyon  <christophe.lyon@linaro.org>
 
10795
+       Backport from trunk r198890,199254,199294,199454.
 
10796
+
 
10797
+       2013-05-30  Ian Bolton  <ian.bolton@arm.com>
 
10798
+
 
10799
+       * gcc.target/aarch64/insv_1.c: New test.
 
10800
+
 
10801
+       2013-05-24  Ian Bolton  <ian.bolton@arm.com>
 
10802
+
 
10803
+       * gcc.target/aarch64/scalar_intrinsics.c
 
10804
+       (force_simd): Use a valid instruction.
 
10805
+       (test_vdupd_lane_s64): Pass a valid lane argument.
 
10806
+       (test_vdupd_lane_u64): Likewise.
 
10807
+
 
10808
+       2013-05-23  Vidya Praveen <vidyapraveen@arm.com>
 
10809
+
 
10810
+       * gcc.target/aarch64/vect-clz.c: New file.
 
10811
+
 
10812
+       2013-05-14  James Greenhalgh  <james.greenhalgh@arm.com>
 
10813
+
 
10814
+       * gcc.target/aarch64/vect-fcm.x: Add cases testing
 
10815
+       FLOAT cmp FLOAT ? INT : INT.
 
10816
+       * gcc.target/aarch64/vect-fcm-eq-d.c: Define IMODE.
 
10817
+       * gcc.target/aarch64/vect-fcm-eq-f.c: Likewise.
 
10818
+       * gcc.target/aarch64/vect-fcm-ge-d.c: Likewise.
 
10819
+       * gcc.target/aarch64/vect-fcm-ge-f.c: Likewise.
 
10820
+       * gcc.target/aarch64/vect-fcm-gt-d.c: Likewise.
 
10821
+       * gcc.target/aarch64/vect-fcm-gt-f.c: Likewise.
 
10822
+
 
10823
+2013-05-29  Christophe Lyon  <christophe.lyon@linaro.org>
 
10824
+
 
10825
+       Backport from trunk r198928.
 
10826
+       2013-05-15  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
10827
+
 
10828
+       PR target/19599
 
10829
+       * gcc.target/arm/pr40887.c: Adjust testcase.
 
10830
+       * gcc.target/arm/pr19599.c: New test.
 
10831
+
 
10832
+2013-05-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
10833
+
 
10834
+       Backport from trunk r198680.
 
10835
+       2013-05-07  Sofiane Naci  <sofiane.naci@arm.com>
 
10836
+
 
10837
+       * gcc.target/aarch64/scalar_intrinsics.c: Update.
 
10838
+
 
10839
+2013-05-28  Christophe Lyon  <christophe.lyon@linaro.org>
 
10840
+
 
10841
+       Backport from trunk r198499-198500.
 
10842
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
10843
+       * gcc.target/aarch64/vect-vaddv.c: New.
 
10844
+
 
10845
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
10846
+
 
10847
+       * gcc.target/aarch64/vect-vmaxv.c: New.
 
10848
+       * gcc.target/aarch64/vect-vfmaxv.c: Likewise.
 
10849
+
 
10850
+2013-05-23  Christophe Lyon  <christophe.lyon@linaro.org>
 
10851
+
 
10852
+       Backport from trunk r198970.
 
10853
+       2013-05-16  Greta Yorsh  <Greta.Yorsh@arm.com>
 
10854
+
 
10855
+       * gcc.target/arm/unaligned-memcpy-2.c: Adjust expected output.
 
10856
+       * gcc.target/arm/unaligned-memcpy-3.c: Likewise.
 
10857
+       * gcc.target/arm/unaligned-memcpy-4.c: Likewise.
 
10858
+
 
10859
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10860
+
 
10861
+       GCC Linaro 4.8-2013.05 released.
 
10862
+
 
10863
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10864
+
 
10865
+       Backport from trunk r198574-198575.
 
10866
+       2013-05-03  Vidya Praveen <vidyapraveen@arm.com>
 
10867
+
 
10868
+       * gcc.target/aarch64/fabd.c: New file.
 
10869
+
 
10870
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10871
+
 
10872
+       Backport from trunk r198490-198496.
 
10873
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
10874
+
 
10875
+       * gcc.target/aarch64/scalar-vca.c: New.
 
10876
+       * gcc.target/aarch64/vect-vca.c: Likewise.
 
10877
+
 
10878
+       2013-05-01  James Greenhalgh  <james.greenhalgh@arm.com>
 
10879
+
 
10880
+       * gcc.target/aarch64/scalar_intrinsics.c (force_simd): New.
 
10881
+       (test_vceqd_s64): Force arguments to SIMD registers.
 
10882
+       (test_vceqzd_s64): Likewise.
 
10883
+       (test_vcged_s64): Likewise.
 
10884
+       (test_vcled_s64): Likewise.
 
10885
+       (test_vcgezd_s64): Likewise.
 
10886
+       (test_vcged_u64): Likewise.
 
10887
+       (test_vcgtd_s64): Likewise.
 
10888
+       (test_vcltd_s64): Likewise.
 
10889
+       (test_vcgtzd_s64): Likewise.
 
10890
+       (test_vcgtd_u64): Likewise.
 
10891
+       (test_vclezd_s64): Likewise.
 
10892
+       (test_vcltzd_s64): Likewise.
 
10893
+       (test_vtst_s64): Likewise.
 
10894
+       (test_vtst_u64): Likewise.
 
10895
+
 
10896
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10897
+
 
10898
+       Backport from trunk r198191.
 
10899
+       2013-04-23  Sofiane Naci  <sofiane.naci@arm.com>
 
10900
+
 
10901
+       * gcc.target/aarch64/scalar-mov.c: New testcase.
 
10902
+
 
10903
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10904
+
 
10905
+       Backport from trunk r197838.
 
10906
+       2013-04-11   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
10907
+
 
10908
+       * gcc.target/aarch64/negs.c: New.
 
10909
+
 
10910
+2013-05-02  Matthew Gretton-Dann   <matthew.gretton-dann@linaro.org>
 
10911
+
 
10912
+       Backport from trunk r198019.
 
10913
+       2013-04-16   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
10914
+
 
10915
+       * gcc.target/aarch64/adds1.c: New.
 
10916
+       * gcc.target/aarch64/adds2.c: New.
 
10917
+       * gcc.target/aarch64/subs1.c: New.
 
10918
+       * gcc.target/aarch64/subs2.c: New.
 
10919
+
 
10920
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10921
+
 
10922
+       Backport from trunk r198394,198396-198400,198402-198404,198406.
 
10923
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
10924
+
 
10925
+       * lib/target-supports.exp (vect_uintfloat_cvt): Enable for AArch64.
 
10926
+
 
10927
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
10928
+
 
10929
+       * gcc.target/aarch64/vect-vcvt.c: New.
 
10930
+
 
10931
+       2013-04-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
10932
+
 
10933
+       * gcc.target/aarch64/vect-vrnd.c: New.
 
10934
+
 
10935
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10936
+
 
10937
+       Backport from trunk r198302-198306,198316.
 
10938
+       2013-04-25  James Greenhalgh  <james.greenhalgh@arm.com>
 
10939
+           Tejas Belagod  <tejas.belagod@arm.com>
 
10940
+
 
10941
+       * gcc.target/aarch64/vaddv-intrinsic.c: New.
 
10942
+       * gcc.target/aarch64/vaddv-intrinsic-compile.c: Likewise.
 
10943
+       * gcc.target/aarch64/vaddv-intrinsic.x: Likewise.
 
10944
+
 
10945
+       2013-04-25  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
10946
+
 
10947
+       * gcc.target/aarch64/cmp.c: New.
 
10948
+
 
10949
+       2013-04-25  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
10950
+
 
10951
+       * gcc.target/aarch64/ngc.c: New.
 
10952
+
 
10953
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10954
+
 
10955
+       Backport from trunk r198298.
 
10956
+       2013-04-25  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10957
+
 
10958
+       * lib/target-supports.exp
 
10959
+       (check_effective_target_arm_neon_fp16_ok_nocache): New procedure.
 
10960
+       (check_effective_target_arm_neon_fp16_ok): Likewise.
 
10961
+       (add_options_for_arm_neon_fp16): Likewise.
 
10962
+       * gcc.target/arm/neon/vcvtf16_f32.c: New test. Generated.
 
10963
+       * gcc.target/arm/neon/vcvtf32_f16.c: Likewise.
 
10964
+
 
10965
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10966
+
 
10967
+       Backport from trunk r198136-198137,198142,198176
 
10968
+       2013-04-22  James Greenhalgh  <james.greenhalgh@arm.com>
 
10969
+
 
10970
+       * gcc.target/aarch64/vrecps.c: New.
 
10971
+       * gcc.target/aarch64/vrecpx.c: Likewise.
 
10972
+
 
10973
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10974
+
 
10975
+       Backport from trunk r198020.
 
10976
+       2013-04-16   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
10977
+
 
10978
+       * gcc.target/aarch64/adds3.c: New.
 
10979
+       * gcc.target/aarch64/subs3.c: New.
 
10980
+
 
10981
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10982
+
 
10983
+       Backport from trunk r197965.
 
10984
+       2013-04-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10985
+
 
10986
+       * gcc.target/arm/anddi3-opt.c: New test.
 
10987
+       * gcc.target/arm/anddi3-opt2.c: Likewise.
 
10988
+
 
10989
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10990
+
 
10991
+       Backport from trunk r197642.
 
10992
+       2013-04-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
10993
+
 
10994
+       * gcc.target/arm/minmax_minus.c: New test.
 
10995
+
 
10996
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
10997
+
 
10998
+       Backport from trunk r197530,197921.
 
10999
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
11000
+
 
11001
+       * gcc.target/arm/peep-ldrd-1.c: New test.
 
11002
+       * gcc.target/arm/peep-strd-1.c: Likewise.
 
11003
+
 
11004
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11005
+
 
11006
+       Backport from trunk r197523.
 
11007
+       2013-04-05  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
11008
+
 
11009
+       * lib/target-supports.exp (add_options_for_arm_v8_neon):
 
11010
+       Add -march=armv8-a when we use v8 NEON.
 
11011
+       (check_effective_target_vect_call_btruncf): Remove arm-*-*-*.
 
11012
+       (check_effective_target_vect_call_ceilf): Likewise.
 
11013
+       (check_effective_target_vect_call_floorf): Likewise.
 
11014
+       (check_effective_target_vect_call_roundf): Likewise.
 
11015
+       (check_vect_support_and_set_flags): Remove check for arm_v8_neon.
 
11016
+       * gcc.target/arm/vect-rounding-btruncf.c: New testcase.
 
11017
+       * gcc.target/arm/vect-rounding-ceilf.c: Likewise.
 
11018
+       * gcc.target/arm/vect-rounding-floorf.c: Likewise.
 
11019
+       * gcc.target/arm/vect-rounding-roundf.c: Likewise.
 
11020
+
 
11021
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11022
+
 
11023
+       Backport from trunk r197518-197522,197516-197528.
 
11024
+       2013-04-05  Greta Yorsh  <Greta.Yorsh@arm.com>
 
11025
+
 
11026
+       * gcc.target/arm/negdi-1.c: New test.
 
11027
+       * gcc.target/arm/negdi-2.c: Likewise.
 
11028
+       * gcc.target/arm/negdi-3.c: Likewise.
 
11029
+       * gcc.target/arm/negdi-4.c: Likewise.
 
11030
+
 
11031
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11032
+
 
11033
+       Backport from trunk r197489-197491.
 
11034
+       2013-04-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
11035
+
 
11036
+       * lib/target-supports.exp (check_effective_target_arm_v8_neon_hw):
 
11037
+       New procedure.
 
11038
+       (check_effective_target_arm_v8_neon_ok_nocache):
 
11039
+       Likewise.
 
11040
+       (check_effective_target_arm_v8_neon_ok): Change to use
 
11041
+       check_effective_target_arm_v8_neon_ok_nocache.
 
11042
+       (add_options_for_arm_v8_neon): Use et_arm_v8_neon_flags to set ARMv8
 
11043
+       NEON flags.
 
11044
+       (check_effective_target_vect_call_btruncf):
 
11045
+       Enable for arm and ARMv8 NEON.
 
11046
+       (check_effective_target_vect_call_ceilf): Likewise.
 
11047
+       (check_effective_target_vect_call_floorf): Likewise.
 
11048
+       (check_effective_target_vect_call_roundf): Likewise.
 
11049
+       (check_vect_support_and_set_flags): Handle ARMv8 NEON effective
 
11050
+       target.
 
11051
+
 
11052
+2013-05-02  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11053
+
 
11054
+       Backport from trunk r196795-196797,196957.
 
11055
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
11056
+
 
11057
+       * gcc.target/aarch64/sbc.c: New test.
 
11058
+
 
11059
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
11060
+
 
11061
+       * gcc.target/aarch64/ror.c: New test.
 
11062
+
 
11063
+       2013-03-19  Ian Bolton  <ian.bolton@arm.com>
 
11064
+
 
11065
+       * gcc.target/aarch64/extr.c: New test.
 
11066
+
 
11067
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11068
+
 
11069
+       * GCC Linaro 4.8-2013.04 released.
 
11070
+
 
11071
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11072
+
 
11073
+       Backport from trunk r197052.
 
11074
+       2013-03-25  Kyrylo Tkachov  <kyrylo.tkachov at arm.com>
 
11075
+
 
11076
+       * gcc.target/arm/vseleqdf.c: New test.
 
11077
+       * gcc.target/arm/vseleqsf.c: Likewise.
 
11078
+       * gcc.target/arm/vselgedf.c: Likewise.
 
11079
+       * gcc.target/arm/vselgesf.c: Likewise.
 
11080
+       * gcc.target/arm/vselgtdf.c: Likewise.
 
11081
+       * gcc.target/arm/vselgtsf.c: Likewise.
 
11082
+       * gcc.target/arm/vselledf.c: Likewise.
 
11083
+       * gcc.target/arm/vsellesf.c: Likewise.
 
11084
+       * gcc.target/arm/vselltdf.c: Likewise.
 
11085
+       * gcc.target/arm/vselltsf.c: Likewise.
 
11086
+       * gcc.target/arm/vselnedf.c: Likewise.
 
11087
+       * gcc.target/arm/vselnesf.c: Likewise.
 
11088
+       * gcc.target/arm/vselvcdf.c: Likewise.
 
11089
+       * gcc.target/arm/vselvcsf.c: Likewise.
 
11090
+       * gcc.target/arm/vselvsdf.c: Likewise.
 
11091
+       * gcc.target/arm/vselvssf.c: Likewise.
 
11092
+
 
11093
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11094
+
 
11095
+       Backport from trunk r197051.
 
11096
+       2013-03-25  Kyrylo Tkachov  <kyrylo.tkachov at arm.com>
 
11097
+
 
11098
+       * gcc.target/aarch64/atomic-comp-swap-release-acquire.c: Move test
 
11099
+       body from here...
 
11100
+       * gcc.target/aarch64/atomic-comp-swap-release-acquire.x: ... to here.
 
11101
+       * gcc.target/aarch64/atomic-op-acq_rel.c: Move test body from here...
 
11102
+       * gcc.target/aarch64/atomic-op-acq_rel.x: ... to here.
 
11103
+       * gcc.target/aarch64/atomic-op-acquire.c: Move test body from here...
 
11104
+       * gcc.target/aarch64/atomic-op-acquire.x: ... to here.
 
11105
+       * gcc.target/aarch64/atomic-op-char.c: Move test body from here...
 
11106
+       * gcc.target/aarch64/atomic-op-char.x: ... to here.
 
11107
+       * gcc.target/aarch64/atomic-op-consume.c: Move test body from here...
 
11108
+       * gcc.target/aarch64/atomic-op-consume.x: ... to here.
 
11109
+       * gcc.target/aarch64/atomic-op-int.c: Move test body from here...
 
11110
+       * gcc.target/aarch64/atomic-op-int.x: ... to here.
 
11111
+       * gcc.target/aarch64/atomic-op-relaxed.c: Move test body from here...
 
11112
+       * gcc.target/aarch64/atomic-op-relaxed.x: ... to here.
 
11113
+       * gcc.target/aarch64/atomic-op-release.c: Move test body from here...
 
11114
+       * gcc.target/aarch64/atomic-op-release.x: ... to here.
 
11115
+       * gcc.target/aarch64/atomic-op-seq_cst.c: Move test body from here...
 
11116
+       * gcc.target/aarch64/atomic-op-seq_cst.x: ... to here.
 
11117
+       * gcc.target/aarch64/atomic-op-short.c: Move test body from here...
 
11118
+       * gcc.target/aarch64/atomic-op-short.x: ... to here.
 
11119
+       * gcc.target/arm/atomic-comp-swap-release-acquire.c: New test.
 
11120
+       * gcc.target/arm/atomic-op-acq_rel.c: Likewise.
 
11121
+       * gcc.target/arm/atomic-op-acquire.c: Likewise.
 
11122
+       * gcc.target/arm/atomic-op-char.c: Likewise.
 
11123
+       * gcc.target/arm/atomic-op-consume.c: Likewise.
 
11124
+       * gcc.target/arm/atomic-op-int.c: Likewise.
 
11125
+       * gcc.target/arm/atomic-op-relaxed.c: Likewise.
 
11126
+       * gcc.target/arm/atomic-op-release.c: Likewise.
 
11127
+       * gcc.target/arm/atomic-op-seq_cst.c: Likewise.
 
11128
+       * gcc.target/arm/atomic-op-short.c: Likewise.
 
11129
+
 
11130
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11131
+
 
11132
+       Backport from trunk r196876.
 
11133
+       2013-03-21  Christophe Lyon  <christophe.lyon@linaro.org>
 
11134
+
 
11135
+       * gcc.target/arm/neon-for-64bits-1.c: New tests.
 
11136
+       * gcc.target/arm/neon-for-64bits-2.c: Likewise.
 
11137
+
 
11138
+2013-04-08  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11139
+
 
11140
+       Backport from trunk r196858.
 
11141
+       2013-03-21   Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
11142
+
 
11143
+       * gcc.target/aarch64/vect.c: Test and result vector added
 
11144
+       for sabd and saba instructions.
 
11145
+       * gcc.target/aarch64/vect-compile.c: Check for sabd and saba
 
11146
+       instructions in assembly.
 
11147
+       * gcc.target/aarch64/vect.x: Add sabd and saba test functions.
 
11148
+       * gcc.target/aarch64/vect-fp.c: Test and result vector added
 
11149
+       for fabd instruction.
 
11150
+       * gcc.target/aarch64/vect-fp-compile.c: Check for fabd
 
11151
+       instruction in assembly.
 
11152
+       * gcc.target/aarch64/vect-fp.x: Add fabd test function.
 
11153
--- a/src/gcc/testsuite/gcc.dg/pr57518.c
 
11154
+++ b/src/gcc/testsuite/gcc.dg/pr57518.c
 
11155
@@ -2,7 +2,7 @@
 
11156
 
 
11157
 /* { dg-do compile } */
 
11158
 /* { dg-options "-O2 -fdump-rtl-ira" } */
 
11159
-/* { dg-final { scan-rtl-dump-not "REG_EQUIV.*mem.*\"ip\"" "ira" } } */
 
11160
+/* { dg-final { scan-rtl-dump-not "REG_EQUIV\[^\n\]*mem\[^\n\]*\"ip\"" "ira" } } */
 
11161
 
 
11162
 char ip[10];
 
11163
 int total;
 
11164
--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c
 
11165
+++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c
 
11166
@@ -0,0 +1,11 @@
 
11167
+/* { dg-do compile } */
 
11168
+/* { dg-options "-O2 -g" } */
 
11169
+
 
11170
+int *p;
 
11171
+
 
11172
+void
 
11173
+test (int a)
 
11174
+{
 
11175
+  if (a > 0)
 
11176
+    p = __builtin_alloca (4);
 
11177
+}
 
11178
--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c
 
11179
+++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c
 
11180
@@ -0,0 +1,36 @@
 
11181
+/* { dg-do compile } */
 
11182
+/* { dg-options "-O2 -g" } */
 
11183
+
 
11184
+#include <stdlib.h>
 
11185
+#include <stdio.h>
 
11186
+#include <stdarg.h>
 
11187
+
 
11188
+#define DEBUG_BUFFER_SIZE 80
 
11189
+int unifi_debug = 5;
 
11190
+
 
11191
+void
 
11192
+unifi_trace (void* ospriv, int level, const char *fmt, ...)
 
11193
+{
 
11194
+   static char s[DEBUG_BUFFER_SIZE];
 
11195
+   va_list args;
 
11196
+   unsigned int len;
 
11197
+
 
11198
+   if (!ospriv)
 
11199
+     return;
 
11200
+
 
11201
+   if (unifi_debug >= level)
 
11202
+     {
 
11203
+       va_start (args, fmt);
 
11204
+       len = vsnprintf (&(s)[0], (DEBUG_BUFFER_SIZE), fmt, args);
 
11205
+       va_end (args);
 
11206
+
 
11207
+       if (len >= DEBUG_BUFFER_SIZE)
 
11208
+        {
 
11209
+          (s)[DEBUG_BUFFER_SIZE - 2] = '\n';
 
11210
+          (s)[DEBUG_BUFFER_SIZE - 1] = 0;
 
11211
+        }
 
11212
+
 
11213
+       printf ("%s", s);
 
11214
+     }
 
11215
+}
 
11216
+
 
11217
--- a/src/gcc/testsuite/gcc.dg/debug/pr57351.c
 
11218
+++ b/src/gcc/testsuite/gcc.dg/debug/pr57351.c
 
11219
@@ -0,0 +1,54 @@
 
11220
+/* { dg-do compile } */
 
11221
+/* { dg-require-effective-target arm_neon }  */
 
11222
+/* { dg-options "-std=c99 -Os -g -march=armv7-a" } */
 
11223
+/* { dg-add-options arm_neon } */
 
11224
+
 
11225
+typedef unsigned int size_t;
 
11226
+typedef int ptrdiff_t;
 
11227
+typedef signed char int8_t ;
 
11228
+typedef signed long long int64_t;
 
11229
+typedef int8_t GFC_INTEGER_1;
 
11230
+typedef GFC_INTEGER_1 GFC_LOGICAL_1;
 
11231
+typedef int64_t GFC_INTEGER_8;
 
11232
+typedef GFC_INTEGER_8 GFC_LOGICAL_8;
 
11233
+typedef ptrdiff_t index_type;
 
11234
+typedef struct descriptor_dimension
 
11235
+{
 
11236
+  index_type lower_bound;
 
11237
+  index_type _ubound;
 
11238
+}
 
11239
+descriptor_dimension;
 
11240
+typedef struct { GFC_LOGICAL_1 *base_addr; size_t offset; index_type dtype; descriptor_dimension dim[7];} gfc_array_l1;
 
11241
+typedef struct { GFC_LOGICAL_8 *base_addr; size_t offset; index_type dtype; descriptor_dimension dim[7];} gfc_array_l8;
 
11242
+void
 
11243
+all_l8 (gfc_array_l8 * const restrict retarray,
 
11244
+ gfc_array_l1 * const restrict array,
 
11245
+ const index_type * const restrict pdim)
 
11246
+{
 
11247
+  GFC_LOGICAL_8 * restrict dest;
 
11248
+  index_type n;
 
11249
+  index_type len;
 
11250
+  index_type delta;
 
11251
+  index_type dim;
 
11252
+  dim = (*pdim) - 1;
 
11253
+  len = ((array)->dim[dim]._ubound + 1 - (array)->dim[dim].lower_bound);
 
11254
+  for (n = 0; n < dim; n++)
 
11255
+    {
 
11256
+      const GFC_LOGICAL_1 * restrict src;
 
11257
+      GFC_LOGICAL_8 result;
 
11258
+      {
 
11259
+  result = 1;
 
11260
+   {
 
11261
+     for (n = 0; n < len; n++, src += delta)
 
11262
+       {
 
11263
+  if (! *src)
 
11264
+    {
 
11265
+      result = 0;
 
11266
+      break;
 
11267
+    }
 
11268
+          }
 
11269
+     *dest = result;
 
11270
+   }
 
11271
+      }
 
11272
+    }
 
11273
+}
 
11274
--- a/src/gcc/testsuite/gcc.dg/lower-subreg-1.c
 
11275
+++ b/src/gcc/testsuite/gcc.dg/lower-subreg-1.c
 
11276
@@ -1,4 +1,4 @@
 
11277
-/* { dg-do compile { target { ! { mips64 || { arm*-*-* ia64-*-* sparc*-*-* spu-*-* tilegx-*-* } } } } } */
 
11278
+/* { dg-do compile { target { ! { mips64 || { aarch64*-*-* arm*-*-* ia64-*-* sparc*-*-* spu-*-* tilegx-*-* } } } } } */
 
11279
 /* { dg-options "-O -fdump-rtl-subreg1" } */
 
11280
 /* { dg-skip-if "" { { i?86-*-* x86_64-*-* } && x32 } { "*" } { "" } } */
 
11281
 /* { dg-require-effective-target ilp32 } */
 
11282
--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-sibcall.c
 
11283
+++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-sibcall.c
 
11284
@@ -0,0 +1,26 @@
 
11285
+/* { dg-do compile } */
 
11286
+/* { dg-options "-O2 -g" } */
 
11287
+
 
11288
+unsigned char a, b, d, f, g;
 
11289
+
 
11290
+int test (void);
 
11291
+
 
11292
+int
 
11293
+baz (int c)
 
11294
+{
 
11295
+  if (c == 0) return test ();
 
11296
+  if (b & 1)
 
11297
+    {
 
11298
+      g = 0;
 
11299
+      int e = (a & 0x0f) - (g & 0x0f);
 
11300
+
 
11301
+      if (!a)  b |= 0x80;
 
11302
+      a = e + test ();
 
11303
+     f = g/5 + a*3879 + b *2985;
 
11304
+    }
 
11305
+   else
 
11306
+   {
 
11307
+     f = g + a*39879 + b *25;
 
11308
+   }
 
11309
+  return test ();
 
11310
+}
 
11311
--- a/src/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c
 
11312
+++ b/src/gcc/testsuite/gcc.dg/torture/stackalign/builtin-apply-2.c
 
11313
@@ -16,7 +16,7 @@
 
11314
    E, F and G are passed on stack.  So the size of the stack argument
 
11315
    data is 20.  */
 
11316
 #define STACK_ARGUMENTS_SIZE  20
 
11317
-#elif defined __MMIX__
 
11318
+#elif defined __aarch64__ || defined __MMIX__
 
11319
 /* No parameters on stack for bar.  */
 
11320
 #define STACK_ARGUMENTS_SIZE 0
 
11321
 #else
 
11322
--- a/src/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c
 
11323
+++ b/src/gcc/testsuite/gcc.dg/vect/no-section-anchors-vect-68.c
 
11324
@@ -1,4 +1,6 @@
 
11325
-/* { dg-require-effective-target vect_int } */
 
11326
+/* { dg-require-effective-target vect_int }
 
11327
+   { dg-skip-if "AArch64 tiny code model does not support programs larger than 1MiB" {aarch64_tiny} {"*"} {""} }
 
11328
+ */
 
11329
 
 
11330
 #include <stdarg.h>
 
11331
 #include "tree-vect.h"
 
11332
--- a/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C
 
11333
+++ b/src/gcc/testsuite/g++.dg/asan/large-func-test-1.C
 
11334
@@ -37,9 +37,9 @@
 
11335
 
 
11336
 // { dg-output "ERROR: AddressSanitizer:? heap-buffer-overflow on address\[^\n\r]*" }
 
11337
 // { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" }
 
11338
-// { dg-output "READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" }
 
11339
+// { dg-output "\[^\n\r]*READ of size 4 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" }
 
11340
 // { dg-output "    #0 0x\[0-9a-f\]+ (in \[^\n\r]*LargeFunction\[^\n\r]*(large-func-test-1.C:18|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" }
 
11341
-// { dg-output "0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" }
 
11342
-// { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" }
 
11343
+// { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 44 bytes to the right of 400-byte region.*(\n|\r\n|\r)" }
 
11344
+// { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" }
 
11345
 // { dg-output "    #0( 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
 
11346
 // { dg-output "    #1|) 0x\[0-9a-f\]+ (in (operator new|_*_Zn\[aw\]\[mj\])|\[(\])\[^\n\r]*(\n|\r\n|\r)" }
 
11347
--- a/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C
 
11348
+++ b/src/gcc/testsuite/g++.dg/asan/deep-thread-stack-1.C
 
11349
@@ -45,9 +45,9 @@
 
11350
 }
 
11351
 
 
11352
 // { dg-output "ERROR: AddressSanitizer: heap-use-after-free.*(\n|\r\n|\r)" }
 
11353
-// { dg-output "WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" }
 
11354
-// { dg-output "freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11355
-// { dg-output "previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11356
+// { dg-output "\[^\n\r]*WRITE of size 4 at 0x\[0-9a-f\]+ thread T(\[0-9\]+).*(\n|\r\n|\r)" }
 
11357
+// { dg-output "\[^\n\r]*freed by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11358
+// { dg-output "\[^\n\r]*previously allocated by thread T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11359
 // { dg-output "Thread T\\2 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11360
 // { dg-output "Thread T\\8 created by T0 here:.*(\n|\r\n|\r)" }
 
11361
 // { dg-output "Thread T\\4 created by T(\[0-9\]+) here:.*(\n|\r\n|\r)" }
 
11362
--- a/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c
 
11363
+++ b/src/gcc/testsuite/c-c++-common/asan/strncpy-overflow-1.c
 
11364
@@ -15,7 +15,7 @@
 
11365
 /* { dg-output "WRITE of size \[0-9\]* at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */
 
11366
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*(interceptor_|)strncpy|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11367
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:11|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */
 
11368
-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */
 
11369
-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11370
+/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 9-byte region\[^\n\r]*(\n|\r\n|\r)" } */
 
11371
+/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11372
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11373
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*strncpy-overflow-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11374
--- a/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c
 
11375
+++ b/src/gcc/testsuite/c-c++-common/asan/rlimit-mmap-test-1.c
 
11376
@@ -2,6 +2,7 @@
 
11377
 
 
11378
 /* { dg-do run { target setrlimit } } */
 
11379
 /* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
 
11380
+/* { dg-require-effective-target hw } */
 
11381
 /* { dg-shouldfail "asan" } */
 
11382
 
 
11383
 #include <stdlib.h>
 
11384
--- a/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c
 
11385
+++ b/src/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c
 
11386
@@ -19,4 +19,4 @@
 
11387
 
 
11388
 /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */
 
11389
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*stack-overflow-1.c:16|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */
 
11390
-/* { dg-output "Address 0x\[0-9a-f\]+ is\[^\n\r]*frame <main>" } */
 
11391
+/* { dg-output "\[^\n\r]*Address 0x\[0-9a-f\]+ is\[^\n\r]*frame <main>" } */
 
11392
--- a/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c
 
11393
+++ b/src/gcc/testsuite/c-c++-common/asan/use-after-free-1.c
 
11394
@@ -11,12 +11,12 @@
 
11395
 
 
11396
 /* { dg-output "ERROR: AddressSanitizer:? heap-use-after-free on address\[^\n\r]*" } */
 
11397
 /* { dg-output "0x\[0-9a-f\]+ at pc 0x\[0-9a-f\]+ bp 0x\[0-9a-f\]+ sp 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */
 
11398
-/* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */
 
11399
+/* { dg-output "\[^\n\r]*READ of size 1 at 0x\[0-9a-f\]+ thread T0\[^\n\r]*(\n|\r\n|\r)" } */
 
11400
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:9|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */
 
11401
-/* { dg-output "0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */
 
11402
-/* { dg-output "freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11403
+/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 5 bytes inside of 10-byte region .0x\[0-9a-f\]+,0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */
 
11404
+/* { dg-output "\[^\n\r]*freed by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11405
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*(interceptor_|)free|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11406
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:8|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */
 
11407
-/* { dg-output "previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11408
+/* { dg-output "\[^\n\r]*previously allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11409
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11410
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*use-after-free-1.c:7|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11411
--- a/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c
 
11412
+++ b/src/gcc/testsuite/c-c++-common/asan/clone-test-1.c
 
11413
@@ -3,6 +3,7 @@
 
11414
 
 
11415
 /* { dg-do run { target { *-*-linux* } } } */
 
11416
 /* { dg-require-effective-target clone } */
 
11417
+/* { dg-require-effective-target hw } */
 
11418
 /* { dg-options "-D_GNU_SOURCE" } */
 
11419
 
 
11420
 #include <stdio.h>
 
11421
--- a/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c
 
11422
+++ b/src/gcc/testsuite/c-c++-common/asan/heap-overflow-1.c
 
11423
@@ -25,7 +25,7 @@
 
11424
 
 
11425
 /* { dg-output "READ of size 1 at 0x\[0-9a-f\]+ thread T0.*(\n|\r\n|\r)" } */
 
11426
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:21|\[^\n\r]*:0)|\[(\]).*(\n|\r\n|\r)" } */
 
11427
-/* { dg-output "0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */
 
11428
-/* { dg-output "allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11429
+/* { dg-output "\[^\n\r]*0x\[0-9a-f\]+ is located 0 bytes to the right of 10-byte region\[^\n\r]*(\n|\r\n|\r)" } */
 
11430
+/* { dg-output "\[^\n\r]*allocated by thread T0 here:\[^\n\r]*(\n|\r\n|\r)" } */
 
11431
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in _*(interceptor_|)malloc|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11432
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*heap-overflow-1.c:19|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11433
--- a/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c
 
11434
+++ b/src/gcc/testsuite/c-c++-common/asan/null-deref-1.c
 
11435
@@ -18,6 +18,6 @@
 
11436
 
 
11437
 /* { dg-output "ERROR: AddressSanitizer:? SEGV on unknown address\[^\n\r]*" } */
 
11438
 /* { dg-output "0x\[0-9a-f\]+ \[^\n\r]*pc 0x\[0-9a-f\]+\[^\n\r]*(\n|\r\n|\r)" } */
 
11439
-/* { dg-output "AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */
 
11440
+/* { dg-output "\[^\n\r]*AddressSanitizer can not provide additional info.*(\n|\r\n|\r)" } */
 
11441
 /* { dg-output "    #0 0x\[0-9a-f\]+ (in \[^\n\r]*NullDeref\[^\n\r]* (\[^\n\r]*null-deref-1.c:10|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11442
 /* { dg-output "    #1 0x\[0-9a-f\]+ (in _*main (\[^\n\r]*null-deref-1.c:15|\[^\n\r]*:0)|\[(\])\[^\n\r]*(\n|\r\n|\r)" } */
 
11443
--- a/src/gcc/objcp/ChangeLog.linaro
 
11444
+++ b/src/gcc/objcp/ChangeLog.linaro
 
11445
@@ -0,0 +1,27 @@
 
11446
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11447
+
 
11448
+        GCC Linaro 4.8-2013.09 released.
 
11449
+
 
11450
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11451
+
 
11452
+       GCC Linaro 4.8-2013.08 released.
 
11453
+
 
11454
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11455
+
 
11456
+        GCC Linaro 4.8-2013.07-1 released.
 
11457
+
 
11458
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11459
+
 
11460
+       GCC Linaro 4.8-2013.07 released.
 
11461
+
 
11462
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11463
+
 
11464
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11465
+
 
11466
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11467
+
 
11468
+       GCC Linaro 4.8-2013.05 released.
 
11469
+
 
11470
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11471
+
 
11472
+       * GCC Linaro 4.8-2013.04 released.
 
11473
--- a/src/gcc/cp/ChangeLog.linaro
 
11474
+++ b/src/gcc/cp/ChangeLog.linaro
 
11475
@@ -0,0 +1,27 @@
 
11476
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11477
+
 
11478
+        GCC Linaro 4.8-2013.09 released.
 
11479
+
 
11480
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11481
+
 
11482
+       GCC Linaro 4.8-2013.08 released.
 
11483
+
 
11484
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11485
+
 
11486
+        GCC Linaro 4.8-2013.07-1 released.
 
11487
+
 
11488
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11489
+
 
11490
+       GCC Linaro 4.8-2013.07 released.
 
11491
+
 
11492
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11493
+
 
11494
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11495
+
 
11496
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11497
+
 
11498
+       GCC Linaro 4.8-2013.05 released.
 
11499
+
 
11500
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11501
+
 
11502
+       * GCC Linaro 4.8-2013.04 released.
 
11503
--- a/src/gcc/tree-ssa-loop-ivopts.c
 
11504
+++ b/src/gcc/tree-ssa-loop-ivopts.c
 
11505
@@ -4827,22 +4827,36 @@
 
11506
   for (i = 0; i < n_iv_cands (data); i++)
 
11507
     {
 
11508
       struct iv_cand *cand = iv_cand (data, i);
 
11509
-      struct iv_use *closest = NULL;
 
11510
+      struct iv_use *closest_before = NULL;
 
11511
+      struct iv_use *closest_after = NULL;
 
11512
       if (cand->pos != IP_ORIGINAL)
 
11513
        continue;
 
11514
+
 
11515
       for (j = 0; j < n_iv_uses (data); j++)
 
11516
        {
 
11517
          struct iv_use *use = iv_use (data, j);
 
11518
          unsigned uid = gimple_uid (use->stmt);
 
11519
-         if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at)
 
11520
-             || uid > gimple_uid (cand->incremented_at))
 
11521
+
 
11522
+         if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at))
 
11523
            continue;
 
11524
-         if (closest == NULL || uid > gimple_uid (closest->stmt))
 
11525
-           closest = use;
 
11526
+
 
11527
+         if (uid < gimple_uid (cand->incremented_at)
 
11528
+             && (closest_before == NULL
 
11529
+                 || uid > gimple_uid (closest_before->stmt)))
 
11530
+           closest_before = use;
 
11531
+
 
11532
+         if (uid > gimple_uid (cand->incremented_at)
 
11533
+             && (closest_after == NULL
 
11534
+                 || uid < gimple_uid (closest_after->stmt)))
 
11535
+           closest_after = use;
 
11536
        }
 
11537
-      if (closest == NULL || !autoinc_possible_for_pair (data, closest, cand))
 
11538
-       continue;
 
11539
-      cand->ainc_use = closest;
 
11540
+
 
11541
+      if (closest_before != NULL
 
11542
+         && autoinc_possible_for_pair (data, closest_before, cand))
 
11543
+       cand->ainc_use = closest_before;
 
11544
+      else if (closest_after != NULL
 
11545
+              && autoinc_possible_for_pair (data, closest_after, cand))
 
11546
+       cand->ainc_use = closest_after;
 
11547
     }
 
11548
 }
 
11549
 
 
11550
--- a/src/gcc/rtl.def
 
11551
+++ b/src/gcc/rtl.def
 
11552
@@ -937,8 +937,9 @@
 
11553
       relational operator.  Operands should have only one alternative.
 
11554
    1: A C expression giving an additional condition for recognizing
 
11555
       the generated pattern.
 
11556
-   2: A template or C code to produce assembler output.  */
 
11557
-DEF_RTL_EXPR(DEFINE_COND_EXEC, "define_cond_exec", "Ess", RTX_EXTRA)
 
11558
+   2: A template or C code to produce assembler output.
 
11559
+   3: A vector of attributes to append to the resulting cond_exec insn.  */
 
11560
+DEF_RTL_EXPR(DEFINE_COND_EXEC, "define_cond_exec", "EssV", RTX_EXTRA)
 
11561
 
 
11562
 /* Definition of an operand predicate.  The difference between
 
11563
    DEFINE_PREDICATE and DEFINE_SPECIAL_PREDICATE is that genrecog will
 
11564
--- a/src/gcc/go/ChangeLog.linaro
 
11565
+++ b/src/gcc/go/ChangeLog.linaro
 
11566
@@ -0,0 +1,27 @@
 
11567
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11568
+
 
11569
+        GCC Linaro 4.8-2013.09 released.
 
11570
+
 
11571
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11572
+
 
11573
+       GCC Linaro 4.8-2013.08 released.
 
11574
+
 
11575
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11576
+
 
11577
+        GCC Linaro 4.8-2013.07-1 released.
 
11578
+
 
11579
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11580
+
 
11581
+       GCC Linaro 4.8-2013.07 released.
 
11582
+
 
11583
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11584
+
 
11585
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11586
+
 
11587
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11588
+
 
11589
+       GCC Linaro 4.8-2013.05 released.
 
11590
+
 
11591
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11592
+
 
11593
+       * GCC Linaro 4.8-2013.04 released.
 
11594
--- a/src/gcc/ada/ChangeLog.linaro
 
11595
+++ b/src/gcc/ada/ChangeLog.linaro
 
11596
@@ -0,0 +1,27 @@
 
11597
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11598
+
 
11599
+        GCC Linaro 4.8-2013.09 released.
 
11600
+
 
11601
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11602
+
 
11603
+       GCC Linaro 4.8-2013.08 released.
 
11604
+
 
11605
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11606
+
 
11607
+        GCC Linaro 4.8-2013.07-1 released.
 
11608
+
 
11609
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11610
+
 
11611
+       GCC Linaro 4.8-2013.07 released.
 
11612
+
 
11613
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11614
+
 
11615
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11616
+
 
11617
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11618
+
 
11619
+       GCC Linaro 4.8-2013.05 released.
 
11620
+
 
11621
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11622
+
 
11623
+       * GCC Linaro 4.8-2013.04 released.
 
11624
--- a/src/gcc/common/config/aarch64/aarch64-common.c
 
11625
+++ b/src/gcc/common/config/aarch64/aarch64-common.c
 
11626
@@ -44,6 +44,8 @@
 
11627
   {
 
11628
     /* Enable section anchors by default at -O1 or higher.  */
 
11629
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
 
11630
+    /* Enable redundant extension instructions removal at -O2 and higher.  */
 
11631
+    { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
 
11632
     { OPT_LEVELS_NONE, 0, NULL, 0 }
 
11633
   };
 
11634
 
 
11635
--- a/src/gcc/fortran/ChangeLog.linaro
 
11636
+++ b/src/gcc/fortran/ChangeLog.linaro
 
11637
@@ -0,0 +1,27 @@
 
11638
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11639
+
 
11640
+        GCC Linaro 4.8-2013.09 released.
 
11641
+
 
11642
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11643
+
 
11644
+       GCC Linaro 4.8-2013.08 released.
 
11645
+
 
11646
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11647
+
 
11648
+        GCC Linaro 4.8-2013.07-1 released.
 
11649
+
 
11650
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11651
+
 
11652
+       GCC Linaro 4.8-2013.07 released.
 
11653
+
 
11654
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11655
+
 
11656
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11657
+
 
11658
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11659
+
 
11660
+       GCC Linaro 4.8-2013.05 released.
 
11661
+
 
11662
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11663
+
 
11664
+       * GCC Linaro 4.8-2013.04 released.
 
11665
--- a/src/gcc/configure.ac
 
11666
+++ b/src/gcc/configure.ac
 
11667
@@ -813,7 +813,7 @@
 
11668
 )
 
11669
 AC_SUBST(CONFIGURE_SPECS)
 
11670
 
 
11671
-ACX_PKGVERSION([GCC])
 
11672
+ACX_PKGVERSION([Linaro GCC `cat $srcdir/LINARO-VERSION`])
 
11673
 ACX_BUGURL([http://gcc.gnu.org/bugs.html])
 
11674
 
 
11675
 # Sanity check enable_languages in case someone does not run the toplevel
 
11676
@@ -4179,8 +4179,9 @@
 
11677
 # ??? Once 2.11 is released, probably need to add first known working
 
11678
 # version to the per-target configury.
 
11679
 case "$cpu_type" in
 
11680
-  alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze | mips \
 
11681
-  | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 | xtensa)
 
11682
+  aarch64 | alpha | arm | avr | bfin | cris | i386 | m32c | m68k | microblaze \
 
11683
+  | mips | pa | rs6000 | score | sparc | spu | tilegx | tilepro | xstormy16 \
 
11684
+  | xtensa)
 
11685
     insn="nop"
 
11686
     ;;
 
11687
   ia64 | s390)
 
11688
--- a/src/gcc/function.c
 
11689
+++ b/src/gcc/function.c
 
11690
@@ -5509,22 +5509,45 @@
 
11691
         except for any part that overlaps SRC (next loop).  */
 
11692
       bb_uses = &DF_LR_BB_INFO (bb)->use;
 
11693
       bb_defs = &DF_LR_BB_INFO (bb)->def;
 
11694
-      for (i = dregno; i < end_dregno; i++)
 
11695
+      if (df_live)
 
11696
        {
 
11697
-         if (REGNO_REG_SET_P (bb_uses, i) || REGNO_REG_SET_P (bb_defs, i))
 
11698
-           next_block = NULL;
 
11699
-         CLEAR_REGNO_REG_SET (live_out, i);
 
11700
-         CLEAR_REGNO_REG_SET (live_in, i);
 
11701
+         for (i = dregno; i < end_dregno; i++)
 
11702
+           {
 
11703
+             if (REGNO_REG_SET_P (bb_uses, i) || REGNO_REG_SET_P (bb_defs, i)
 
11704
+                 || REGNO_REG_SET_P (&DF_LIVE_BB_INFO (bb)->gen, i))
 
11705
+               next_block = NULL;
 
11706
+             CLEAR_REGNO_REG_SET (live_out, i);
 
11707
+             CLEAR_REGNO_REG_SET (live_in, i);
 
11708
+           }
 
11709
+
 
11710
+         /* Check whether BB clobbers SRC.  We need to add INSN to BB if so.
 
11711
+            Either way, SRC is now live on entry.  */
 
11712
+         for (i = sregno; i < end_sregno; i++)
 
11713
+           {
 
11714
+             if (REGNO_REG_SET_P (bb_defs, i)
 
11715
+                 || REGNO_REG_SET_P (&DF_LIVE_BB_INFO (bb)->gen, i))
 
11716
+               next_block = NULL;
 
11717
+             SET_REGNO_REG_SET (live_out, i);
 
11718
+             SET_REGNO_REG_SET (live_in, i);
 
11719
+           }
 
11720
        }
 
11721
+      else
 
11722
+       {
 
11723
+         /* DF_LR_BB_INFO (bb)->def does not comprise the DF_REF_PARTIAL and
 
11724
+            DF_REF_CONDITIONAL defs.  So if DF_LIVE doesn't exist, i.e.
 
11725
+            at -O1, just give up searching NEXT_BLOCK.  */
 
11726
+         next_block = NULL;
 
11727
+         for (i = dregno; i < end_dregno; i++)
 
11728
+           {
 
11729
+             CLEAR_REGNO_REG_SET (live_out, i);
 
11730
+             CLEAR_REGNO_REG_SET (live_in, i);
 
11731
+           }
 
11732
 
 
11733
-      /* Check whether BB clobbers SRC.  We need to add INSN to BB if so.
 
11734
-        Either way, SRC is now live on entry.  */
 
11735
-      for (i = sregno; i < end_sregno; i++)
 
11736
-       {
 
11737
-         if (REGNO_REG_SET_P (bb_defs, i))
 
11738
-           next_block = NULL;
 
11739
-         SET_REGNO_REG_SET (live_out, i);
 
11740
-         SET_REGNO_REG_SET (live_in, i);
 
11741
+         for (i = sregno; i < end_sregno; i++)
 
11742
+           {
 
11743
+             SET_REGNO_REG_SET (live_out, i);
 
11744
+             SET_REGNO_REG_SET (live_in, i);
 
11745
+           }
 
11746
        }
 
11747
 
 
11748
       /* If we don't need to add the move to BB, look for a single
 
11749
--- a/src/gcc/coretypes.h
 
11750
+++ b/src/gcc/coretypes.h
 
11751
@@ -62,6 +62,8 @@
 
11752
 typedef union gimple_statement_d *gimple;
 
11753
 typedef const union gimple_statement_d *const_gimple;
 
11754
 typedef gimple gimple_seq;
 
11755
+struct gimple_stmt_iterator_d;
 
11756
+typedef struct gimple_stmt_iterator_d gimple_stmt_iterator;
 
11757
 union section;
 
11758
 typedef union section section;
 
11759
 struct gcc_options;
 
11760
--- a/src/gcc/gimple-fold.c
 
11761
+++ b/src/gcc/gimple-fold.c
 
11762
@@ -1143,6 +1143,8 @@
 
11763
            gimplify_and_update_call_from_tree (gsi, result);
 
11764
          changed = true;
 
11765
        }
 
11766
+      else if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
 
11767
+       changed |= targetm.gimple_fold_builtin (gsi);
 
11768
     }
 
11769
 
 
11770
   return changed;
 
11771
--- a/src/gcc/lto/ChangeLog.linaro
 
11772
+++ b/src/gcc/lto/ChangeLog.linaro
 
11773
@@ -0,0 +1,27 @@
 
11774
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11775
+
 
11776
+        GCC Linaro 4.8-2013.09 released.
 
11777
+
 
11778
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11779
+
 
11780
+       GCC Linaro 4.8-2013.08 released.
 
11781
+
 
11782
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11783
+
 
11784
+        GCC Linaro 4.8-2013.07-1 released.
 
11785
+
 
11786
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11787
+
 
11788
+       GCC Linaro 4.8-2013.07 released.
 
11789
+
 
11790
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11791
+
 
11792
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11793
+
 
11794
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11795
+
 
11796
+       GCC Linaro 4.8-2013.05 released.
 
11797
+
 
11798
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11799
+
 
11800
+       * GCC Linaro 4.8-2013.04 released.
 
11801
--- a/src/gcc/po/ChangeLog.linaro
 
11802
+++ b/src/gcc/po/ChangeLog.linaro
 
11803
@@ -0,0 +1,27 @@
 
11804
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
11805
+
 
11806
+        GCC Linaro 4.8-2013.09 released.
 
11807
+
 
11808
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
11809
+
 
11810
+       GCC Linaro 4.8-2013.08 released.
 
11811
+
 
11812
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11813
+
 
11814
+        GCC Linaro 4.8-2013.07-1 released.
 
11815
+
 
11816
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
11817
+
 
11818
+       GCC Linaro 4.8-2013.07 released.
 
11819
+
 
11820
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
11821
+
 
11822
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
11823
+
 
11824
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11825
+
 
11826
+       GCC Linaro 4.8-2013.05 released.
 
11827
+
 
11828
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
11829
+
 
11830
+       * GCC Linaro 4.8-2013.04 released.
 
11831
--- a/src/gcc/combine.c
 
11832
+++ b/src/gcc/combine.c
 
11833
@@ -11982,6 +11982,13 @@
 
11834
            }
 
11835
        }
 
11836
 
 
11837
+  /* We may have changed the comparison operands.  Re-canonicalize.  */
 
11838
+  if (swap_commutative_operands_p (op0, op1))
 
11839
+    {
 
11840
+      tem = op0, op0 = op1, op1 = tem;
 
11841
+      code = swap_condition (code);
 
11842
+    }
 
11843
+
 
11844
   /* If this machine only supports a subset of valid comparisons, see if we
 
11845
      can convert an unsupported one into a supported one.  */
 
11846
   target_canonicalize_comparison (&code, &op0, &op1, 0);
 
11847
--- a/src/gcc/config.gcc
 
11848
+++ b/src/gcc/config.gcc
 
11849
@@ -329,6 +329,7 @@
 
11850
        target_type_format_char='%'
 
11851
        c_target_objs="arm-c.o"
 
11852
        cxx_target_objs="arm-c.o"
 
11853
+       need_64bit_hwint=yes
 
11854
        extra_options="${extra_options} arm/arm-tables.opt"
 
11855
        ;;
 
11856
 avr-*-*)
 
11857
@@ -885,10 +886,6 @@
 
11858
            tmake_file="$tmake_file arm/t-linux-androideabi"
 
11859
            ;;
 
11860
        esac
 
11861
-       # The BPABI long long divmod functions return a 128-bit value in
 
11862
-       # registers r0-r3.  Correctly modeling that requires the use of
 
11863
-       # TImode.
 
11864
-       need_64bit_hwint=yes
 
11865
        # The EABI requires the use of __cxa_atexit.
 
11866
        default_use_cxa_atexit=yes
 
11867
        with_tls=${with_tls:-gnu}
 
11868
@@ -897,10 +894,6 @@
 
11869
        tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/linux-gas.h arm/uclinux-elf.h glibc-stdint.h"
 
11870
        tmake_file="arm/t-arm arm/t-arm-elf arm/t-bpabi"
 
11871
        tm_file="$tm_file arm/bpabi.h arm/uclinux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h"
 
11872
-       # The BPABI long long divmod functions return a 128-bit value in
 
11873
-       # registers r0-r3.  Correctly modeling that requires the use of
 
11874
-       # TImode.
 
11875
-       need_64bit_hwint=yes
 
11876
        # The EABI requires the use of __cxa_atexit.
 
11877
        default_use_cxa_atexit=yes
 
11878
        ;;
 
11879
@@ -909,10 +902,6 @@
 
11880
        arm*eb-*-eabi*)
 
11881
          tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
 
11882
        esac
 
11883
-       # The BPABI long long divmod functions return a 128-bit value in
 
11884
-       # registers r0-r3.  Correctly modeling that requires the use of
 
11885
-       # TImode.
 
11886
-       need_64bit_hwint=yes
 
11887
        default_use_cxa_atexit=yes
 
11888
        tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/bpabi.h"
 
11889
        tmake_file="arm/t-arm arm/t-arm-elf"
 
11890
--- a/src/gcc/gimple.h
 
11891
+++ b/src/gcc/gimple.h
 
11892
@@ -130,7 +130,7 @@
 
11893
 
 
11894
 /* Iterator object for GIMPLE statement sequences.  */
 
11895
 
 
11896
-typedef struct
 
11897
+struct gimple_stmt_iterator_d
 
11898
 {
 
11899
   /* Sequence node holding the current statement.  */
 
11900
   gimple_seq_node ptr;
 
11901
@@ -141,9 +141,8 @@
 
11902
      block/sequence is removed.  */
 
11903
   gimple_seq *seq;
 
11904
   basic_block bb;
 
11905
-} gimple_stmt_iterator;
 
11906
+};
 
11907
 
 
11908
-
 
11909
 /* Data structure definitions for GIMPLE tuples.  NOTE: word markers
 
11910
    are for 64 bit hosts.  */
 
11911
 
 
11912
--- a/src/gcc/config/i386/linux-common.h
 
11913
+++ b/src/gcc/config/i386/linux-common.h
 
11914
@@ -40,7 +40,7 @@
 
11915
 #undef  LIB_SPEC
 
11916
 #define LIB_SPEC \
 
11917
   LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
 
11918
-                      GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
 
11919
+                   GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
 
11920
 
 
11921
 #undef  STARTFILE_SPEC
 
11922
 #define STARTFILE_SPEC \
 
11923
--- a/src/gcc/config/gnu-user.h
 
11924
+++ b/src/gcc/config/gnu-user.h
 
11925
@@ -73,10 +73,14 @@
 
11926
 #undef CPLUSPLUS_CPP_SPEC
 
11927
 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
 
11928
 
 
11929
+#define GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC \
 
11930
+  "%{shared:-lc} \
 
11931
+   %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
 
11932
+
 
11933
 #define GNU_USER_TARGET_LIB_SPEC \
 
11934
-  "%{pthread:-lpthread} \
 
11935
-   %{shared:-lc} \
 
11936
-   %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
 
11937
+  "%{pthread:-lpthread} " \
 
11938
+  GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC
 
11939
+
 
11940
 #undef  LIB_SPEC
 
11941
 #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
 
11942
 
 
11943
--- a/src/gcc/config/aarch64/aarch64-simd.md
 
11944
+++ b/src/gcc/config/aarch64/aarch64-simd.md
 
11945
@@ -21,7 +21,7 @@
 
11946
 
 
11947
 ; Main data types used by the insntructions
 
11948
 
 
11949
-(define_attr "simd_mode" "unknown,none,V8QI,V16QI,V4HI,V8HI,V2SI,V4SI,V2DI,V2SF,V4SF,V2DF,OI,CI,XI,DI,DF,SI,HI,QI"
 
11950
+(define_attr "simd_mode" "unknown,none,V8QI,V16QI,V4HI,V8HI,V2SI,V4SI,V2DI,V2SF,V4SF,V2DF,OI,CI,XI,DI,DF,SI,SF,HI,QI"
 
11951
   (const_string "unknown"))
 
11952
 
 
11953
 
 
11954
@@ -44,6 +44,7 @@
 
11955
 ; simd_dup              duplicate element.
 
11956
 ; simd_dupgp            duplicate general purpose register.
 
11957
 ; simd_ext              bitwise extract from pair.
 
11958
+; simd_fabd             floating point absolute difference.
 
11959
 ; simd_fadd             floating point add/sub.
 
11960
 ; simd_fcmp             floating point compare.
 
11961
 ; simd_fcvti            floating point convert to integer.
 
11962
@@ -58,9 +59,9 @@
 
11963
 ; simd_fmul             floating point multiply.
 
11964
 ; simd_fmul_elt         floating point multiply (by element).
 
11965
 ; simd_fnegabs          floating point neg/abs.
 
11966
-; simd_frcpe            floating point reciprocal estimate.
 
11967
-; simd_frcps            floating point reciprocal step.
 
11968
-; simd_frecx            floating point reciprocal exponent.
 
11969
+; simd_frecpe            floating point reciprocal estimate.
 
11970
+; simd_frecps            floating point reciprocal step.
 
11971
+; simd_frecpx            floating point reciprocal exponent.
 
11972
 ; simd_frint            floating point round to integer.
 
11973
 ; simd_fsqrt            floating point square root.
 
11974
 ; simd_icvtf            integer convert to floating point.
 
11975
@@ -147,6 +148,7 @@
 
11976
    simd_dup,\
 
11977
    simd_dupgp,\
 
11978
    simd_ext,\
 
11979
+   simd_fabd,\
 
11980
    simd_fadd,\
 
11981
    simd_fcmp,\
 
11982
    simd_fcvti,\
 
11983
@@ -161,9 +163,9 @@
 
11984
    simd_fmul,\
 
11985
    simd_fmul_elt,\
 
11986
    simd_fnegabs,\
 
11987
-   simd_frcpe,\
 
11988
-   simd_frcps,\
 
11989
-   simd_frecx,\
 
11990
+   simd_frecpe,\
 
11991
+   simd_frecps,\
 
11992
+   simd_frecpx,\
 
11993
    simd_frint,\
 
11994
    simd_fsqrt,\
 
11995
    simd_icvtf,\
 
11996
@@ -303,8 +305,8 @@
 
11997
          (eq_attr "simd_type" "simd_store3,simd_store4") (const_string "neon_vst1_3_4_regs")
 
11998
          (eq_attr "simd_type" "simd_store1s,simd_store2s") (const_string "neon_vst1_vst2_lane")
 
11999
          (eq_attr "simd_type" "simd_store3s,simd_store4s") (const_string "neon_vst3_vst4_lane")
 
12000
-         (and (eq_attr "simd_type" "simd_frcpe,simd_frcps") (eq_attr "simd_mode" "V2SF")) (const_string "neon_fp_vrecps_vrsqrts_ddd")
 
12001
-         (and (eq_attr "simd_type" "simd_frcpe,simd_frcps") (eq_attr "simd_mode" "V4SF,V2DF")) (const_string "neon_fp_vrecps_vrsqrts_qqq")
 
12002
+         (and (eq_attr "simd_type" "simd_frecpe,simd_frecps") (eq_attr "simd_mode" "V2SF")) (const_string "neon_fp_vrecps_vrsqrts_ddd")
 
12003
+         (and (eq_attr "simd_type" "simd_frecpe,simd_frecps") (eq_attr "simd_mode" "V4SF,V2DF")) (const_string "neon_fp_vrecps_vrsqrts_qqq")
 
12004
          (eq_attr "simd_type" "none") (const_string "none")
 
12005
   ]
 
12006
   (const_string "unknown")))
 
12007
@@ -355,18 +357,6 @@
 
12008
    (set_attr "simd_mode" "<MODE>")]
 
12009
 )
 
12010
 
 
12011
-(define_insn "aarch64_dup_lane<mode>"
 
12012
-  [(set (match_operand:SDQ_I 0 "register_operand" "=w")
 
12013
-       (vec_select:<VEL>
 
12014
-         (match_operand:<VCON> 1 "register_operand" "w")
 
12015
-         (parallel [(match_operand:SI 2 "immediate_operand" "i")])
 
12016
-        ))]
 
12017
-  "TARGET_SIMD"
 
12018
-  "dup\\t%<v>0<Vmtype>, %1.<Vetype>[%2]"
 
12019
-  [(set_attr "simd_type" "simd_dup")
 
12020
-   (set_attr "simd_mode" "<MODE>")]
 
12021
-)
 
12022
-
 
12023
 (define_insn "aarch64_simd_dup<mode>"
 
12024
   [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12025
         (vec_duplicate:VDQF (match_operand:<VEL> 1 "register_operand" "w")))]
 
12026
@@ -394,7 +384,7 @@
 
12027
      case 4: return "ins\t%0.d[0], %1";
 
12028
      case 5: return "mov\t%0, %1";
 
12029
      case 6:
 
12030
-       return aarch64_output_simd_mov_immediate (&operands[1],
 
12031
+       return aarch64_output_simd_mov_immediate (operands[1],
 
12032
                                                  <MODE>mode, 64);
 
12033
      default: gcc_unreachable ();
 
12034
      }
 
12035
@@ -414,16 +404,20 @@
 
12036
 {
 
12037
   switch (which_alternative)
 
12038
     {
 
12039
-    case 0: return "ld1\t{%0.<Vtype>}, %1";
 
12040
-    case 1: return "st1\t{%1.<Vtype>}, %0";
 
12041
-    case 2: return "orr\t%0.<Vbtype>, %1.<Vbtype>, %1.<Vbtype>";
 
12042
-    case 3: return "umov\t%0, %1.d[0]\;umov\t%H0, %1.d[1]";
 
12043
-    case 4: return "ins\t%0.d[0], %1\;ins\t%0.d[1], %H1";
 
12044
-    case 5: return "#";
 
12045
+    case 0:
 
12046
+       return "ld1\t{%0.<Vtype>}, %1";
 
12047
+    case 1:
 
12048
+       return "st1\t{%1.<Vtype>}, %0";
 
12049
+    case 2:
 
12050
+       return "orr\t%0.<Vbtype>, %1.<Vbtype>, %1.<Vbtype>";
 
12051
+    case 3:
 
12052
+    case 4:
 
12053
+    case 5:
 
12054
+       return "#";
 
12055
     case 6:
 
12056
-       return aarch64_output_simd_mov_immediate (&operands[1],
 
12057
-                                                 <MODE>mode, 128);
 
12058
-    default: gcc_unreachable ();
 
12059
+       return aarch64_output_simd_mov_immediate (operands[1], <MODE>mode, 128);
 
12060
+    default:
 
12061
+       gcc_unreachable ();
 
12062
     }
 
12063
 }
 
12064
   [(set_attr "simd_type" "simd_load1,simd_store1,simd_move,simd_movgp,simd_insgp,simd_move,simd_move_imm")
 
12065
@@ -452,6 +446,77 @@
 
12066
   aarch64_simd_disambiguate_copy (operands, dest, src, 2);
 
12067
 })
 
12068
 
 
12069
+(define_split
 
12070
+  [(set (match_operand:VQ 0 "register_operand" "")
 
12071
+        (match_operand:VQ 1 "register_operand" ""))]
 
12072
+  "TARGET_SIMD && reload_completed
 
12073
+   && ((FP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[1])))
 
12074
+       || (GP_REGNUM_P (REGNO (operands[0])) && FP_REGNUM_P (REGNO (operands[1]))))"
 
12075
+  [(const_int 0)]
 
12076
+{
 
12077
+  aarch64_split_simd_move (operands[0], operands[1]);
 
12078
+  DONE;
 
12079
+})
 
12080
+
 
12081
+(define_expand "aarch64_split_simd_mov<mode>"
 
12082
+  [(set (match_operand:VQ 0)
 
12083
+        (match_operand:VQ 1))]
 
12084
+  "TARGET_SIMD"
 
12085
+  {
 
12086
+    rtx dst = operands[0];
 
12087
+    rtx src = operands[1];
 
12088
+
 
12089
+    if (GP_REGNUM_P (REGNO (src)))
 
12090
+      {
 
12091
+        rtx src_low_part = gen_lowpart (<VHALF>mode, src);
 
12092
+        rtx src_high_part = gen_highpart (<VHALF>mode, src);
 
12093
+
 
12094
+        emit_insn
 
12095
+          (gen_move_lo_quad_<mode> (dst, src_low_part));
 
12096
+        emit_insn
 
12097
+          (gen_move_hi_quad_<mode> (dst, src_high_part));
 
12098
+      }
 
12099
+
 
12100
+    else
 
12101
+      {
 
12102
+        rtx dst_low_part = gen_lowpart (<VHALF>mode, dst);
 
12103
+        rtx dst_high_part = gen_highpart (<VHALF>mode, dst);
 
12104
+        rtx lo = aarch64_simd_vect_par_cnst_half (<MODE>mode, false);
 
12105
+        rtx hi = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
 
12106
+
 
12107
+        emit_insn
 
12108
+          (gen_aarch64_simd_mov_from_<mode>low (dst_low_part, src, lo));
 
12109
+        emit_insn
 
12110
+          (gen_aarch64_simd_mov_from_<mode>high (dst_high_part, src, hi));
 
12111
+      }
 
12112
+    DONE;
 
12113
+  }
 
12114
+)
 
12115
+
 
12116
+(define_insn "aarch64_simd_mov_from_<mode>low"
 
12117
+  [(set (match_operand:<VHALF> 0 "register_operand" "=r")
 
12118
+        (vec_select:<VHALF>
 
12119
+          (match_operand:VQ 1 "register_operand" "w")
 
12120
+          (match_operand:VQ 2 "vect_par_cnst_lo_half" "")))]
 
12121
+  "TARGET_SIMD && reload_completed"
 
12122
+  "umov\t%0, %1.d[0]"
 
12123
+  [(set_attr "simd_type" "simd_movgp")
 
12124
+   (set_attr "simd_mode" "<MODE>")
 
12125
+   (set_attr "length" "4")
 
12126
+  ])
 
12127
+
 
12128
+(define_insn "aarch64_simd_mov_from_<mode>high"
 
12129
+  [(set (match_operand:<VHALF> 0 "register_operand" "=r")
 
12130
+        (vec_select:<VHALF>
 
12131
+          (match_operand:VQ 1 "register_operand" "w")
 
12132
+          (match_operand:VQ 2 "vect_par_cnst_hi_half" "")))]
 
12133
+  "TARGET_SIMD && reload_completed"
 
12134
+  "umov\t%0, %1.d[1]"
 
12135
+  [(set_attr "simd_type" "simd_movgp")
 
12136
+   (set_attr "simd_mode" "<MODE>")
 
12137
+   (set_attr "length" "4")
 
12138
+  ])
 
12139
+
 
12140
 (define_insn "orn<mode>3"
 
12141
  [(set (match_operand:VDQ 0 "register_operand" "=w")
 
12142
        (ior:VDQ (not:VDQ (match_operand:VDQ 1 "register_operand" "w"))
 
12143
@@ -503,8 +568,8 @@
 
12144
 )
 
12145
 
 
12146
 (define_insn "neg<mode>2"
 
12147
-  [(set (match_operand:VDQM 0 "register_operand" "=w")
 
12148
-        (neg:VDQM (match_operand:VDQM 1 "register_operand" "w")))]
 
12149
+  [(set (match_operand:VDQ 0 "register_operand" "=w")
 
12150
+       (neg:VDQ (match_operand:VDQ 1 "register_operand" "w")))]
 
12151
   "TARGET_SIMD"
 
12152
   "neg\t%0.<Vtype>, %1.<Vtype>"
 
12153
   [(set_attr "simd_type" "simd_negabs")
 
12154
@@ -520,6 +585,51 @@
 
12155
    (set_attr "simd_mode" "<MODE>")]
 
12156
 )
 
12157
 
 
12158
+(define_insn "abd<mode>_3"
 
12159
+  [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
 
12160
+       (abs:VDQ_BHSI (minus:VDQ_BHSI
 
12161
+                      (match_operand:VDQ_BHSI 1 "register_operand" "w")
 
12162
+                      (match_operand:VDQ_BHSI 2 "register_operand" "w"))))]
 
12163
+  "TARGET_SIMD"
 
12164
+  "sabd\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12165
+  [(set_attr "simd_type" "simd_abd")
 
12166
+   (set_attr "simd_mode" "<MODE>")]
 
12167
+)
 
12168
+
 
12169
+(define_insn "aba<mode>_3"
 
12170
+  [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
 
12171
+       (plus:VDQ_BHSI (abs:VDQ_BHSI (minus:VDQ_BHSI
 
12172
+                        (match_operand:VDQ_BHSI 1 "register_operand" "w")
 
12173
+                        (match_operand:VDQ_BHSI 2 "register_operand" "w")))
 
12174
+                      (match_operand:VDQ_BHSI 3 "register_operand" "0")))]
 
12175
+  "TARGET_SIMD"
 
12176
+  "saba\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12177
+  [(set_attr "simd_type" "simd_abd")
 
12178
+   (set_attr "simd_mode" "<MODE>")]
 
12179
+)
 
12180
+
 
12181
+(define_insn "fabd<mode>_3"
 
12182
+  [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12183
+       (abs:VDQF (minus:VDQF
 
12184
+                  (match_operand:VDQF 1 "register_operand" "w")
 
12185
+                  (match_operand:VDQF 2 "register_operand" "w"))))]
 
12186
+  "TARGET_SIMD"
 
12187
+  "fabd\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12188
+  [(set_attr "simd_type" "simd_fabd")
 
12189
+   (set_attr "simd_mode" "<MODE>")]
 
12190
+)
 
12191
+
 
12192
+(define_insn "*fabd_scalar<mode>3"
 
12193
+  [(set (match_operand:GPF 0 "register_operand" "=w")
 
12194
+        (abs:GPF (minus:GPF
 
12195
+                 (match_operand:GPF 1 "register_operand" "w")
 
12196
+                 (match_operand:GPF 2 "register_operand" "w"))))]
 
12197
+  "TARGET_SIMD"
 
12198
+  "fabd\t%<s>0, %<s>1, %<s>2"
 
12199
+  [(set_attr "simd_type" "simd_fabd")
 
12200
+   (set_attr "mode" "<MODE>")]
 
12201
+)
 
12202
+
 
12203
 (define_insn "and<mode>3"
 
12204
   [(set (match_operand:VDQ 0 "register_operand" "=w")
 
12205
         (and:VDQ (match_operand:VDQ 1 "register_operand" "w")
 
12206
@@ -904,12 +1014,12 @@
 
12207
 )
 
12208
 
 
12209
 ;; Max/Min operations.
 
12210
-(define_insn "<maxmin><mode>3"
 
12211
+(define_insn "<su><maxmin><mode>3"
 
12212
  [(set (match_operand:VQ_S 0 "register_operand" "=w")
 
12213
        (MAXMIN:VQ_S (match_operand:VQ_S 1 "register_operand" "w")
 
12214
                    (match_operand:VQ_S 2 "register_operand" "w")))]
 
12215
  "TARGET_SIMD"
 
12216
- "<maxmin>\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12217
+ "<su><maxmin>\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12218
   [(set_attr "simd_type" "simd_minmax")
 
12219
    (set_attr "simd_mode" "<MODE>")]
 
12220
 )
 
12221
@@ -917,29 +1027,39 @@
 
12222
 ;; Move into low-half clearing high half to 0.
 
12223
 
 
12224
 (define_insn "move_lo_quad_<mode>"
 
12225
-  [(set (match_operand:VQ 0 "register_operand" "=w")
 
12226
+  [(set (match_operand:VQ 0 "register_operand" "=w,w,w")
 
12227
         (vec_concat:VQ
 
12228
-         (match_operand:<VHALF> 1 "register_operand" "w")
 
12229
+         (match_operand:<VHALF> 1 "register_operand" "w,r,r")
 
12230
          (vec_duplicate:<VHALF> (const_int 0))))]
 
12231
   "TARGET_SIMD"
 
12232
-  "mov\\t%d0, %d1";
 
12233
-  [(set_attr "simd_type" "simd_dup")
 
12234
-   (set_attr "simd_mode" "<MODE>")]
 
12235
+  "@
 
12236
+   dup\\t%d0, %1.d[0]
 
12237
+   fmov\\t%d0, %1
 
12238
+   dup\\t%d0, %1"
 
12239
+  [(set_attr "v8type" "*,fmov,*")
 
12240
+   (set_attr "simd_type" "simd_dup,*,simd_dup")
 
12241
+   (set_attr "simd_mode" "<MODE>")
 
12242
+   (set_attr "simd" "yes,*,yes")
 
12243
+   (set_attr "fp" "*,yes,*")
 
12244
+   (set_attr "length" "4")]
 
12245
 )
 
12246
 
 
12247
 ;; Move into high-half.
 
12248
 
 
12249
 (define_insn "aarch64_simd_move_hi_quad_<mode>"
 
12250
-  [(set (match_operand:VQ 0 "register_operand" "+w")
 
12251
+  [(set (match_operand:VQ 0 "register_operand" "+w,w")
 
12252
         (vec_concat:VQ
 
12253
           (vec_select:<VHALF>
 
12254
                 (match_dup 0)
 
12255
                 (match_operand:VQ 2 "vect_par_cnst_lo_half" ""))
 
12256
-         (match_operand:<VHALF> 1 "register_operand" "w")))]
 
12257
+         (match_operand:<VHALF> 1 "register_operand" "w,r")))]
 
12258
   "TARGET_SIMD"
 
12259
-  "ins\\t%0.d[1], %1.d[0]";
 
12260
-  [(set_attr "simd_type" "simd_ins")
 
12261
-   (set_attr "simd_mode" "<MODE>")]
 
12262
+  "@
 
12263
+   ins\\t%0.d[1], %1.d[0]
 
12264
+   ins\\t%0.d[1], %1"
 
12265
+  [(set_attr "simd_type" "simd_ins,simd_ins")
 
12266
+   (set_attr "simd_mode" "<MODE>")
 
12267
+   (set_attr "length" "4")]
 
12268
 )
 
12269
 
 
12270
 (define_expand "move_hi_quad_<mode>"
 
12271
@@ -1045,6 +1165,104 @@
 
12272
 
 
12273
 ;; Widening arithmetic.
 
12274
 
 
12275
+(define_insn "*aarch64_<su>mlal_lo<mode>"
 
12276
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12277
+        (plus:<VWIDE>
 
12278
+          (mult:<VWIDE>
 
12279
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12280
+                 (match_operand:VQW 2 "register_operand" "w")
 
12281
+                 (match_operand:VQW 3 "vect_par_cnst_lo_half" "")))
 
12282
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12283
+                 (match_operand:VQW 4 "register_operand" "w")
 
12284
+                 (match_dup 3))))
 
12285
+          (match_operand:<VWIDE> 1 "register_operand" "0")))]
 
12286
+  "TARGET_SIMD"
 
12287
+  "<su>mlal\t%0.<Vwtype>, %2.<Vhalftype>, %4.<Vhalftype>"
 
12288
+  [(set_attr "simd_type" "simd_mlal")
 
12289
+   (set_attr "simd_mode" "<MODE>")]
 
12290
+)
 
12291
+
 
12292
+(define_insn "*aarch64_<su>mlal_hi<mode>"
 
12293
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12294
+        (plus:<VWIDE>
 
12295
+          (mult:<VWIDE>
 
12296
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12297
+                 (match_operand:VQW 2 "register_operand" "w")
 
12298
+                 (match_operand:VQW 3 "vect_par_cnst_hi_half" "")))
 
12299
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12300
+                 (match_operand:VQW 4 "register_operand" "w")
 
12301
+                 (match_dup 3))))
 
12302
+          (match_operand:<VWIDE> 1 "register_operand" "0")))]
 
12303
+  "TARGET_SIMD"
 
12304
+  "<su>mlal2\t%0.<Vwtype>, %2.<Vtype>, %4.<Vtype>"
 
12305
+  [(set_attr "simd_type" "simd_mlal")
 
12306
+   (set_attr "simd_mode" "<MODE>")]
 
12307
+)
 
12308
+
 
12309
+(define_insn "*aarch64_<su>mlsl_lo<mode>"
 
12310
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12311
+        (minus:<VWIDE>
 
12312
+          (match_operand:<VWIDE> 1 "register_operand" "0")
 
12313
+          (mult:<VWIDE>
 
12314
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12315
+                 (match_operand:VQW 2 "register_operand" "w")
 
12316
+                 (match_operand:VQW 3 "vect_par_cnst_lo_half" "")))
 
12317
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12318
+                 (match_operand:VQW 4 "register_operand" "w")
 
12319
+                 (match_dup 3))))))]
 
12320
+  "TARGET_SIMD"
 
12321
+  "<su>mlsl\t%0.<Vwtype>, %2.<Vhalftype>, %4.<Vhalftype>"
 
12322
+  [(set_attr "simd_type" "simd_mlal")
 
12323
+   (set_attr "simd_mode" "<MODE>")]
 
12324
+)
 
12325
+
 
12326
+(define_insn "*aarch64_<su>mlsl_hi<mode>"
 
12327
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12328
+        (minus:<VWIDE>
 
12329
+          (match_operand:<VWIDE> 1 "register_operand" "0")
 
12330
+          (mult:<VWIDE>
 
12331
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12332
+                 (match_operand:VQW 2 "register_operand" "w")
 
12333
+                 (match_operand:VQW 3 "vect_par_cnst_hi_half" "")))
 
12334
+              (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12335
+                 (match_operand:VQW 4 "register_operand" "w")
 
12336
+                 (match_dup 3))))))]
 
12337
+  "TARGET_SIMD"
 
12338
+  "<su>mlsl2\t%0.<Vwtype>, %2.<Vtype>, %4.<Vtype>"
 
12339
+  [(set_attr "simd_type" "simd_mlal")
 
12340
+   (set_attr "simd_mode" "<MODE>")]
 
12341
+)
 
12342
+
 
12343
+(define_insn "*aarch64_<su>mlal<mode>"
 
12344
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12345
+        (plus:<VWIDE>
 
12346
+          (mult:<VWIDE>
 
12347
+            (ANY_EXTEND:<VWIDE>
 
12348
+              (match_operand:VDW 1 "register_operand" "w"))
 
12349
+            (ANY_EXTEND:<VWIDE>
 
12350
+              (match_operand:VDW 2 "register_operand" "w")))
 
12351
+          (match_operand:<VWIDE> 3 "register_operand" "0")))]
 
12352
+  "TARGET_SIMD"
 
12353
+  "<su>mlal\t%0.<Vwtype>, %1.<Vtype>, %2.<Vtype>"
 
12354
+  [(set_attr "simd_type" "simd_mlal")
 
12355
+   (set_attr "simd_mode" "<MODE>")]
 
12356
+)
 
12357
+
 
12358
+(define_insn "*aarch64_<su>mlsl<mode>"
 
12359
+  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12360
+        (minus:<VWIDE>
 
12361
+          (match_operand:<VWIDE> 1 "register_operand" "0")
 
12362
+          (mult:<VWIDE>
 
12363
+            (ANY_EXTEND:<VWIDE>
 
12364
+              (match_operand:VDW 2 "register_operand" "w"))
 
12365
+            (ANY_EXTEND:<VWIDE>
 
12366
+              (match_operand:VDW 3 "register_operand" "w")))))]
 
12367
+  "TARGET_SIMD"
 
12368
+  "<su>mlsl\t%0.<Vwtype>, %2.<Vtype>, %3.<Vtype>"
 
12369
+  [(set_attr "simd_type" "simd_mlal")
 
12370
+   (set_attr "simd_mode" "<MODE>")]
 
12371
+)
 
12372
+
 
12373
 (define_insn "aarch64_simd_vec_<su>mult_lo_<mode>"
 
12374
  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
 
12375
        (mult:<VWIDE> (ANY_EXTEND:<VWIDE> (vec_select:<VHALF>
 
12376
@@ -1196,7 +1414,9 @@
 
12377
    (set_attr "simd_mode" "<MODE>")]
 
12378
 )
 
12379
 
 
12380
-(define_insn "aarch64_frint<frint_suffix><mode>"
 
12381
+;; Vector versions of the floating-point frint patterns.
 
12382
+;; Expands to btrunc, ceil, floor, nearbyint, rint, round.
 
12383
+(define_insn "<frint_pattern><mode>2"
 
12384
   [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12385
        (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")]
 
12386
                      FRINT))]
 
12387
@@ -1206,16 +1426,9 @@
 
12388
    (set_attr "simd_mode" "<MODE>")]
 
12389
 )
 
12390
 
 
12391
-;; Vector versions of the floating-point frint patterns.
 
12392
-;; Expands to btrunc, ceil, floor, nearbyint, rint, round.
 
12393
-(define_expand "<frint_pattern><mode>2"
 
12394
-  [(set (match_operand:VDQF 0 "register_operand")
 
12395
-       (unspec:VDQF [(match_operand:VDQF 1 "register_operand")]
 
12396
-                     FRINT))]
 
12397
-  "TARGET_SIMD"
 
12398
-  {})
 
12399
-
 
12400
-(define_insn "aarch64_fcvt<frint_suffix><su><mode>"
 
12401
+;; Vector versions of the fcvt standard patterns.
 
12402
+;; Expands to lbtrunc, lround, lceil, lfloor
 
12403
+(define_insn "l<fcvt_pattern><su_optab><VDQF:mode><fcvt_target>2"
 
12404
   [(set (match_operand:<FCVT_TARGET> 0 "register_operand" "=w")
 
12405
        (FIXUORS:<FCVT_TARGET> (unspec:<FCVT_TARGET>
 
12406
                               [(match_operand:VDQF 1 "register_operand" "w")]
 
12407
@@ -1226,16 +1439,141 @@
 
12408
    (set_attr "simd_mode" "<MODE>")]
 
12409
 )
 
12410
 
 
12411
-;; Vector versions of the fcvt standard patterns.
 
12412
-;; Expands to lbtrunc, lround, lceil, lfloor
 
12413
-(define_expand "l<fcvt_pattern><su_optab><fcvt_target><VDQF:mode>2"
 
12414
+(define_expand "<optab><VDQF:mode><fcvt_target>2"
 
12415
   [(set (match_operand:<FCVT_TARGET> 0 "register_operand")
 
12416
        (FIXUORS:<FCVT_TARGET> (unspec:<FCVT_TARGET>
 
12417
                               [(match_operand:VDQF 1 "register_operand")]
 
12418
-                              FCVT)))]
 
12419
+                              UNSPEC_FRINTZ)))]
 
12420
   "TARGET_SIMD"
 
12421
   {})
 
12422
 
 
12423
+(define_expand "<fix_trunc_optab><VDQF:mode><fcvt_target>2"
 
12424
+  [(set (match_operand:<FCVT_TARGET> 0 "register_operand")
 
12425
+       (FIXUORS:<FCVT_TARGET> (unspec:<FCVT_TARGET>
 
12426
+                              [(match_operand:VDQF 1 "register_operand")]
 
12427
+                              UNSPEC_FRINTZ)))]
 
12428
+  "TARGET_SIMD"
 
12429
+  {})
 
12430
+
 
12431
+(define_expand "ftrunc<VDQF:mode>2"
 
12432
+  [(set (match_operand:VDQF 0 "register_operand")
 
12433
+       (unspec:VDQF [(match_operand:VDQF 1 "register_operand")]
 
12434
+                     UNSPEC_FRINTZ))]
 
12435
+  "TARGET_SIMD"
 
12436
+  {})
 
12437
+
 
12438
+(define_insn "<optab><fcvt_target><VDQF:mode>2"
 
12439
+  [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12440
+       (FLOATUORS:VDQF
 
12441
+         (match_operand:<FCVT_TARGET> 1 "register_operand" "w")))]
 
12442
+  "TARGET_SIMD"
 
12443
+  "<su_optab>cvtf\\t%0.<Vtype>, %1.<Vtype>"
 
12444
+  [(set_attr "simd_type" "simd_icvtf")
 
12445
+   (set_attr "simd_mode" "<MODE>")]
 
12446
+)
 
12447
+
 
12448
+;; Conversions between vectors of floats and doubles.
 
12449
+;; Contains a mix of patterns to match standard pattern names
 
12450
+;; and those for intrinsics.
 
12451
+
 
12452
+;; Float widening operations.
 
12453
+
 
12454
+(define_insn "vec_unpacks_lo_v4sf"
 
12455
+  [(set (match_operand:V2DF 0 "register_operand" "=w")
 
12456
+       (float_extend:V2DF
 
12457
+         (vec_select:V2SF
 
12458
+           (match_operand:V4SF 1 "register_operand" "w")
 
12459
+           (parallel [(const_int 0) (const_int 1)])
 
12460
+         )))]
 
12461
+  "TARGET_SIMD"
 
12462
+  "fcvtl\\t%0.2d, %1.2s"
 
12463
+  [(set_attr "simd_type" "simd_fcvtl")
 
12464
+   (set_attr "simd_mode" "V2DF")]
 
12465
+)
 
12466
+
 
12467
+(define_insn "aarch64_float_extend_lo_v2df"
 
12468
+  [(set (match_operand:V2DF 0 "register_operand" "=w")
 
12469
+       (float_extend:V2DF
 
12470
+         (match_operand:V2SF 1 "register_operand" "w")))]
 
12471
+  "TARGET_SIMD"
 
12472
+  "fcvtl\\t%0.2d, %1.2s"
 
12473
+  [(set_attr "simd_type" "simd_fcvtl")
 
12474
+   (set_attr "simd_mode" "V2DF")]
 
12475
+)
 
12476
+
 
12477
+(define_insn "vec_unpacks_hi_v4sf"
 
12478
+  [(set (match_operand:V2DF 0 "register_operand" "=w")
 
12479
+       (float_extend:V2DF
 
12480
+         (vec_select:V2SF
 
12481
+           (match_operand:V4SF 1 "register_operand" "w")
 
12482
+           (parallel [(const_int 2) (const_int 3)])
 
12483
+         )))]
 
12484
+  "TARGET_SIMD"
 
12485
+  "fcvtl2\\t%0.2d, %1.4s"
 
12486
+  [(set_attr "simd_type" "simd_fcvtl")
 
12487
+   (set_attr "simd_mode" "V2DF")]
 
12488
+)
 
12489
+
 
12490
+;; Float narrowing operations.
 
12491
+
 
12492
+(define_insn "aarch64_float_truncate_lo_v2sf"
 
12493
+  [(set (match_operand:V2SF 0 "register_operand" "=w")
 
12494
+      (float_truncate:V2SF
 
12495
+       (match_operand:V2DF 1 "register_operand" "w")))]
 
12496
+  "TARGET_SIMD"
 
12497
+  "fcvtn\\t%0.2s, %1.2d"
 
12498
+  [(set_attr "simd_type" "simd_fcvtl")
 
12499
+   (set_attr "simd_mode" "V2SF")]
 
12500
+)
 
12501
+
 
12502
+(define_insn "aarch64_float_truncate_hi_v4sf"
 
12503
+  [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12504
+    (vec_concat:V4SF
 
12505
+      (match_operand:V2SF 1 "register_operand" "0")
 
12506
+      (float_truncate:V2SF
 
12507
+       (match_operand:V2DF 2 "register_operand" "w"))))]
 
12508
+  "TARGET_SIMD"
 
12509
+  "fcvtn2\\t%0.4s, %2.2d"
 
12510
+  [(set_attr "simd_type" "simd_fcvtl")
 
12511
+   (set_attr "simd_mode" "V4SF")]
 
12512
+)
 
12513
+
 
12514
+(define_expand "vec_pack_trunc_v2df"
 
12515
+  [(set (match_operand:V4SF 0 "register_operand")
 
12516
+      (vec_concat:V4SF
 
12517
+       (float_truncate:V2SF
 
12518
+           (match_operand:V2DF 1 "register_operand"))
 
12519
+       (float_truncate:V2SF
 
12520
+           (match_operand:V2DF 2 "register_operand"))
 
12521
+         ))]
 
12522
+  "TARGET_SIMD"
 
12523
+  {
 
12524
+    rtx tmp = gen_reg_rtx (V2SFmode);
 
12525
+    emit_insn (gen_aarch64_float_truncate_lo_v2sf (tmp, operands[1]));
 
12526
+    emit_insn (gen_aarch64_float_truncate_hi_v4sf (operands[0],
 
12527
+                                                  tmp, operands[2]));
 
12528
+    DONE;
 
12529
+  }
 
12530
+)
 
12531
+
 
12532
+(define_expand "vec_pack_trunc_df"
 
12533
+  [(set (match_operand:V2SF 0 "register_operand")
 
12534
+      (vec_concat:V2SF
 
12535
+       (float_truncate:SF
 
12536
+           (match_operand:DF 1 "register_operand"))
 
12537
+       (float_truncate:SF
 
12538
+           (match_operand:DF 2 "register_operand"))
 
12539
+         ))]
 
12540
+  "TARGET_SIMD"
 
12541
+  {
 
12542
+    rtx tmp = gen_reg_rtx (V2SFmode);
 
12543
+    emit_insn (gen_move_lo_quad_v2df (tmp, operands[1]));
 
12544
+    emit_insn (gen_move_hi_quad_v2df (tmp, operands[2]));
 
12545
+    emit_insn (gen_aarch64_float_truncate_lo_v2sf (operands[0], tmp));
 
12546
+    DONE;
 
12547
+  }
 
12548
+)
 
12549
+
 
12550
 (define_insn "aarch64_vmls<mode>"
 
12551
   [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12552
        (minus:VDQF (match_operand:VDQF 1 "register_operand" "0")
 
12553
@@ -1261,51 +1599,70 @@
 
12554
 ;; only introduces MIN_EXPR/MAX_EXPR in fast math mode or when not honouring
 
12555
 ;; NaNs.
 
12556
 
 
12557
-(define_insn "smax<mode>3"
 
12558
+(define_insn "<su><maxmin><mode>3"
 
12559
   [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12560
-        (smax:VDQF (match_operand:VDQF 1 "register_operand" "w")
 
12561
+        (FMAXMIN:VDQF (match_operand:VDQF 1 "register_operand" "w")
 
12562
                   (match_operand:VDQF 2 "register_operand" "w")))]
 
12563
   "TARGET_SIMD"
 
12564
-  "fmaxnm\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12565
+  "f<maxmin>nm\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12566
   [(set_attr "simd_type" "simd_fminmax")
 
12567
    (set_attr "simd_mode" "<MODE>")]
 
12568
 )
 
12569
 
 
12570
-(define_insn "smin<mode>3"
 
12571
+(define_insn "<maxmin_uns><mode>3"
 
12572
   [(set (match_operand:VDQF 0 "register_operand" "=w")
 
12573
-        (smin:VDQF (match_operand:VDQF 1 "register_operand" "w")
 
12574
-                  (match_operand:VDQF 2 "register_operand" "w")))]
 
12575
+       (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")
 
12576
+                    (match_operand:VDQF 2 "register_operand" "w")]
 
12577
+                   FMAXMIN_UNS))]
 
12578
   "TARGET_SIMD"
 
12579
-  "fminnm\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12580
+  "<maxmin_uns_op>\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
12581
   [(set_attr "simd_type" "simd_fminmax")
 
12582
    (set_attr "simd_mode" "<MODE>")]
 
12583
 )
 
12584
 
 
12585
-;; FP 'across lanes' max and min ops.
 
12586
+;; 'across lanes' add.
 
12587
 
 
12588
-(define_insn "reduc_s<fmaxminv>_v4sf"
 
12589
- [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12590
-       (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")]
 
12591
-                   FMAXMINV))]
 
12592
+(define_insn "reduc_<sur>plus_<mode>"
 
12593
+ [(set (match_operand:VDQV 0 "register_operand" "=w")
 
12594
+       (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")]
 
12595
+                   SUADDV))]
 
12596
  "TARGET_SIMD"
 
12597
- "f<fmaxminv>nmv\\t%s0, %1.4s";
 
12598
-  [(set_attr "simd_type" "simd_fminmaxv")
 
12599
-   (set_attr "simd_mode" "V4SF")]
 
12600
+ "addv\\t%<Vetype>0, %1.<Vtype>"
 
12601
+  [(set_attr "simd_type" "simd_addv")
 
12602
+   (set_attr "simd_mode" "<MODE>")]
 
12603
 )
 
12604
 
 
12605
-(define_insn "reduc_s<fmaxminv>_<mode>"
 
12606
+(define_insn "reduc_<sur>plus_v2di"
 
12607
+ [(set (match_operand:V2DI 0 "register_operand" "=w")
 
12608
+       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")]
 
12609
+                   SUADDV))]
 
12610
+ "TARGET_SIMD"
 
12611
+ "addp\\t%d0, %1.2d"
 
12612
+  [(set_attr "simd_type" "simd_addv")
 
12613
+   (set_attr "simd_mode" "V2DI")]
 
12614
+)
 
12615
+
 
12616
+(define_insn "reduc_<sur>plus_v2si"
 
12617
+ [(set (match_operand:V2SI 0 "register_operand" "=w")
 
12618
+       (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")]
 
12619
+                   SUADDV))]
 
12620
+ "TARGET_SIMD"
 
12621
+ "addp\\t%0.2s, %1.2s, %1.2s"
 
12622
+  [(set_attr "simd_type" "simd_addv")
 
12623
+   (set_attr "simd_mode" "V2SI")]
 
12624
+)
 
12625
+
 
12626
+(define_insn "reduc_<sur>plus_<mode>"
 
12627
  [(set (match_operand:V2F 0 "register_operand" "=w")
 
12628
        (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")]
 
12629
-                   FMAXMINV))]
 
12630
+                   SUADDV))]
 
12631
  "TARGET_SIMD"
 
12632
- "f<fmaxminv>nmp\\t%0.<Vtype>, %1.<Vtype>, %1.<Vtype>";
 
12633
-  [(set_attr "simd_type" "simd_fminmax")
 
12634
+ "faddp\\t%<Vetype>0, %1.<Vtype>"
 
12635
+  [(set_attr "simd_type" "simd_fadd")
 
12636
    (set_attr "simd_mode" "<MODE>")]
 
12637
 )
 
12638
 
 
12639
-;; FP 'across lanes' add.
 
12640
-
 
12641
-(define_insn "aarch64_addvv4sf"
 
12642
+(define_insn "aarch64_addpv4sf"
 
12643
  [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12644
        (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")]
 
12645
                    UNSPEC_FADDV))]
 
12646
@@ -1315,169 +1672,106 @@
 
12647
    (set_attr "simd_mode" "V4SF")]
 
12648
 )
 
12649
 
 
12650
-(define_expand "reduc_uplus_v4sf"
 
12651
- [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12652
-       (match_operand:V4SF 1 "register_operand" "w"))]
 
12653
+(define_expand "reduc_<sur>plus_v4sf"
 
12654
+ [(set (match_operand:V4SF 0 "register_operand")
 
12655
+       (unspec:V4SF [(match_operand:V4SF 1 "register_operand")]
 
12656
+                   SUADDV))]
 
12657
  "TARGET_SIMD"
 
12658
 {
 
12659
   rtx tmp = gen_reg_rtx (V4SFmode);
 
12660
-  emit_insn (gen_aarch64_addvv4sf (tmp, operands[1]));
 
12661
-  emit_insn (gen_aarch64_addvv4sf (operands[0], tmp));
 
12662
+  emit_insn (gen_aarch64_addpv4sf (tmp, operands[1]));
 
12663
+  emit_insn (gen_aarch64_addpv4sf (operands[0], tmp));
 
12664
   DONE;
 
12665
 })
 
12666
 
 
12667
-(define_expand "reduc_splus_v4sf"
 
12668
- [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12669
-       (match_operand:V4SF 1 "register_operand" "w"))]
 
12670
+(define_insn "clz<mode>2"
 
12671
+ [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
 
12672
+       (clz:VDQ_BHSI (match_operand:VDQ_BHSI 1 "register_operand" "w")))]
 
12673
  "TARGET_SIMD"
 
12674
-{
 
12675
-  rtx tmp = gen_reg_rtx (V4SFmode);
 
12676
-  emit_insn (gen_aarch64_addvv4sf (tmp, operands[1]));
 
12677
-  emit_insn (gen_aarch64_addvv4sf (operands[0], tmp));
 
12678
-  DONE;
 
12679
-})
 
12680
-
 
12681
-(define_insn "aarch64_addv<mode>"
 
12682
- [(set (match_operand:V2F 0 "register_operand" "=w")
 
12683
-       (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")]
 
12684
-                   UNSPEC_FADDV))]
 
12685
- "TARGET_SIMD"
 
12686
- "faddp\\t%<Vetype>0, %1.<Vtype>"
 
12687
-  [(set_attr "simd_type" "simd_fadd")
 
12688
-   (set_attr "simd_mode" "<MODE>")]
 
12689
+ "clz\\t%0.<Vtype>, %1.<Vtype>"
 
12690
+ [(set_attr "simd_type" "simd_cls")
 
12691
+  (set_attr "simd_mode" "<MODE>")]
 
12692
 )
 
12693
 
 
12694
-(define_expand "reduc_uplus_<mode>"
 
12695
- [(set (match_operand:V2F 0 "register_operand" "=w")
 
12696
-       (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")]
 
12697
-                   UNSPEC_FADDV))]
 
12698
- "TARGET_SIMD"
 
12699
- ""
 
12700
-)
 
12701
+;; 'across lanes' max and min ops.
 
12702
 
 
12703
-(define_expand "reduc_splus_<mode>"
 
12704
- [(set (match_operand:V2F 0 "register_operand" "=w")
 
12705
-       (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")]
 
12706
-                   UNSPEC_FADDV))]
 
12707
- "TARGET_SIMD"
 
12708
- ""
 
12709
-)
 
12710
-
 
12711
-;; Reduction across lanes.
 
12712
-
 
12713
-(define_insn "aarch64_addv<mode>"
 
12714
+(define_insn "reduc_<maxmin_uns>_<mode>"
 
12715
  [(set (match_operand:VDQV 0 "register_operand" "=w")
 
12716
        (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")]
 
12717
-                   UNSPEC_ADDV))]
 
12718
+                   MAXMINV))]
 
12719
  "TARGET_SIMD"
 
12720
- "addv\\t%<Vetype>0, %1.<Vtype>"
 
12721
-  [(set_attr "simd_type" "simd_addv")
 
12722
+ "<maxmin_uns_op>v\\t%<Vetype>0, %1.<Vtype>"
 
12723
+  [(set_attr "simd_type" "simd_minmaxv")
 
12724
    (set_attr "simd_mode" "<MODE>")]
 
12725
 )
 
12726
 
 
12727
-(define_expand "reduc_splus_<mode>"
 
12728
- [(set (match_operand:VDQV 0 "register_operand" "=w")
 
12729
-       (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")]
 
12730
-                   UNSPEC_ADDV))]
 
12731
- "TARGET_SIMD"
 
12732
- ""
 
12733
-)
 
12734
-
 
12735
-(define_expand "reduc_uplus_<mode>"
 
12736
- [(set (match_operand:VDQV 0 "register_operand" "=w")
 
12737
-       (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")]
 
12738
-                   UNSPEC_ADDV))]
 
12739
- "TARGET_SIMD"
 
12740
- ""
 
12741
-)
 
12742
-
 
12743
-(define_insn "aarch64_addvv2di"
 
12744
+(define_insn "reduc_<maxmin_uns>_v2di"
 
12745
  [(set (match_operand:V2DI 0 "register_operand" "=w")
 
12746
        (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")]
 
12747
-                   UNSPEC_ADDV))]
 
12748
+                   MAXMINV))]
 
12749
  "TARGET_SIMD"
 
12750
- "addp\\t%d0, %1.2d"
 
12751
-  [(set_attr "simd_type" "simd_add")
 
12752
+ "<maxmin_uns_op>p\\t%d0, %1.2d"
 
12753
+  [(set_attr "simd_type" "simd_minmaxv")
 
12754
    (set_attr "simd_mode" "V2DI")]
 
12755
 )
 
12756
 
 
12757
-(define_expand "reduc_uplus_v2di"
 
12758
- [(set (match_operand:V2DI 0 "register_operand" "=w")
 
12759
-       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")]
 
12760
-                   UNSPEC_ADDV))]
 
12761
- "TARGET_SIMD"
 
12762
- ""
 
12763
-)
 
12764
-
 
12765
-(define_expand "reduc_splus_v2di"
 
12766
- [(set (match_operand:V2DI 0 "register_operand" "=w")
 
12767
-       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "w")]
 
12768
-                   UNSPEC_ADDV))]
 
12769
- "TARGET_SIMD"
 
12770
- ""
 
12771
-)
 
12772
-
 
12773
-(define_insn "aarch64_addvv2si"
 
12774
+(define_insn "reduc_<maxmin_uns>_v2si"
 
12775
  [(set (match_operand:V2SI 0 "register_operand" "=w")
 
12776
        (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")]
 
12777
-                   UNSPEC_ADDV))]
 
12778
+                   MAXMINV))]
 
12779
  "TARGET_SIMD"
 
12780
- "addp\\t%0.2s, %1.2s, %1.2s"
 
12781
-  [(set_attr "simd_type" "simd_add")
 
12782
+ "<maxmin_uns_op>p\\t%0.2s, %1.2s, %1.2s"
 
12783
+  [(set_attr "simd_type" "simd_minmaxv")
 
12784
    (set_attr "simd_mode" "V2SI")]
 
12785
 )
 
12786
 
 
12787
-(define_expand "reduc_uplus_v2si"
 
12788
- [(set (match_operand:V2SI 0 "register_operand" "=w")
 
12789
-       (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")]
 
12790
-                   UNSPEC_ADDV))]
 
12791
+(define_insn "reduc_<maxmin_uns>_<mode>"
 
12792
+ [(set (match_operand:V2F 0 "register_operand" "=w")
 
12793
+       (unspec:V2F [(match_operand:V2F 1 "register_operand" "w")]
 
12794
+                   FMAXMINV))]
 
12795
  "TARGET_SIMD"
 
12796
- ""
 
12797
-)
 
12798
-
 
12799
-(define_expand "reduc_splus_v2si"
 
12800
- [(set (match_operand:V2SI 0 "register_operand" "=w")
 
12801
-       (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")]
 
12802
-                   UNSPEC_ADDV))]
 
12803
- "TARGET_SIMD"
 
12804
- ""
 
12805
-)
 
12806
-
 
12807
-(define_insn "reduc_<maxminv>_<mode>"
 
12808
- [(set (match_operand:VDQV 0 "register_operand" "=w")
 
12809
-       (unspec:VDQV [(match_operand:VDQV 1 "register_operand" "w")]
 
12810
-                   MAXMINV))]
 
12811
- "TARGET_SIMD"
 
12812
- "<maxminv>v\\t%<Vetype>0, %1.<Vtype>"
 
12813
-  [(set_attr "simd_type" "simd_minmaxv")
 
12814
+ "<maxmin_uns_op>p\\t%<Vetype>0, %1.<Vtype>"
 
12815
+  [(set_attr "simd_type" "simd_fminmaxv")
 
12816
    (set_attr "simd_mode" "<MODE>")]
 
12817
 )
 
12818
 
 
12819
-(define_insn "reduc_<maxminv>_v2si"
 
12820
- [(set (match_operand:V2SI 0 "register_operand" "=w")
 
12821
-       (unspec:V2SI [(match_operand:V2SI 1 "register_operand" "w")]
 
12822
-                   MAXMINV))]
 
12823
+(define_insn "reduc_<maxmin_uns>_v4sf"
 
12824
+ [(set (match_operand:V4SF 0 "register_operand" "=w")
 
12825
+       (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "w")]
 
12826
+                   FMAXMINV))]
 
12827
  "TARGET_SIMD"
 
12828
- "<maxminv>p\\t%0.2s, %1.2s, %1.2s"
 
12829
-  [(set_attr "simd_type" "simd_minmax")
 
12830
-   (set_attr "simd_mode" "V2SI")]
 
12831
+ "<maxmin_uns_op>v\\t%s0, %1.4s"
 
12832
+  [(set_attr "simd_type" "simd_fminmaxv")
 
12833
+   (set_attr "simd_mode" "V4SF")]
 
12834
 )
 
12835
 
 
12836
-;; vbsl_* intrinsics may compile to any of bsl/bif/bit depending on register
 
12837
-;; allocation.  For an intrinsic of form:
 
12838
-;;   vD = bsl_* (vS, vN, vM)
 
12839
+;; aarch64_simd_bsl may compile to any of bsl/bif/bit depending on register
 
12840
+;; allocation.
 
12841
+;; Operand 1 is the mask, operands 2 and 3 are the bitfields from which
 
12842
+;; to select.
 
12843
+;;
 
12844
+;; Thus our BSL is of the form:
 
12845
+;;   op0 = bsl (mask, op2, op3)
 
12846
 ;; We can use any of:
 
12847
-;;   bsl vS, vN, vM  (if D = S)
 
12848
-;;   bit vD, vN, vS  (if D = M, so 1-bits in vS choose bits from vN, else vM)
 
12849
-;;   bif vD, vM, vS  (if D = N, so 0-bits in vS choose bits from vM, else vN)
 
12850
+;;
 
12851
+;;   if (op0 = mask)
 
12852
+;;     bsl mask, op1, op2
 
12853
+;;   if (op0 = op1) (so 1-bits in mask choose bits from op2, else op0)
 
12854
+;;     bit op0, op2, mask
 
12855
+;;   if (op0 = op2) (so 0-bits in mask choose bits from op1, else op0)
 
12856
+;;     bif op0, op1, mask
 
12857
 
 
12858
 (define_insn "aarch64_simd_bsl<mode>_internal"
 
12859
   [(set (match_operand:VALL 0 "register_operand"               "=w,w,w")
 
12860
-       (unspec:VALL
 
12861
-        [(match_operand:<V_cmp_result> 1 "register_operand"    " 0,w,w")
 
12862
-         (match_operand:VALL 2 "register_operand"              " w,w,0")
 
12863
-         (match_operand:VALL 3 "register_operand"              " w,0,w")]
 
12864
-        UNSPEC_BSL))]
 
12865
+       (ior:VALL
 
12866
+          (and:VALL
 
12867
+            (match_operand:<V_cmp_result> 1 "register_operand" " 0,w,w")
 
12868
+            (match_operand:VALL 2 "register_operand"           " w,w,0"))
 
12869
+          (and:VALL
 
12870
+            (not:<V_cmp_result>
 
12871
+               (match_dup:<V_cmp_result> 1))
 
12872
+            (match_operand:VALL 3 "register_operand"           " w,0,w"))
 
12873
+       ))]
 
12874
   "TARGET_SIMD"
 
12875
   "@
 
12876
   bsl\\t%0.<Vbtype>, %2.<Vbtype>, %3.<Vbtype>
 
12877
@@ -1486,28 +1780,32 @@
 
12878
 )
 
12879
 
 
12880
 (define_expand "aarch64_simd_bsl<mode>"
 
12881
-  [(set (match_operand:VALL 0 "register_operand")
 
12882
-       (unspec:VALL [(match_operand:<V_cmp_result> 1 "register_operand")
 
12883
-                     (match_operand:VALL 2 "register_operand")
 
12884
-                     (match_operand:VALL 3 "register_operand")]
 
12885
-                    UNSPEC_BSL))]
 
12886
-  "TARGET_SIMD"
 
12887
+  [(match_operand:VALL 0 "register_operand")
 
12888
+   (match_operand:<V_cmp_result> 1 "register_operand")
 
12889
+   (match_operand:VALL 2 "register_operand")
 
12890
+   (match_operand:VALL 3 "register_operand")]
 
12891
+ "TARGET_SIMD"
 
12892
 {
 
12893
   /* We can't alias operands together if they have different modes.  */
 
12894
   operands[1] = gen_lowpart (<V_cmp_result>mode, operands[1]);
 
12895
+  emit_insn (gen_aarch64_simd_bsl<mode>_internal (operands[0], operands[1],
 
12896
+                                                 operands[2], operands[3]));
 
12897
+  DONE;
 
12898
 })
 
12899
 
 
12900
-(define_expand "aarch64_vcond_internal<mode>"
 
12901
+(define_expand "aarch64_vcond_internal<mode><mode>"
 
12902
   [(set (match_operand:VDQ 0 "register_operand")
 
12903
        (if_then_else:VDQ
 
12904
          (match_operator 3 "comparison_operator"
 
12905
            [(match_operand:VDQ 4 "register_operand")
 
12906
             (match_operand:VDQ 5 "nonmemory_operand")])
 
12907
-         (match_operand:VDQ 1 "register_operand")
 
12908
-         (match_operand:VDQ 2 "register_operand")))]
 
12909
+         (match_operand:VDQ 1 "nonmemory_operand")
 
12910
+         (match_operand:VDQ 2 "nonmemory_operand")))]
 
12911
   "TARGET_SIMD"
 
12912
 {
 
12913
   int inverse = 0, has_zero_imm_form = 0;
 
12914
+  rtx op1 = operands[1];
 
12915
+  rtx op2 = operands[2];
 
12916
   rtx mask = gen_reg_rtx (<MODE>mode);
 
12917
 
 
12918
   switch (GET_CODE (operands[3]))
 
12919
@@ -1548,12 +1846,12 @@
 
12920
 
 
12921
     case LTU:
 
12922
     case GEU:
 
12923
-      emit_insn (gen_aarch64_cmhs<mode> (mask, operands[4], operands[5]));
 
12924
+      emit_insn (gen_aarch64_cmgeu<mode> (mask, operands[4], operands[5]));
 
12925
       break;
 
12926
 
 
12927
     case LEU:
 
12928
     case GTU:
 
12929
-      emit_insn (gen_aarch64_cmhi<mode> (mask, operands[4], operands[5]));
 
12930
+      emit_insn (gen_aarch64_cmgtu<mode> (mask, operands[4], operands[5]));
 
12931
       break;
 
12932
 
 
12933
     case NE:
 
12934
@@ -1566,30 +1864,47 @@
 
12935
     }
 
12936
 
 
12937
   if (inverse)
 
12938
-    emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[2],
 
12939
-                                   operands[1]));
 
12940
-  else
 
12941
-    emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[1],
 
12942
-                                   operands[2]));
 
12943
+    {
 
12944
+      op1 = operands[2];
 
12945
+      op2 = operands[1];
 
12946
+    }
 
12947
 
 
12948
+    /* If we have (a = (b CMP c) ? -1 : 0);
 
12949
+       Then we can simply move the generated mask.  */
 
12950
+
 
12951
+    if (op1 == CONSTM1_RTX (<V_cmp_result>mode)
 
12952
+       && op2 == CONST0_RTX (<V_cmp_result>mode))
 
12953
+      emit_move_insn (operands[0], mask);
 
12954
+    else
 
12955
+      {
 
12956
+       if (!REG_P (op1))
 
12957
+         op1 = force_reg (<MODE>mode, op1);
 
12958
+       if (!REG_P (op2))
 
12959
+         op2 = force_reg (<MODE>mode, op2);
 
12960
+       emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask,
 
12961
+                                              op1, op2));
 
12962
+      }
 
12963
+
 
12964
   DONE;
 
12965
 })
 
12966
 
 
12967
-(define_expand "aarch64_vcond_internal<mode>"
 
12968
-  [(set (match_operand:VDQF 0 "register_operand")
 
12969
+(define_expand "aarch64_vcond_internal<VDQF_COND:mode><VDQF:mode>"
 
12970
+  [(set (match_operand:VDQF_COND 0 "register_operand")
 
12971
        (if_then_else:VDQF
 
12972
          (match_operator 3 "comparison_operator"
 
12973
            [(match_operand:VDQF 4 "register_operand")
 
12974
             (match_operand:VDQF 5 "nonmemory_operand")])
 
12975
-         (match_operand:VDQF 1 "register_operand")
 
12976
-         (match_operand:VDQF 2 "register_operand")))]
 
12977
+         (match_operand:VDQF_COND 1 "nonmemory_operand")
 
12978
+         (match_operand:VDQF_COND 2 "nonmemory_operand")))]
 
12979
   "TARGET_SIMD"
 
12980
 {
 
12981
   int inverse = 0;
 
12982
   int use_zero_form = 0;
 
12983
   int swap_bsl_operands = 0;
 
12984
-  rtx mask = gen_reg_rtx (<V_cmp_result>mode);
 
12985
-  rtx tmp = gen_reg_rtx (<V_cmp_result>mode);
 
12986
+  rtx op1 = operands[1];
 
12987
+  rtx op2 = operands[2];
 
12988
+  rtx mask = gen_reg_rtx (<VDQF_COND:V_cmp_result>mode);
 
12989
+  rtx tmp = gen_reg_rtx (<VDQF_COND:V_cmp_result>mode);
 
12990
 
 
12991
   rtx (*base_comparison) (rtx, rtx, rtx);
 
12992
   rtx (*complimentary_comparison) (rtx, rtx, rtx);
 
12993
@@ -1609,7 +1924,7 @@
 
12994
       /* Fall through.  */
 
12995
     default:
 
12996
       if (!REG_P (operands[5]))
 
12997
-       operands[5] = force_reg (<MODE>mode, operands[5]);
 
12998
+       operands[5] = force_reg (<VDQF:MODE>mode, operands[5]);
 
12999
     }
 
13000
 
 
13001
   switch (GET_CODE (operands[3]))
 
13002
@@ -1622,8 +1937,8 @@
 
13003
     case UNGE:
 
13004
     case ORDERED:
 
13005
     case UNORDERED:
 
13006
-      base_comparison = gen_aarch64_cmge<mode>;
 
13007
-      complimentary_comparison = gen_aarch64_cmgt<mode>;
 
13008
+      base_comparison = gen_aarch64_cmge<VDQF:mode>;
 
13009
+      complimentary_comparison = gen_aarch64_cmgt<VDQF:mode>;
 
13010
       break;
 
13011
     case LE:
 
13012
     case UNLE:
 
13013
@@ -1631,14 +1946,14 @@
 
13014
       /* Fall through.  */
 
13015
     case GT:
 
13016
     case UNGT:
 
13017
-      base_comparison = gen_aarch64_cmgt<mode>;
 
13018
-      complimentary_comparison = gen_aarch64_cmge<mode>;
 
13019
+      base_comparison = gen_aarch64_cmgt<VDQF:mode>;
 
13020
+      complimentary_comparison = gen_aarch64_cmge<VDQF:mode>;
 
13021
       break;
 
13022
     case EQ:
 
13023
     case NE:
 
13024
     case UNEQ:
 
13025
-      base_comparison = gen_aarch64_cmeq<mode>;
 
13026
-      complimentary_comparison = gen_aarch64_cmeq<mode>;
 
13027
+      base_comparison = gen_aarch64_cmeq<VDQF:mode>;
 
13028
+      complimentary_comparison = gen_aarch64_cmeq<VDQF:mode>;
 
13029
       break;
 
13030
     default:
 
13031
       gcc_unreachable ();
 
13032
@@ -1666,10 +1981,10 @@
 
13033
          switch (GET_CODE (operands[3]))
 
13034
            {
 
13035
            case LT:
 
13036
-             base_comparison = gen_aarch64_cmlt<mode>;
 
13037
+             base_comparison = gen_aarch64_cmlt<VDQF:mode>;
 
13038
              break;
 
13039
            case LE:
 
13040
-             base_comparison = gen_aarch64_cmle<mode>;
 
13041
+             base_comparison = gen_aarch64_cmle<VDQF:mode>;
 
13042
              break;
 
13043
            default:
 
13044
              /* Do nothing, other zero form cases already have the correct
 
13045
@@ -1712,9 +2027,9 @@
 
13046
         true iff !(a != b && a ORDERED b), swapping the operands to BSL
 
13047
         will then give us (a == b ||  a UNORDERED b) as intended.  */
 
13048
 
 
13049
-      emit_insn (gen_aarch64_cmgt<mode> (mask, operands[4], operands[5]));
 
13050
-      emit_insn (gen_aarch64_cmgt<mode> (tmp, operands[5], operands[4]));
 
13051
-      emit_insn (gen_ior<v_cmp_result>3 (mask, mask, tmp));
 
13052
+      emit_insn (gen_aarch64_cmgt<VDQF:mode> (mask, operands[4], operands[5]));
 
13053
+      emit_insn (gen_aarch64_cmgt<VDQF:mode> (tmp, operands[5], operands[4]));
 
13054
+      emit_insn (gen_ior<VDQF_COND:v_cmp_result>3 (mask, mask, tmp));
 
13055
       swap_bsl_operands = 1;
 
13056
       break;
 
13057
     case UNORDERED:
 
13058
@@ -1723,20 +2038,36 @@
 
13059
      swap_bsl_operands = 1;
 
13060
      /* Fall through.  */
 
13061
     case ORDERED:
 
13062
-      emit_insn (gen_aarch64_cmgt<mode> (tmp, operands[4], operands[5]));
 
13063
-      emit_insn (gen_aarch64_cmge<mode> (mask, operands[5], operands[4]));
 
13064
-      emit_insn (gen_ior<v_cmp_result>3 (mask, mask, tmp));
 
13065
+      emit_insn (gen_aarch64_cmgt<VDQF:mode> (tmp, operands[4], operands[5]));
 
13066
+      emit_insn (gen_aarch64_cmge<VDQF:mode> (mask, operands[5], operands[4]));
 
13067
+      emit_insn (gen_ior<VDQF_COND:v_cmp_result>3 (mask, mask, tmp));
 
13068
       break;
 
13069
     default:
 
13070
       gcc_unreachable ();
 
13071
     }
 
13072
 
 
13073
   if (swap_bsl_operands)
 
13074
-    emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[2],
 
13075
-                                   operands[1]));
 
13076
-  else
 
13077
-    emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[1],
 
13078
-                                   operands[2]));
 
13079
+    {
 
13080
+      op1 = operands[2];
 
13081
+      op2 = operands[1];
 
13082
+    }
 
13083
+
 
13084
+    /* If we have (a = (b CMP c) ? -1 : 0);
 
13085
+       Then we can simply move the generated mask.  */
 
13086
+
 
13087
+    if (op1 == CONSTM1_RTX (<VDQF_COND:V_cmp_result>mode)
 
13088
+       && op2 == CONST0_RTX (<VDQF_COND:V_cmp_result>mode))
 
13089
+      emit_move_insn (operands[0], mask);
 
13090
+    else
 
13091
+      {
 
13092
+       if (!REG_P (op1))
 
13093
+         op1 = force_reg (<VDQF_COND:MODE>mode, op1);
 
13094
+       if (!REG_P (op2))
 
13095
+         op2 = force_reg (<VDQF_COND:MODE>mode, op2);
 
13096
+       emit_insn (gen_aarch64_simd_bsl<VDQF_COND:mode> (operands[0], mask,
 
13097
+                                              op1, op2));
 
13098
+      }
 
13099
+
 
13100
   DONE;
 
13101
 })
 
13102
 
 
13103
@@ -1746,16 +2077,32 @@
 
13104
          (match_operator 3 "comparison_operator"
 
13105
            [(match_operand:VALL 4 "register_operand")
 
13106
             (match_operand:VALL 5 "nonmemory_operand")])
 
13107
-         (match_operand:VALL 1 "register_operand")
 
13108
-         (match_operand:VALL 2 "register_operand")))]
 
13109
+         (match_operand:VALL 1 "nonmemory_operand")
 
13110
+         (match_operand:VALL 2 "nonmemory_operand")))]
 
13111
   "TARGET_SIMD"
 
13112
 {
 
13113
-  emit_insn (gen_aarch64_vcond_internal<mode> (operands[0], operands[1],
 
13114
+  emit_insn (gen_aarch64_vcond_internal<mode><mode> (operands[0], operands[1],
 
13115
                                               operands[2], operands[3],
 
13116
                                               operands[4], operands[5]));
 
13117
   DONE;
 
13118
 })
 
13119
 
 
13120
+(define_expand "vcond<v_cmp_result><mode>"
 
13121
+  [(set (match_operand:<V_cmp_result> 0 "register_operand")
 
13122
+       (if_then_else:<V_cmp_result>
 
13123
+         (match_operator 3 "comparison_operator"
 
13124
+           [(match_operand:VDQF 4 "register_operand")
 
13125
+            (match_operand:VDQF 5 "nonmemory_operand")])
 
13126
+         (match_operand:<V_cmp_result> 1 "nonmemory_operand")
 
13127
+         (match_operand:<V_cmp_result> 2 "nonmemory_operand")))]
 
13128
+  "TARGET_SIMD"
 
13129
+{
 
13130
+  emit_insn (gen_aarch64_vcond_internal<v_cmp_result><mode> (
 
13131
+                                               operands[0], operands[1],
 
13132
+                                               operands[2], operands[3],
 
13133
+                                               operands[4], operands[5]));
 
13134
+  DONE;
 
13135
+})
 
13136
 
 
13137
 (define_expand "vcondu<mode><mode>"
 
13138
   [(set (match_operand:VDQ 0 "register_operand")
 
13139
@@ -1763,11 +2110,11 @@
 
13140
          (match_operator 3 "comparison_operator"
 
13141
            [(match_operand:VDQ 4 "register_operand")
 
13142
             (match_operand:VDQ 5 "nonmemory_operand")])
 
13143
-         (match_operand:VDQ 1 "register_operand")
 
13144
-         (match_operand:VDQ 2 "register_operand")))]
 
13145
+         (match_operand:VDQ 1 "nonmemory_operand")
 
13146
+         (match_operand:VDQ 2 "nonmemory_operand")))]
 
13147
   "TARGET_SIMD"
 
13148
 {
 
13149
-  emit_insn (gen_aarch64_vcond_internal<mode> (operands[0], operands[1],
 
13150
+  emit_insn (gen_aarch64_vcond_internal<mode><mode> (operands[0], operands[1],
 
13151
                                               operands[2], operands[3],
 
13152
                                               operands[4], operands[5]));
 
13153
   DONE;
 
13154
@@ -1785,45 +2132,50 @@
 
13155
   DONE;
 
13156
 })
 
13157
 
 
13158
-(define_insn "aarch64_get_lane_signed<mode>"
 
13159
-  [(set (match_operand:<VEL> 0 "register_operand" "=r")
 
13160
-       (sign_extend:<VEL>
 
13161
+;; Lane extraction with sign extension to general purpose register.
 
13162
+(define_insn "*aarch64_get_lane_extend<GPI:mode><VDQQH:mode>"
 
13163
+  [(set (match_operand:GPI 0 "register_operand" "=r")
 
13164
+       (sign_extend:GPI
 
13165
          (vec_select:<VEL>
 
13166
-           (match_operand:VQ_S 1 "register_operand" "w")
 
13167
+           (match_operand:VDQQH 1 "register_operand" "w")
 
13168
            (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
 
13169
   "TARGET_SIMD"
 
13170
-  "smov\\t%0, %1.<Vetype>[%2]"
 
13171
+  "smov\\t%<GPI:w>0, %1.<VDQQH:Vetype>[%2]"
 
13172
   [(set_attr "simd_type" "simd_movgp")
 
13173
-   (set_attr "simd_mode" "<MODE>")]
 
13174
+   (set_attr "simd_mode" "<VDQQH:MODE>")]
 
13175
 )
 
13176
 
 
13177
-(define_insn "aarch64_get_lane_unsigned<mode>"
 
13178
-  [(set (match_operand:<VEL> 0 "register_operand" "=r")
 
13179
-       (zero_extend:<VEL>
 
13180
+(define_insn "*aarch64_get_lane_zero_extendsi<mode>"
 
13181
+  [(set (match_operand:SI 0 "register_operand" "=r")
 
13182
+       (zero_extend:SI
 
13183
          (vec_select:<VEL>
 
13184
-           (match_operand:VDQ 1 "register_operand" "w")
 
13185
+           (match_operand:VDQQH 1 "register_operand" "w")
 
13186
            (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
 
13187
   "TARGET_SIMD"
 
13188
-  "umov\\t%<vw>0, %1.<Vetype>[%2]"
 
13189
+  "umov\\t%w0, %1.<Vetype>[%2]"
 
13190
   [(set_attr "simd_type" "simd_movgp")
 
13191
    (set_attr "simd_mode" "<MODE>")]
 
13192
 )
 
13193
 
 
13194
+;; Lane extraction of a value, neither sign nor zero extension
 
13195
+;; is guaranteed so upper bits should be considered undefined.
 
13196
 (define_insn "aarch64_get_lane<mode>"
 
13197
-  [(set (match_operand:<VEL> 0 "register_operand" "=w")
 
13198
+  [(set (match_operand:<VEL> 0 "register_operand" "=r, w")
 
13199
        (vec_select:<VEL>
 
13200
-           (match_operand:VDQF 1 "register_operand" "w")
 
13201
-           (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
 
13202
+         (match_operand:VALL 1 "register_operand" "w, w")
 
13203
+         (parallel [(match_operand:SI 2 "immediate_operand" "i, i")])))]
 
13204
   "TARGET_SIMD"
 
13205
-  "mov\\t%0.<Vetype>[0], %1.<Vetype>[%2]"
 
13206
-  [(set_attr "simd_type" "simd_ins")
 
13207
+  "@
 
13208
+   umov\\t%<vwcore>0, %1.<Vetype>[%2]
 
13209
+   dup\\t%<Vetype>0, %1.<Vetype>[%2]"
 
13210
+  [(set_attr "simd_type" "simd_movgp, simd_dup")
 
13211
    (set_attr "simd_mode" "<MODE>")]
 
13212
 )
 
13213
 
 
13214
 (define_expand "aarch64_get_lanedi"
 
13215
-  [(match_operand:DI 0 "register_operand" "=r")
 
13216
-   (match_operand:DI 1 "register_operand" "w")
 
13217
-   (match_operand:SI 2 "immediate_operand" "i")]
 
13218
+  [(match_operand:DI 0 "register_operand")
 
13219
+   (match_operand:DI 1 "register_operand")
 
13220
+   (match_operand:SI 2 "immediate_operand")]
 
13221
   "TARGET_SIMD"
 
13222
 {
 
13223
   aarch64_simd_lane_bounds (operands[2], 0, 1);
 
13224
@@ -1944,16 +2296,30 @@
 
13225
    (set_attr "simd_mode" "<MODE>")]
 
13226
 )
 
13227
 
 
13228
-(define_insn "aarch64_combine<mode>"
 
13229
+(define_insn_and_split "aarch64_combine<mode>"
 
13230
   [(set (match_operand:<VDBL> 0 "register_operand" "=&w")
 
13231
         (vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w")
 
13232
                           (match_operand:VDC 2 "register_operand" "w")))]
 
13233
   "TARGET_SIMD"
 
13234
-  "mov\\t%0.d[0], %1.d[0]\;ins\\t%0.d[1], %2.d[0]"
 
13235
-  [(set_attr "simd_type" "simd_ins")
 
13236
-   (set_attr "simd_mode" "<MODE>")]
 
13237
-)
 
13238
+  "#"
 
13239
+  "&& reload_completed"
 
13240
+  [(const_int 0)]
 
13241
+{
 
13242
+  aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
 
13243
+  DONE;
 
13244
+})
 
13245
 
 
13246
+(define_expand "aarch64_simd_combine<mode>"
 
13247
+  [(set (match_operand:<VDBL> 0 "register_operand" "=&w")
 
13248
+        (vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w")
 
13249
+  (match_operand:VDC 2 "register_operand" "w")))]
 
13250
+  "TARGET_SIMD"
 
13251
+  {
 
13252
+    emit_insn (gen_move_lo_quad_<Vdbl> (operands[0], operands[1]));
 
13253
+    emit_insn (gen_move_hi_quad_<Vdbl> (operands[0], operands[2]));
 
13254
+    DONE;
 
13255
+  })
 
13256
+
 
13257
 ;; <su><addsub>l<q>.
 
13258
 
 
13259
 (define_insn "aarch64_<ANY_EXTEND:su><ADDSUB:optab>l2<mode>_internal"
 
13260
@@ -2861,28 +3227,6 @@
 
13261
    (set_attr "simd_mode" "<MODE>")]
 
13262
 )
 
13263
 
 
13264
-;; vshl_n
 
13265
-
 
13266
-(define_expand "aarch64_sshl_n<mode>"
 
13267
-  [(match_operand:VSDQ_I_DI 0 "register_operand" "=w")
 
13268
-   (match_operand:VSDQ_I_DI 1 "register_operand" "w")
 
13269
-   (match_operand:SI 2 "immediate_operand" "i")]
 
13270
-  "TARGET_SIMD"
 
13271
-{
 
13272
-  emit_insn (gen_ashl<mode>3 (operands[0], operands[1], operands[2]));
 
13273
-  DONE;
 
13274
-})
 
13275
-
 
13276
-(define_expand "aarch64_ushl_n<mode>"
 
13277
-  [(match_operand:VSDQ_I_DI 0 "register_operand" "=w")
 
13278
-   (match_operand:VSDQ_I_DI 1 "register_operand" "w")
 
13279
-   (match_operand:SI 2 "immediate_operand" "i")]
 
13280
-  "TARGET_SIMD"
 
13281
-{
 
13282
-  emit_insn (gen_ashl<mode>3 (operands[0], operands[1], operands[2]));
 
13283
-  DONE;
 
13284
-})
 
13285
-
 
13286
 ;; vshll_n
 
13287
 
 
13288
 (define_insn "aarch64_<sur>shll_n<mode>"
 
13289
@@ -2927,28 +3271,6 @@
 
13290
    (set_attr "simd_mode" "<MODE>")]
 
13291
 )
 
13292
 
 
13293
-;; vshr_n
 
13294
-
 
13295
-(define_expand "aarch64_sshr_n<mode>"
 
13296
-  [(match_operand:VSDQ_I_DI 0 "register_operand" "=w")
 
13297
-   (match_operand:VSDQ_I_DI 1 "register_operand" "w")
 
13298
-   (match_operand:SI 2 "immediate_operand" "i")]
 
13299
-  "TARGET_SIMD"
 
13300
-{
 
13301
-  emit_insn (gen_ashr<mode>3 (operands[0], operands[1], operands[2]));
 
13302
-  DONE;
 
13303
-})
 
13304
-
 
13305
-(define_expand "aarch64_ushr_n<mode>"
 
13306
-  [(match_operand:VSDQ_I_DI 0 "register_operand" "=w")
 
13307
-   (match_operand:VSDQ_I_DI 1 "register_operand" "w")
 
13308
-   (match_operand:SI 2 "immediate_operand" "i")]
 
13309
-  "TARGET_SIMD"
 
13310
-{
 
13311
-  emit_insn (gen_lshr<mode>3 (operands[0], operands[1], operands[2]));
 
13312
-  DONE;
 
13313
-})
 
13314
-
 
13315
 ;; vrshr_n
 
13316
 
 
13317
 (define_insn "aarch64_<sur>shr_n<mode>"
 
13318
@@ -3034,52 +3356,180 @@
 
13319
 )
 
13320
 
 
13321
 
 
13322
-;; cm(eq|ge|le|lt|gt)
 
13323
+;; cm(eq|ge|gt|lt|le)
 
13324
+;; Note, we have constraints for Dz and Z as different expanders
 
13325
+;; have different ideas of what should be passed to this pattern.
 
13326
 
 
13327
-(define_insn "aarch64_cm<cmp><mode>"
 
13328
+(define_insn "aarch64_cm<optab><mode>"
 
13329
   [(set (match_operand:<V_cmp_result> 0 "register_operand" "=w,w")
 
13330
-        (unspec:<V_cmp_result>
 
13331
-         [(match_operand:VSDQ_I_DI 1 "register_operand" "w,w")
 
13332
-          (match_operand:VSDQ_I_DI 2 "aarch64_simd_reg_or_zero" "w,Z")]
 
13333
-          VCMP_S))]
 
13334
+       (neg:<V_cmp_result>
 
13335
+         (COMPARISONS:<V_cmp_result>
 
13336
+           (match_operand:VDQ 1 "register_operand" "w,w")
 
13337
+           (match_operand:VDQ 2 "aarch64_simd_reg_or_zero" "w,ZDz")
 
13338
+         )))]
 
13339
   "TARGET_SIMD"
 
13340
   "@
 
13341
-  cm<cmp>\t%<v>0<Vmtype>, %<v>1<Vmtype>, %<v>2<Vmtype>
 
13342
-  cm<cmp>\t%<v>0<Vmtype>, %<v>1<Vmtype>, #0"
 
13343
+  cm<n_optab>\t%<v>0<Vmtype>, %<v><cmp_1><Vmtype>, %<v><cmp_2><Vmtype>
 
13344
+  cm<optab>\t%<v>0<Vmtype>, %<v>1<Vmtype>, #0"
 
13345
   [(set_attr "simd_type" "simd_cmp")
 
13346
    (set_attr "simd_mode" "<MODE>")]
 
13347
 )
 
13348
 
 
13349
-;; cm(hs|hi|tst)
 
13350
+(define_insn_and_split "aarch64_cm<optab>di"
 
13351
+  [(set (match_operand:DI 0 "register_operand" "=w,w,r")
 
13352
+       (neg:DI
 
13353
+         (COMPARISONS:DI
 
13354
+           (match_operand:DI 1 "register_operand" "w,w,r")
 
13355
+           (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,ZDz,r")
 
13356
+         )))
 
13357
+     (clobber (reg:CC CC_REGNUM))]
 
13358
+  "TARGET_SIMD"
 
13359
+  "@
 
13360
+  cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
 
13361
+  cm<optab>\t%d0, %d1, #0
 
13362
+  #"
 
13363
+  "reload_completed
 
13364
+   /* We need to prevent the split from
 
13365
+      happening in the 'w' constraint cases.  */
 
13366
+   && GP_REGNUM_P (REGNO (operands[0]))
 
13367
+   && GP_REGNUM_P (REGNO (operands[1]))"
 
13368
+  [(const_int 0)]
 
13369
+  {
 
13370
+    enum machine_mode mode = SELECT_CC_MODE (<CMP>, operands[1], operands[2]);
 
13371
+    rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]);
 
13372
+    rtx comparison = gen_rtx_<CMP> (mode, operands[1], operands[2]);
 
13373
+    emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg));
 
13374
+    DONE;
 
13375
+  }
 
13376
+  [(set_attr "simd_type" "simd_cmp")
 
13377
+   (set_attr "simd_mode" "DI")]
 
13378
+)
 
13379
 
 
13380
-(define_insn "aarch64_cm<cmp><mode>"
 
13381
+;; cm(hs|hi)
 
13382
+
 
13383
+(define_insn "aarch64_cm<optab><mode>"
 
13384
   [(set (match_operand:<V_cmp_result> 0 "register_operand" "=w")
 
13385
-        (unspec:<V_cmp_result>
 
13386
-         [(match_operand:VSDQ_I_DI 1 "register_operand" "w")
 
13387
-          (match_operand:VSDQ_I_DI 2 "register_operand" "w")]
 
13388
-          VCMP_U))]
 
13389
+       (neg:<V_cmp_result>
 
13390
+         (UCOMPARISONS:<V_cmp_result>
 
13391
+           (match_operand:VDQ 1 "register_operand" "w")
 
13392
+           (match_operand:VDQ 2 "register_operand" "w")
 
13393
+         )))]
 
13394
   "TARGET_SIMD"
 
13395
-  "cm<cmp>\t%<v>0<Vmtype>, %<v>1<Vmtype>, %<v>2<Vmtype>"
 
13396
+  "cm<n_optab>\t%<v>0<Vmtype>, %<v><cmp_1><Vmtype>, %<v><cmp_2><Vmtype>"
 
13397
   [(set_attr "simd_type" "simd_cmp")
 
13398
    (set_attr "simd_mode" "<MODE>")]
 
13399
 )
 
13400
 
 
13401
-;; fcm(eq|ge|le|lt|gt)
 
13402
+(define_insn_and_split "aarch64_cm<optab>di"
 
13403
+  [(set (match_operand:DI 0 "register_operand" "=w,r")
 
13404
+       (neg:DI
 
13405
+         (UCOMPARISONS:DI
 
13406
+           (match_operand:DI 1 "register_operand" "w,r")
 
13407
+           (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,r")
 
13408
+         )))
 
13409
+    (clobber (reg:CC CC_REGNUM))]
 
13410
+  "TARGET_SIMD"
 
13411
+  "@
 
13412
+  cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
 
13413
+  #"
 
13414
+  "reload_completed
 
13415
+   /* We need to prevent the split from
 
13416
+      happening in the 'w' constraint cases.  */
 
13417
+   && GP_REGNUM_P (REGNO (operands[0]))
 
13418
+   && GP_REGNUM_P (REGNO (operands[1]))"
 
13419
+  [(const_int 0)]
 
13420
+  {
 
13421
+    enum machine_mode mode = CCmode;
 
13422
+    rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]);
 
13423
+    rtx comparison = gen_rtx_<CMP> (mode, operands[1], operands[2]);
 
13424
+    emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg));
 
13425
+    DONE;
 
13426
+  }
 
13427
+  [(set_attr "simd_type" "simd_cmp")
 
13428
+   (set_attr "simd_mode" "DI")]
 
13429
+)
 
13430
 
 
13431
-(define_insn "aarch64_cm<cmp><mode>"
 
13432
+;; cmtst
 
13433
+
 
13434
+(define_insn "aarch64_cmtst<mode>"
 
13435
+  [(set (match_operand:<V_cmp_result> 0 "register_operand" "=w")
 
13436
+       (neg:<V_cmp_result>
 
13437
+         (ne:<V_cmp_result>
 
13438
+           (and:VDQ
 
13439
+             (match_operand:VDQ 1 "register_operand" "w")
 
13440
+             (match_operand:VDQ 2 "register_operand" "w"))
 
13441
+           (vec_duplicate:<V_cmp_result> (const_int 0)))))]
 
13442
+  "TARGET_SIMD"
 
13443
+  "cmtst\t%<v>0<Vmtype>, %<v>1<Vmtype>, %<v>2<Vmtype>"
 
13444
+  [(set_attr "simd_type" "simd_cmp")
 
13445
+   (set_attr "simd_mode" "<MODE>")]
 
13446
+)
 
13447
+
 
13448
+(define_insn_and_split "aarch64_cmtstdi"
 
13449
+  [(set (match_operand:DI 0 "register_operand" "=w,r")
 
13450
+       (neg:DI
 
13451
+         (ne:DI
 
13452
+           (and:DI
 
13453
+             (match_operand:DI 1 "register_operand" "w,r")
 
13454
+             (match_operand:DI 2 "register_operand" "w,r"))
 
13455
+           (const_int 0))))
 
13456
+    (clobber (reg:CC CC_REGNUM))]
 
13457
+  "TARGET_SIMD"
 
13458
+  "@
 
13459
+  cmtst\t%d0, %d1, %d2
 
13460
+  #"
 
13461
+  "reload_completed
 
13462
+   /* We need to prevent the split from
 
13463
+      happening in the 'w' constraint cases.  */
 
13464
+   && GP_REGNUM_P (REGNO (operands[0]))
 
13465
+   && GP_REGNUM_P (REGNO (operands[1]))"
 
13466
+  [(const_int 0)]
 
13467
+  {
 
13468
+    rtx and_tree = gen_rtx_AND (DImode, operands[1], operands[2]);
 
13469
+    enum machine_mode mode = SELECT_CC_MODE (NE, and_tree, const0_rtx);
 
13470
+    rtx cc_reg = aarch64_gen_compare_reg (NE, and_tree, const0_rtx);
 
13471
+    rtx comparison = gen_rtx_NE (mode, and_tree, const0_rtx);
 
13472
+    emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg));
 
13473
+    DONE;
 
13474
+  }
 
13475
+  [(set_attr "simd_type" "simd_cmp")
 
13476
+   (set_attr "simd_mode" "DI")]
 
13477
+)
 
13478
+
 
13479
+;; fcm(eq|ge|gt|le|lt)
 
13480
+
 
13481
+(define_insn "aarch64_cm<optab><mode>"
 
13482
   [(set (match_operand:<V_cmp_result> 0 "register_operand" "=w,w")
 
13483
-       (unspec:<V_cmp_result>
 
13484
-         [(match_operand:VDQF 1 "register_operand" "w,w")
 
13485
-          (match_operand:VDQF 2 "aarch64_simd_reg_or_zero" "w,Dz")]
 
13486
-          VCMP_S))]
 
13487
+       (neg:<V_cmp_result>
 
13488
+         (COMPARISONS:<V_cmp_result>
 
13489
+           (match_operand:VALLF 1 "register_operand" "w,w")
 
13490
+           (match_operand:VALLF 2 "aarch64_simd_reg_or_zero" "w,YDz")
 
13491
+         )))]
 
13492
   "TARGET_SIMD"
 
13493
   "@
 
13494
-  fcm<cmp>\t%<v>0<Vmtype>, %<v>1<Vmtype>, %<v>2<Vmtype>
 
13495
-  fcm<cmp>\t%<v>0<Vmtype>, %<v>1<Vmtype>, 0"
 
13496
+  fcm<n_optab>\t%<v>0<Vmtype>, %<v><cmp_1><Vmtype>, %<v><cmp_2><Vmtype>
 
13497
+  fcm<optab>\t%<v>0<Vmtype>, %<v>1<Vmtype>, 0"
 
13498
   [(set_attr "simd_type" "simd_fcmp")
 
13499
    (set_attr "simd_mode" "<MODE>")]
 
13500
 )
 
13501
 
 
13502
+;; fac(ge|gt)
 
13503
+;; Note we can also handle what would be fac(le|lt) by
 
13504
+;; generating fac(ge|gt).
 
13505
+
 
13506
+(define_insn "*aarch64_fac<optab><mode>"
 
13507
+  [(set (match_operand:<V_cmp_result> 0 "register_operand" "=w")
 
13508
+       (neg:<V_cmp_result>
 
13509
+         (FAC_COMPARISONS:<V_cmp_result>
 
13510
+           (abs:VALLF (match_operand:VALLF 1 "register_operand" "w"))
 
13511
+           (abs:VALLF (match_operand:VALLF 2 "register_operand" "w"))
 
13512
+  )))]
 
13513
+  "TARGET_SIMD"
 
13514
+  "fac<n_optab>\t%<v>0<Vmtype>, %<v><cmp_1><Vmtype>, %<v><cmp_2><Vmtype>"
 
13515
+  [(set_attr "simd_type" "simd_fcmp")
 
13516
+   (set_attr "simd_mode" "<MODE>")]
 
13517
+)
 
13518
+
 
13519
 ;; addp
 
13520
 
 
13521
 (define_insn "aarch64_addp<mode>"
 
13522
@@ -3105,30 +3555,6 @@
 
13523
    (set_attr "simd_mode" "DI")]
 
13524
 )
 
13525
 
 
13526
-;; v(max|min)
 
13527
-
 
13528
-(define_expand "aarch64_<maxmin><mode>"
 
13529
- [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
 
13530
-       (MAXMIN:VDQ_BHSI (match_operand:VDQ_BHSI 1 "register_operand" "w")
 
13531
-                       (match_operand:VDQ_BHSI 2 "register_operand" "w")))]
 
13532
- "TARGET_SIMD"
 
13533
-{
 
13534
-  emit_insn (gen_<maxmin><mode>3 (operands[0], operands[1], operands[2]));
 
13535
-  DONE;
 
13536
-})
 
13537
-
 
13538
-
 
13539
-(define_insn "aarch64_<fmaxmin><mode>"
 
13540
-  [(set (match_operand:VDQF 0 "register_operand" "=w")
 
13541
-        (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")
 
13542
-                     (match_operand:VDQF 2 "register_operand" "w")]
 
13543
-                     FMAXMIN))]
 
13544
-  "TARGET_SIMD"
 
13545
-  "<fmaxmin>\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
13546
-  [(set_attr "simd_type" "simd_fminmax")
 
13547
-   (set_attr "simd_mode" "<MODE>")]
 
13548
-)
 
13549
-
 
13550
 ;; sqrt
 
13551
 
 
13552
 (define_insn "sqrt<mode>2"
 
13553
@@ -3140,16 +3566,6 @@
 
13554
    (set_attr "simd_mode" "<MODE>")]
 
13555
 )
 
13556
 
 
13557
-(define_expand "aarch64_sqrt<mode>"
 
13558
-  [(match_operand:VDQF 0 "register_operand" "=w")
 
13559
-   (match_operand:VDQF 1 "register_operand" "w")]
 
13560
-  "TARGET_SIMD"
 
13561
-{
 
13562
-  emit_insn (gen_sqrt<mode>2 (operands[0], operands[1]));
 
13563
-  DONE;
 
13564
-})
 
13565
-
 
13566
-
 
13567
 ;; Patterns for vector struct loads and stores.
 
13568
 
 
13569
 (define_insn "vec_load_lanesoi<mode>"
 
13570
@@ -3736,3 +4152,25 @@
 
13571
   "ld1r\\t{%0.<Vtype>}, %1"
 
13572
   [(set_attr "simd_type" "simd_load1r")
 
13573
    (set_attr "simd_mode" "<MODE>")])
 
13574
+
 
13575
+(define_insn "aarch64_frecpe<mode>"
 
13576
+  [(set (match_operand:VDQF 0 "register_operand" "=w")
 
13577
+       (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")]
 
13578
+                   UNSPEC_FRECPE))]
 
13579
+  "TARGET_SIMD"
 
13580
+  "frecpe\\t%0.<Vtype>, %1.<Vtype>"
 
13581
+  [(set_attr "simd_type" "simd_frecpe")
 
13582
+   (set_attr "simd_mode" "<MODE>")]
 
13583
+)
 
13584
+
 
13585
+(define_insn "aarch64_frecps<mode>"
 
13586
+  [(set (match_operand:VDQF 0 "register_operand" "=w")
 
13587
+       (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w")
 
13588
+                    (match_operand:VDQF 2 "register_operand" "w")]
 
13589
+                   UNSPEC_FRECPS))]
 
13590
+  "TARGET_SIMD"
 
13591
+  "frecps\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
 
13592
+  [(set_attr "simd_type" "simd_frecps")
 
13593
+   (set_attr "simd_mode" "<MODE>")]
 
13594
+)
 
13595
+
 
13596
--- a/src/gcc/config/aarch64/predicates.md
 
13597
+++ b/src/gcc/config/aarch64/predicates.md
 
13598
@@ -31,6 +31,11 @@
 
13599
        (ior (match_operand 0 "register_operand")
 
13600
            (match_test "op == const0_rtx"))))
 
13601
 
 
13602
+(define_predicate "aarch64_reg_or_fp_zero"
 
13603
+  (and (match_code "reg,subreg,const_double")
 
13604
+       (ior (match_operand 0 "register_operand")
 
13605
+           (match_test "aarch64_float_const_zero_rtx_p (op)"))))
 
13606
+
 
13607
 (define_predicate "aarch64_reg_zero_or_m1_or_1"
 
13608
   (and (match_code "reg,subreg,const_int")
 
13609
        (ior (match_operand 0 "register_operand")
 
13610
@@ -110,16 +115,11 @@
 
13611
        (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), PARALLEL,
 
13612
                                               0)")))
 
13613
 
 
13614
-(define_predicate "aarch64_const_address"
 
13615
-  (and (match_code "symbol_ref")
 
13616
-       (match_test "mode == DImode && CONSTANT_ADDRESS_P (op)")))
 
13617
-
 
13618
 (define_predicate "aarch64_valid_symref"
 
13619
   (match_code "const, symbol_ref, label_ref")
 
13620
 {
 
13621
-  enum aarch64_symbol_type symbol_type;
 
13622
-  return (aarch64_symbolic_constant_p (op, SYMBOL_CONTEXT_ADR, &symbol_type)
 
13623
-        && symbol_type != SYMBOL_FORCE_TO_MEM);
 
13624
+  return (aarch64_classify_symbolic_expression (op, SYMBOL_CONTEXT_ADR)
 
13625
+         != SYMBOL_FORCE_TO_MEM);
 
13626
 })
 
13627
 
 
13628
 (define_predicate "aarch64_tls_ie_symref"
 
13629
@@ -165,15 +165,10 @@
 
13630
 })
 
13631
 
 
13632
 (define_predicate "aarch64_mov_operand"
 
13633
-  (and (match_code "reg,subreg,mem,const_int,symbol_ref,high")
 
13634
+  (and (match_code "reg,subreg,mem,const,const_int,symbol_ref,label_ref,high")
 
13635
        (ior (match_operand 0 "register_operand")
 
13636
            (ior (match_operand 0 "memory_operand")
 
13637
-                (ior (match_test "GET_CODE (op) == HIGH
 
13638
-                                  && aarch64_valid_symref (XEXP (op, 0),
 
13639
-                                                           GET_MODE (XEXP (op, 0)))")
 
13640
-                     (ior (match_test "CONST_INT_P (op)
 
13641
-                                       && aarch64_move_imm (INTVAL (op), mode)")
 
13642
-                          (match_test "aarch64_const_address (op, mode)")))))))
 
13643
+                (match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)")))))
 
13644
 
 
13645
 (define_predicate "aarch64_movti_operand"
 
13646
   (and (match_code "reg,subreg,mem,const_int")
 
13647
--- a/src/gcc/config/aarch64/aarch64-elf.h
 
13648
+++ b/src/gcc/config/aarch64/aarch64-elf.h
 
13649
@@ -106,7 +106,6 @@
 
13650
 
 
13651
 #define ASM_COMMENT_START "//"
 
13652
 
 
13653
-#define REGISTER_PREFIX                ""
 
13654
 #define LOCAL_LABEL_PREFIX     "."
 
13655
 #define USER_LABEL_PREFIX      ""
 
13656
 
 
13657
--- a/src/gcc/config/aarch64/arm_neon.h
 
13658
+++ b/src/gcc/config/aarch64/arm_neon.h
 
13659
@@ -29,6 +29,9 @@
 
13660
 
 
13661
 #include <stdint.h>
 
13662
 
 
13663
+#define __AARCH64_UINT64_C(__C) ((uint64_t) __C)
 
13664
+#define __AARCH64_INT64_C(__C) ((int64_t) __C)
 
13665
+
 
13666
 typedef __builtin_aarch64_simd_qi int8x8_t
 
13667
   __attribute__ ((__vector_size__ (8)));
 
13668
 typedef __builtin_aarch64_simd_hi int16x4_t
 
13669
@@ -446,7 +449,66 @@
 
13670
   poly16x8_t val[4];
 
13671
 } poly16x8x4_t;
 
13672
 
 
13673
+/* vget_lane internal macros.  */
 
13674
 
 
13675
+#define __aarch64_vget_lane_any(__size, __cast_ret, __cast_a, __a, __b) \
 
13676
+  (__cast_ret                                                          \
 
13677
+     __builtin_aarch64_get_lane##__size (__cast_a __a, __b))
 
13678
+
 
13679
+#define __aarch64_vget_lane_f32(__a, __b) \
 
13680
+  __aarch64_vget_lane_any (v2sf, , , __a, __b)
 
13681
+#define __aarch64_vget_lane_f64(__a, __b) (__a)
 
13682
+
 
13683
+#define __aarch64_vget_lane_p8(__a, __b) \
 
13684
+  __aarch64_vget_lane_any (v8qi, (poly8_t), (int8x8_t), __a, __b)
 
13685
+#define __aarch64_vget_lane_p16(__a, __b) \
 
13686
+  __aarch64_vget_lane_any (v4hi, (poly16_t), (int16x4_t), __a, __b)
 
13687
+
 
13688
+#define __aarch64_vget_lane_s8(__a, __b) \
 
13689
+  __aarch64_vget_lane_any (v8qi, , ,__a, __b)
 
13690
+#define __aarch64_vget_lane_s16(__a, __b) \
 
13691
+  __aarch64_vget_lane_any (v4hi, , ,__a, __b)
 
13692
+#define __aarch64_vget_lane_s32(__a, __b) \
 
13693
+  __aarch64_vget_lane_any (v2si, , ,__a, __b)
 
13694
+#define __aarch64_vget_lane_s64(__a, __b) (__a)
 
13695
+
 
13696
+#define __aarch64_vget_lane_u8(__a, __b) \
 
13697
+  __aarch64_vget_lane_any (v8qi, (uint8_t), (int8x8_t), __a, __b)
 
13698
+#define __aarch64_vget_lane_u16(__a, __b) \
 
13699
+  __aarch64_vget_lane_any (v4hi, (uint16_t), (int16x4_t), __a, __b)
 
13700
+#define __aarch64_vget_lane_u32(__a, __b) \
 
13701
+  __aarch64_vget_lane_any (v2si, (uint32_t), (int32x2_t), __a, __b)
 
13702
+#define __aarch64_vget_lane_u64(__a, __b) (__a)
 
13703
+
 
13704
+#define __aarch64_vgetq_lane_f32(__a, __b) \
 
13705
+  __aarch64_vget_lane_any (v4sf, , , __a, __b)
 
13706
+#define __aarch64_vgetq_lane_f64(__a, __b) \
 
13707
+  __aarch64_vget_lane_any (v2df, , , __a, __b)
 
13708
+
 
13709
+#define __aarch64_vgetq_lane_p8(__a, __b) \
 
13710
+  __aarch64_vget_lane_any (v16qi, (poly8_t), (int8x16_t), __a, __b)
 
13711
+#define __aarch64_vgetq_lane_p16(__a, __b) \
 
13712
+  __aarch64_vget_lane_any (v8hi, (poly16_t), (int16x8_t), __a, __b)
 
13713
+
 
13714
+#define __aarch64_vgetq_lane_s8(__a, __b) \
 
13715
+  __aarch64_vget_lane_any (v16qi, , ,__a, __b)
 
13716
+#define __aarch64_vgetq_lane_s16(__a, __b) \
 
13717
+  __aarch64_vget_lane_any (v8hi, , ,__a, __b)
 
13718
+#define __aarch64_vgetq_lane_s32(__a, __b) \
 
13719
+  __aarch64_vget_lane_any (v4si, , ,__a, __b)
 
13720
+#define __aarch64_vgetq_lane_s64(__a, __b) \
 
13721
+  __aarch64_vget_lane_any (v2di, , ,__a, __b)
 
13722
+
 
13723
+#define __aarch64_vgetq_lane_u8(__a, __b) \
 
13724
+  __aarch64_vget_lane_any (v16qi, (uint8_t), (int8x16_t), __a, __b)
 
13725
+#define __aarch64_vgetq_lane_u16(__a, __b) \
 
13726
+  __aarch64_vget_lane_any (v8hi, (uint16_t), (int16x8_t), __a, __b)
 
13727
+#define __aarch64_vgetq_lane_u32(__a, __b) \
 
13728
+  __aarch64_vget_lane_any (v4si, (uint32_t), (int32x4_t), __a, __b)
 
13729
+#define __aarch64_vgetq_lane_u64(__a, __b) \
 
13730
+  __aarch64_vget_lane_any (v2di, (uint64_t), (int64x2_t), __a, __b)
 
13731
+
 
13732
+/* vadd  */
 
13733
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
13734
 vadd_s8 (int8x8_t __a, int8x8_t __b)
 
13735
 {
 
13736
@@ -2307,155 +2369,156 @@
 
13737
   return (poly16x4_t) __a;
 
13738
 }
 
13739
 
 
13740
+/* vget_lane  */
 
13741
+
 
13742
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
13743
+vget_lane_f32 (float32x2_t __a, const int __b)
 
13744
+{
 
13745
+  return __aarch64_vget_lane_f32 (__a, __b);
 
13746
+}
 
13747
+
 
13748
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
13749
+vget_lane_f64 (float64x1_t __a, const int __b)
 
13750
+{
 
13751
+  return __aarch64_vget_lane_f64 (__a, __b);
 
13752
+}
 
13753
+
 
13754
+__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
 
13755
+vget_lane_p8 (poly8x8_t __a, const int __b)
 
13756
+{
 
13757
+  return __aarch64_vget_lane_p8 (__a, __b);
 
13758
+}
 
13759
+
 
13760
+__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
 
13761
+vget_lane_p16 (poly16x4_t __a, const int __b)
 
13762
+{
 
13763
+  return __aarch64_vget_lane_p16 (__a, __b);
 
13764
+}
 
13765
+
 
13766
 __extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
13767
 vget_lane_s8 (int8x8_t __a, const int __b)
 
13768
 {
 
13769
-  return (int8_t) __builtin_aarch64_get_lane_signedv8qi (__a, __b);
 
13770
+  return __aarch64_vget_lane_s8 (__a, __b);
 
13771
 }
 
13772
 
 
13773
 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
13774
 vget_lane_s16 (int16x4_t __a, const int __b)
 
13775
 {
 
13776
-  return (int16_t) __builtin_aarch64_get_lane_signedv4hi (__a, __b);
 
13777
+  return __aarch64_vget_lane_s16 (__a, __b);
 
13778
 }
 
13779
 
 
13780
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
13781
 vget_lane_s32 (int32x2_t __a, const int __b)
 
13782
 {
 
13783
-  return (int32_t) __builtin_aarch64_get_lane_signedv2si (__a, __b);
 
13784
+  return __aarch64_vget_lane_s32 (__a, __b);
 
13785
 }
 
13786
 
 
13787
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
13788
-vget_lane_f32 (float32x2_t __a, const int __b)
 
13789
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
13790
+vget_lane_s64 (int64x1_t __a, const int __b)
 
13791
 {
 
13792
-  return (float32_t) __builtin_aarch64_get_lanev2sf (__a, __b);
 
13793
+  return __aarch64_vget_lane_s64 (__a, __b);
 
13794
 }
 
13795
 
 
13796
 __extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
13797
 vget_lane_u8 (uint8x8_t __a, const int __b)
 
13798
 {
 
13799
-  return (uint8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a,
 
13800
-                                                           __b);
 
13801
+  return __aarch64_vget_lane_u8 (__a, __b);
 
13802
 }
 
13803
 
 
13804
 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
13805
 vget_lane_u16 (uint16x4_t __a, const int __b)
 
13806
 {
 
13807
-  return (uint16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a,
 
13808
-                                                            __b);
 
13809
+  return __aarch64_vget_lane_u16 (__a, __b);
 
13810
 }
 
13811
 
 
13812
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
13813
 vget_lane_u32 (uint32x2_t __a, const int __b)
 
13814
 {
 
13815
-  return (uint32_t) __builtin_aarch64_get_lane_unsignedv2si ((int32x2_t) __a,
 
13816
-                                                            __b);
 
13817
+  return __aarch64_vget_lane_u32 (__a, __b);
 
13818
 }
 
13819
 
 
13820
-__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
 
13821
-vget_lane_p8 (poly8x8_t __a, const int __b)
 
13822
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
13823
+vget_lane_u64 (uint64x1_t __a, const int __b)
 
13824
 {
 
13825
-  return (poly8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a,
 
13826
-                                                           __b);
 
13827
+  return __aarch64_vget_lane_u64 (__a, __b);
 
13828
 }
 
13829
 
 
13830
-__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
 
13831
-vget_lane_p16 (poly16x4_t __a, const int __b)
 
13832
+/* vgetq_lane  */
 
13833
+
 
13834
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
13835
+vgetq_lane_f32 (float32x4_t __a, const int __b)
 
13836
 {
 
13837
-  return (poly16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a,
 
13838
-                                                            __b);
 
13839
+  return __aarch64_vgetq_lane_f32 (__a, __b);
 
13840
 }
 
13841
 
 
13842
-__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
13843
-vget_lane_s64 (int64x1_t __a, const int __b)
 
13844
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
13845
+vgetq_lane_f64 (float64x2_t __a, const int __b)
 
13846
 {
 
13847
-  return (int64_t) __builtin_aarch64_get_lanedi (__a, __b);
 
13848
+  return __aarch64_vgetq_lane_f64 (__a, __b);
 
13849
 }
 
13850
 
 
13851
-__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
13852
-vget_lane_u64 (uint64x1_t __a, const int __b)
 
13853
+__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
 
13854
+vgetq_lane_p8 (poly8x16_t __a, const int __b)
 
13855
 {
 
13856
-  return (uint64_t) __builtin_aarch64_get_lanedi ((int64x1_t) __a, __b);
 
13857
+  return __aarch64_vgetq_lane_p8 (__a, __b);
 
13858
 }
 
13859
 
 
13860
+__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
 
13861
+vgetq_lane_p16 (poly16x8_t __a, const int __b)
 
13862
+{
 
13863
+  return __aarch64_vgetq_lane_p16 (__a, __b);
 
13864
+}
 
13865
+
 
13866
 __extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
13867
 vgetq_lane_s8 (int8x16_t __a, const int __b)
 
13868
 {
 
13869
-  return (int8_t) __builtin_aarch64_get_lane_signedv16qi (__a, __b);
 
13870
+  return __aarch64_vgetq_lane_s8 (__a, __b);
 
13871
 }
 
13872
 
 
13873
 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
13874
 vgetq_lane_s16 (int16x8_t __a, const int __b)
 
13875
 {
 
13876
-  return (int16_t) __builtin_aarch64_get_lane_signedv8hi (__a, __b);
 
13877
+  return __aarch64_vgetq_lane_s16 (__a, __b);
 
13878
 }
 
13879
 
 
13880
 __extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
13881
 vgetq_lane_s32 (int32x4_t __a, const int __b)
 
13882
 {
 
13883
-  return (int32_t) __builtin_aarch64_get_lane_signedv4si (__a, __b);
 
13884
+  return __aarch64_vgetq_lane_s32 (__a, __b);
 
13885
 }
 
13886
 
 
13887
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
13888
-vgetq_lane_f32 (float32x4_t __a, const int __b)
 
13889
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
13890
+vgetq_lane_s64 (int64x2_t __a, const int __b)
 
13891
 {
 
13892
-  return (float32_t) __builtin_aarch64_get_lanev4sf (__a, __b);
 
13893
+  return __aarch64_vgetq_lane_s64 (__a, __b);
 
13894
 }
 
13895
 
 
13896
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
13897
-vgetq_lane_f64 (float64x2_t __a, const int __b)
 
13898
-{
 
13899
-  return (float64_t) __builtin_aarch64_get_lanev2df (__a, __b);
 
13900
-}
 
13901
-
 
13902
 __extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
13903
 vgetq_lane_u8 (uint8x16_t __a, const int __b)
 
13904
 {
 
13905
-  return (uint8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a,
 
13906
-                                                            __b);
 
13907
+  return __aarch64_vgetq_lane_u8 (__a, __b);
 
13908
 }
 
13909
 
 
13910
 __extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
13911
 vgetq_lane_u16 (uint16x8_t __a, const int __b)
 
13912
 {
 
13913
-  return (uint16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a,
 
13914
-                                                            __b);
 
13915
+  return __aarch64_vgetq_lane_u16 (__a, __b);
 
13916
 }
 
13917
 
 
13918
 __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
13919
 vgetq_lane_u32 (uint32x4_t __a, const int __b)
 
13920
 {
 
13921
-  return (uint32_t) __builtin_aarch64_get_lane_unsignedv4si ((int32x4_t) __a,
 
13922
-                                                            __b);
 
13923
+  return __aarch64_vgetq_lane_u32 (__a, __b);
 
13924
 }
 
13925
 
 
13926
-__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
 
13927
-vgetq_lane_p8 (poly8x16_t __a, const int __b)
 
13928
-{
 
13929
-  return (poly8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a,
 
13930
-                                                            __b);
 
13931
-}
 
13932
-
 
13933
-__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
 
13934
-vgetq_lane_p16 (poly16x8_t __a, const int __b)
 
13935
-{
 
13936
-  return (poly16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a,
 
13937
-                                                            __b);
 
13938
-}
 
13939
-
 
13940
-__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
13941
-vgetq_lane_s64 (int64x2_t __a, const int __b)
 
13942
-{
 
13943
-  return __builtin_aarch64_get_lane_unsignedv2di (__a, __b);
 
13944
-}
 
13945
-
 
13946
 __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
13947
 vgetq_lane_u64 (uint64x2_t __a, const int __b)
 
13948
 {
 
13949
-  return (uint64_t) __builtin_aarch64_get_lane_unsignedv2di ((int64x2_t) __a,
 
13950
-                                                            __b);
 
13951
+  return __aarch64_vgetq_lane_u64 (__a, __b);
 
13952
 }
 
13953
 
 
13954
+/* vreinterpret  */
 
13955
+
 
13956
 __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
 
13957
 vreinterpret_p8_s8 (int8x8_t __a)
 
13958
 {
 
13959
@@ -3805,6 +3868,85 @@
 
13960
   return (uint32x4_t) __builtin_aarch64_reinterpretv4siv8hi ((int16x8_t) __a);
 
13961
 }
 
13962
 
 
13963
+#define __GET_LOW(__TYPE) \
 
13964
+  uint64x2_t tmp = vreinterpretq_u64_##__TYPE (__a);  \
 
13965
+  uint64_t lo = vgetq_lane_u64 (tmp, 0);  \
 
13966
+  return vreinterpret_##__TYPE##_u64 (lo);
 
13967
+
 
13968
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
13969
+vget_low_f32 (float32x4_t __a)
 
13970
+{
 
13971
+  __GET_LOW (f32);
 
13972
+}
 
13973
+
 
13974
+__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
 
13975
+vget_low_f64 (float64x2_t __a)
 
13976
+{
 
13977
+  return vgetq_lane_f64 (__a, 0);
 
13978
+}
 
13979
+
 
13980
+__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
 
13981
+vget_low_p8 (poly8x16_t __a)
 
13982
+{
 
13983
+  __GET_LOW (p8);
 
13984
+}
 
13985
+
 
13986
+__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
 
13987
+vget_low_p16 (poly16x8_t __a)
 
13988
+{
 
13989
+  __GET_LOW (p16);
 
13990
+}
 
13991
+
 
13992
+__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
13993
+vget_low_s8 (int8x16_t __a)
 
13994
+{
 
13995
+  __GET_LOW (s8);
 
13996
+}
 
13997
+
 
13998
+__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
13999
+vget_low_s16 (int16x8_t __a)
 
14000
+{
 
14001
+  __GET_LOW (s16);
 
14002
+}
 
14003
+
 
14004
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
14005
+vget_low_s32 (int32x4_t __a)
 
14006
+{
 
14007
+  __GET_LOW (s32);
 
14008
+}
 
14009
+
 
14010
+__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
14011
+vget_low_s64 (int64x2_t __a)
 
14012
+{
 
14013
+  return vgetq_lane_s64 (__a, 0);
 
14014
+}
 
14015
+
 
14016
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
14017
+vget_low_u8 (uint8x16_t __a)
 
14018
+{
 
14019
+  __GET_LOW (u8);
 
14020
+}
 
14021
+
 
14022
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
14023
+vget_low_u16 (uint16x8_t __a)
 
14024
+{
 
14025
+  __GET_LOW (u16);
 
14026
+}
 
14027
+
 
14028
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14029
+vget_low_u32 (uint32x4_t __a)
 
14030
+{
 
14031
+  __GET_LOW (u32);
 
14032
+}
 
14033
+
 
14034
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14035
+vget_low_u64 (uint64x2_t __a)
 
14036
+{
 
14037
+  return vgetq_lane_u64 (__a, 0);
 
14038
+}
 
14039
+
 
14040
+#undef __GET_LOW
 
14041
+
 
14042
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
14043
 vcombine_s8 (int8x8_t __a, int8x8_t __b)
 
14044
 {
 
14045
@@ -4468,160 +4610,6 @@
 
14046
   return result;
 
14047
 }
 
14048
 
 
14049
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
14050
-vabs_f32 (float32x2_t a)
 
14051
-{
 
14052
-  float32x2_t result;
 
14053
-  __asm__ ("fabs %0.2s,%1.2s"
 
14054
-           : "=w"(result)
 
14055
-           : "w"(a)
 
14056
-           : /* No clobbers */);
 
14057
-  return result;
 
14058
-}
 
14059
-
 
14060
-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
14061
-vabs_s8 (int8x8_t a)
 
14062
-{
 
14063
-  int8x8_t result;
 
14064
-  __asm__ ("abs %0.8b,%1.8b"
 
14065
-           : "=w"(result)
 
14066
-           : "w"(a)
 
14067
-           : /* No clobbers */);
 
14068
-  return result;
 
14069
-}
 
14070
-
 
14071
-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
14072
-vabs_s16 (int16x4_t a)
 
14073
-{
 
14074
-  int16x4_t result;
 
14075
-  __asm__ ("abs %0.4h,%1.4h"
 
14076
-           : "=w"(result)
 
14077
-           : "w"(a)
 
14078
-           : /* No clobbers */);
 
14079
-  return result;
 
14080
-}
 
14081
-
 
14082
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
14083
-vabs_s32 (int32x2_t a)
 
14084
-{
 
14085
-  int32x2_t result;
 
14086
-  __asm__ ("abs %0.2s,%1.2s"
 
14087
-           : "=w"(result)
 
14088
-           : "w"(a)
 
14089
-           : /* No clobbers */);
 
14090
-  return result;
 
14091
-}
 
14092
-
 
14093
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
14094
-vabsq_f32 (float32x4_t a)
 
14095
-{
 
14096
-  float32x4_t result;
 
14097
-  __asm__ ("fabs %0.4s,%1.4s"
 
14098
-           : "=w"(result)
 
14099
-           : "w"(a)
 
14100
-           : /* No clobbers */);
 
14101
-  return result;
 
14102
-}
 
14103
-
 
14104
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
14105
-vabsq_f64 (float64x2_t a)
 
14106
-{
 
14107
-  float64x2_t result;
 
14108
-  __asm__ ("fabs %0.2d,%1.2d"
 
14109
-           : "=w"(result)
 
14110
-           : "w"(a)
 
14111
-           : /* No clobbers */);
 
14112
-  return result;
 
14113
-}
 
14114
-
 
14115
-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
14116
-vabsq_s8 (int8x16_t a)
 
14117
-{
 
14118
-  int8x16_t result;
 
14119
-  __asm__ ("abs %0.16b,%1.16b"
 
14120
-           : "=w"(result)
 
14121
-           : "w"(a)
 
14122
-           : /* No clobbers */);
 
14123
-  return result;
 
14124
-}
 
14125
-
 
14126
-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
14127
-vabsq_s16 (int16x8_t a)
 
14128
-{
 
14129
-  int16x8_t result;
 
14130
-  __asm__ ("abs %0.8h,%1.8h"
 
14131
-           : "=w"(result)
 
14132
-           : "w"(a)
 
14133
-           : /* No clobbers */);
 
14134
-  return result;
 
14135
-}
 
14136
-
 
14137
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
14138
-vabsq_s32 (int32x4_t a)
 
14139
-{
 
14140
-  int32x4_t result;
 
14141
-  __asm__ ("abs %0.4s,%1.4s"
 
14142
-           : "=w"(result)
 
14143
-           : "w"(a)
 
14144
-           : /* No clobbers */);
 
14145
-  return result;
 
14146
-}
 
14147
-
 
14148
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
14149
-vabsq_s64 (int64x2_t a)
 
14150
-{
 
14151
-  int64x2_t result;
 
14152
-  __asm__ ("abs %0.2d,%1.2d"
 
14153
-           : "=w"(result)
 
14154
-           : "w"(a)
 
14155
-           : /* No clobbers */);
 
14156
-  return result;
 
14157
-}
 
14158
-
 
14159
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14160
-vacged_f64 (float64_t a, float64_t b)
 
14161
-{
 
14162
-  float64_t result;
 
14163
-  __asm__ ("facge %d0,%d1,%d2"
 
14164
-           : "=w"(result)
 
14165
-           : "w"(a), "w"(b)
 
14166
-           : /* No clobbers */);
 
14167
-  return result;
 
14168
-}
 
14169
-
 
14170
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14171
-vacges_f32 (float32_t a, float32_t b)
 
14172
-{
 
14173
-  float32_t result;
 
14174
-  __asm__ ("facge %s0,%s1,%s2"
 
14175
-           : "=w"(result)
 
14176
-           : "w"(a), "w"(b)
 
14177
-           : /* No clobbers */);
 
14178
-  return result;
 
14179
-}
 
14180
-
 
14181
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14182
-vacgtd_f64 (float64_t a, float64_t b)
 
14183
-{
 
14184
-  float64_t result;
 
14185
-  __asm__ ("facgt %d0,%d1,%d2"
 
14186
-           : "=w"(result)
 
14187
-           : "w"(a), "w"(b)
 
14188
-           : /* No clobbers */);
 
14189
-  return result;
 
14190
-}
 
14191
-
 
14192
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14193
-vacgts_f32 (float32_t a, float32_t b)
 
14194
-{
 
14195
-  float32_t result;
 
14196
-  __asm__ ("facgt %s0,%s1,%s2"
 
14197
-           : "=w"(result)
 
14198
-           : "w"(a), "w"(b)
 
14199
-           : /* No clobbers */);
 
14200
-  return result;
 
14201
-}
 
14202
-
 
14203
 __extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
14204
 vaddlv_s8 (int8x8_t a)
 
14205
 {
 
14206
@@ -4732,116 +4720,6 @@
 
14207
   return result;
 
14208
 }
 
14209
 
 
14210
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
14211
-vaddv_s8 (int8x8_t a)
 
14212
-{
 
14213
-  int8_t result;
 
14214
-  __asm__ ("addv %b0,%1.8b"
 
14215
-           : "=w"(result)
 
14216
-           : "w"(a)
 
14217
-           : /* No clobbers */);
 
14218
-  return result;
 
14219
-}
 
14220
-
 
14221
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
14222
-vaddv_s16 (int16x4_t a)
 
14223
-{
 
14224
-  int16_t result;
 
14225
-  __asm__ ("addv %h0,%1.4h"
 
14226
-           : "=w"(result)
 
14227
-           : "w"(a)
 
14228
-           : /* No clobbers */);
 
14229
-  return result;
 
14230
-}
 
14231
-
 
14232
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
14233
-vaddv_u8 (uint8x8_t a)
 
14234
-{
 
14235
-  uint8_t result;
 
14236
-  __asm__ ("addv %b0,%1.8b"
 
14237
-           : "=w"(result)
 
14238
-           : "w"(a)
 
14239
-           : /* No clobbers */);
 
14240
-  return result;
 
14241
-}
 
14242
-
 
14243
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
14244
-vaddv_u16 (uint16x4_t a)
 
14245
-{
 
14246
-  uint16_t result;
 
14247
-  __asm__ ("addv %h0,%1.4h"
 
14248
-           : "=w"(result)
 
14249
-           : "w"(a)
 
14250
-           : /* No clobbers */);
 
14251
-  return result;
 
14252
-}
 
14253
-
 
14254
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
14255
-vaddvq_s8 (int8x16_t a)
 
14256
-{
 
14257
-  int8_t result;
 
14258
-  __asm__ ("addv %b0,%1.16b"
 
14259
-           : "=w"(result)
 
14260
-           : "w"(a)
 
14261
-           : /* No clobbers */);
 
14262
-  return result;
 
14263
-}
 
14264
-
 
14265
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
14266
-vaddvq_s16 (int16x8_t a)
 
14267
-{
 
14268
-  int16_t result;
 
14269
-  __asm__ ("addv %h0,%1.8h"
 
14270
-           : "=w"(result)
 
14271
-           : "w"(a)
 
14272
-           : /* No clobbers */);
 
14273
-  return result;
 
14274
-}
 
14275
-
 
14276
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
14277
-vaddvq_s32 (int32x4_t a)
 
14278
-{
 
14279
-  int32_t result;
 
14280
-  __asm__ ("addv %s0,%1.4s"
 
14281
-           : "=w"(result)
 
14282
-           : "w"(a)
 
14283
-           : /* No clobbers */);
 
14284
-  return result;
 
14285
-}
 
14286
-
 
14287
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
14288
-vaddvq_u8 (uint8x16_t a)
 
14289
-{
 
14290
-  uint8_t result;
 
14291
-  __asm__ ("addv %b0,%1.16b"
 
14292
-           : "=w"(result)
 
14293
-           : "w"(a)
 
14294
-           : /* No clobbers */);
 
14295
-  return result;
 
14296
-}
 
14297
-
 
14298
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
14299
-vaddvq_u16 (uint16x8_t a)
 
14300
-{
 
14301
-  uint16_t result;
 
14302
-  __asm__ ("addv %h0,%1.8h"
 
14303
-           : "=w"(result)
 
14304
-           : "w"(a)
 
14305
-           : /* No clobbers */);
 
14306
-  return result;
 
14307
-}
 
14308
-
 
14309
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
14310
-vaddvq_u32 (uint32x4_t a)
 
14311
-{
 
14312
-  uint32_t result;
 
14313
-  __asm__ ("addv %s0,%1.4s"
 
14314
-           : "=w"(result)
 
14315
-           : "w"(a)
 
14316
-           : /* No clobbers */);
 
14317
-  return result;
 
14318
-}
 
14319
-
 
14320
 __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
14321
 vbsl_f32 (uint32x2_t a, float32x2_t b, float32x2_t c)
 
14322
 {
 
14323
@@ -5095,358 +4973,6 @@
 
14324
   return result;
 
14325
 }
 
14326
 
 
14327
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14328
-vcage_f32 (float32x2_t a, float32x2_t b)
 
14329
-{
 
14330
-  uint32x2_t result;
 
14331
-  __asm__ ("facge %0.2s, %1.2s, %2.2s"
 
14332
-           : "=w"(result)
 
14333
-           : "w"(a), "w"(b)
 
14334
-           : /* No clobbers */);
 
14335
-  return result;
 
14336
-}
 
14337
-
 
14338
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14339
-vcageq_f32 (float32x4_t a, float32x4_t b)
 
14340
-{
 
14341
-  uint32x4_t result;
 
14342
-  __asm__ ("facge %0.4s, %1.4s, %2.4s"
 
14343
-           : "=w"(result)
 
14344
-           : "w"(a), "w"(b)
 
14345
-           : /* No clobbers */);
 
14346
-  return result;
 
14347
-}
 
14348
-
 
14349
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14350
-vcageq_f64 (float64x2_t a, float64x2_t b)
 
14351
-{
 
14352
-  uint64x2_t result;
 
14353
-  __asm__ ("facge %0.2d, %1.2d, %2.2d"
 
14354
-           : "=w"(result)
 
14355
-           : "w"(a), "w"(b)
 
14356
-           : /* No clobbers */);
 
14357
-  return result;
 
14358
-}
 
14359
-
 
14360
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14361
-vcagt_f32 (float32x2_t a, float32x2_t b)
 
14362
-{
 
14363
-  uint32x2_t result;
 
14364
-  __asm__ ("facgt %0.2s, %1.2s, %2.2s"
 
14365
-           : "=w"(result)
 
14366
-           : "w"(a), "w"(b)
 
14367
-           : /* No clobbers */);
 
14368
-  return result;
 
14369
-}
 
14370
-
 
14371
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14372
-vcagtq_f32 (float32x4_t a, float32x4_t b)
 
14373
-{
 
14374
-  uint32x4_t result;
 
14375
-  __asm__ ("facgt %0.4s, %1.4s, %2.4s"
 
14376
-           : "=w"(result)
 
14377
-           : "w"(a), "w"(b)
 
14378
-           : /* No clobbers */);
 
14379
-  return result;
 
14380
-}
 
14381
-
 
14382
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14383
-vcagtq_f64 (float64x2_t a, float64x2_t b)
 
14384
-{
 
14385
-  uint64x2_t result;
 
14386
-  __asm__ ("facgt %0.2d, %1.2d, %2.2d"
 
14387
-           : "=w"(result)
 
14388
-           : "w"(a), "w"(b)
 
14389
-           : /* No clobbers */);
 
14390
-  return result;
 
14391
-}
 
14392
-
 
14393
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14394
-vcale_f32 (float32x2_t a, float32x2_t b)
 
14395
-{
 
14396
-  uint32x2_t result;
 
14397
-  __asm__ ("facge %0.2s, %2.2s, %1.2s"
 
14398
-           : "=w"(result)
 
14399
-           : "w"(a), "w"(b)
 
14400
-           : /* No clobbers */);
 
14401
-  return result;
 
14402
-}
 
14403
-
 
14404
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14405
-vcaleq_f32 (float32x4_t a, float32x4_t b)
 
14406
-{
 
14407
-  uint32x4_t result;
 
14408
-  __asm__ ("facge %0.4s, %2.4s, %1.4s"
 
14409
-           : "=w"(result)
 
14410
-           : "w"(a), "w"(b)
 
14411
-           : /* No clobbers */);
 
14412
-  return result;
 
14413
-}
 
14414
-
 
14415
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14416
-vcaleq_f64 (float64x2_t a, float64x2_t b)
 
14417
-{
 
14418
-  uint64x2_t result;
 
14419
-  __asm__ ("facge %0.2d, %2.2d, %1.2d"
 
14420
-           : "=w"(result)
 
14421
-           : "w"(a), "w"(b)
 
14422
-           : /* No clobbers */);
 
14423
-  return result;
 
14424
-}
 
14425
-
 
14426
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14427
-vcalt_f32 (float32x2_t a, float32x2_t b)
 
14428
-{
 
14429
-  uint32x2_t result;
 
14430
-  __asm__ ("facgt %0.2s, %2.2s, %1.2s"
 
14431
-           : "=w"(result)
 
14432
-           : "w"(a), "w"(b)
 
14433
-           : /* No clobbers */);
 
14434
-  return result;
 
14435
-}
 
14436
-
 
14437
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14438
-vcaltq_f32 (float32x4_t a, float32x4_t b)
 
14439
-{
 
14440
-  uint32x4_t result;
 
14441
-  __asm__ ("facgt %0.4s, %2.4s, %1.4s"
 
14442
-           : "=w"(result)
 
14443
-           : "w"(a), "w"(b)
 
14444
-           : /* No clobbers */);
 
14445
-  return result;
 
14446
-}
 
14447
-
 
14448
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14449
-vcaltq_f64 (float64x2_t a, float64x2_t b)
 
14450
-{
 
14451
-  uint64x2_t result;
 
14452
-  __asm__ ("facgt %0.2d, %2.2d, %1.2d"
 
14453
-           : "=w"(result)
 
14454
-           : "w"(a), "w"(b)
 
14455
-           : /* No clobbers */);
 
14456
-  return result;
 
14457
-}
 
14458
-
 
14459
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14460
-vceq_f32 (float32x2_t a, float32x2_t b)
 
14461
-{
 
14462
-  uint32x2_t result;
 
14463
-  __asm__ ("fcmeq %0.2s, %1.2s, %2.2s"
 
14464
-           : "=w"(result)
 
14465
-           : "w"(a), "w"(b)
 
14466
-           : /* No clobbers */);
 
14467
-  return result;
 
14468
-}
 
14469
-
 
14470
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14471
-vceq_f64 (float64x1_t a, float64x1_t b)
 
14472
-{
 
14473
-  uint64x1_t result;
 
14474
-  __asm__ ("fcmeq %d0, %d1, %d2"
 
14475
-           : "=w"(result)
 
14476
-           : "w"(a), "w"(b)
 
14477
-           : /* No clobbers */);
 
14478
-  return result;
 
14479
-}
 
14480
-
 
14481
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14482
-vceqd_f64 (float64_t a, float64_t b)
 
14483
-{
 
14484
-  float64_t result;
 
14485
-  __asm__ ("fcmeq %d0,%d1,%d2"
 
14486
-           : "=w"(result)
 
14487
-           : "w"(a), "w"(b)
 
14488
-           : /* No clobbers */);
 
14489
-  return result;
 
14490
-}
 
14491
-
 
14492
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14493
-vceqq_f32 (float32x4_t a, float32x4_t b)
 
14494
-{
 
14495
-  uint32x4_t result;
 
14496
-  __asm__ ("fcmeq %0.4s, %1.4s, %2.4s"
 
14497
-           : "=w"(result)
 
14498
-           : "w"(a), "w"(b)
 
14499
-           : /* No clobbers */);
 
14500
-  return result;
 
14501
-}
 
14502
-
 
14503
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14504
-vceqq_f64 (float64x2_t a, float64x2_t b)
 
14505
-{
 
14506
-  uint64x2_t result;
 
14507
-  __asm__ ("fcmeq %0.2d, %1.2d, %2.2d"
 
14508
-           : "=w"(result)
 
14509
-           : "w"(a), "w"(b)
 
14510
-           : /* No clobbers */);
 
14511
-  return result;
 
14512
-}
 
14513
-
 
14514
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14515
-vceqs_f32 (float32_t a, float32_t b)
 
14516
-{
 
14517
-  float32_t result;
 
14518
-  __asm__ ("fcmeq %s0,%s1,%s2"
 
14519
-           : "=w"(result)
 
14520
-           : "w"(a), "w"(b)
 
14521
-           : /* No clobbers */);
 
14522
-  return result;
 
14523
-}
 
14524
-
 
14525
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14526
-vceqzd_f64 (float64_t a)
 
14527
-{
 
14528
-  float64_t result;
 
14529
-  __asm__ ("fcmeq %d0,%d1,#0"
 
14530
-           : "=w"(result)
 
14531
-           : "w"(a)
 
14532
-           : /* No clobbers */);
 
14533
-  return result;
 
14534
-}
 
14535
-
 
14536
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14537
-vceqzs_f32 (float32_t a)
 
14538
-{
 
14539
-  float32_t result;
 
14540
-  __asm__ ("fcmeq %s0,%s1,#0"
 
14541
-           : "=w"(result)
 
14542
-           : "w"(a)
 
14543
-           : /* No clobbers */);
 
14544
-  return result;
 
14545
-}
 
14546
-
 
14547
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14548
-vcge_f32 (float32x2_t a, float32x2_t b)
 
14549
-{
 
14550
-  uint32x2_t result;
 
14551
-  __asm__ ("fcmge %0.2s, %1.2s, %2.2s"
 
14552
-           : "=w"(result)
 
14553
-           : "w"(a), "w"(b)
 
14554
-           : /* No clobbers */);
 
14555
-  return result;
 
14556
-}
 
14557
-
 
14558
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14559
-vcge_f64 (float64x1_t a, float64x1_t b)
 
14560
-{
 
14561
-  uint64x1_t result;
 
14562
-  __asm__ ("fcmge %d0, %d1, %d2"
 
14563
-           : "=w"(result)
 
14564
-           : "w"(a), "w"(b)
 
14565
-           : /* No clobbers */);
 
14566
-  return result;
 
14567
-}
 
14568
-
 
14569
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14570
-vcgeq_f32 (float32x4_t a, float32x4_t b)
 
14571
-{
 
14572
-  uint32x4_t result;
 
14573
-  __asm__ ("fcmge %0.4s, %1.4s, %2.4s"
 
14574
-           : "=w"(result)
 
14575
-           : "w"(a), "w"(b)
 
14576
-           : /* No clobbers */);
 
14577
-  return result;
 
14578
-}
 
14579
-
 
14580
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14581
-vcgeq_f64 (float64x2_t a, float64x2_t b)
 
14582
-{
 
14583
-  uint64x2_t result;
 
14584
-  __asm__ ("fcmge %0.2d, %1.2d, %2.2d"
 
14585
-           : "=w"(result)
 
14586
-           : "w"(a), "w"(b)
 
14587
-           : /* No clobbers */);
 
14588
-  return result;
 
14589
-}
 
14590
-
 
14591
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14592
-vcgt_f32 (float32x2_t a, float32x2_t b)
 
14593
-{
 
14594
-  uint32x2_t result;
 
14595
-  __asm__ ("fcmgt %0.2s, %1.2s, %2.2s"
 
14596
-           : "=w"(result)
 
14597
-           : "w"(a), "w"(b)
 
14598
-           : /* No clobbers */);
 
14599
-  return result;
 
14600
-}
 
14601
-
 
14602
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14603
-vcgt_f64 (float64x1_t a, float64x1_t b)
 
14604
-{
 
14605
-  uint64x1_t result;
 
14606
-  __asm__ ("fcmgt %d0, %d1, %d2"
 
14607
-           : "=w"(result)
 
14608
-           : "w"(a), "w"(b)
 
14609
-           : /* No clobbers */);
 
14610
-  return result;
 
14611
-}
 
14612
-
 
14613
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14614
-vcgtq_f32 (float32x4_t a, float32x4_t b)
 
14615
-{
 
14616
-  uint32x4_t result;
 
14617
-  __asm__ ("fcmgt %0.4s, %1.4s, %2.4s"
 
14618
-           : "=w"(result)
 
14619
-           : "w"(a), "w"(b)
 
14620
-           : /* No clobbers */);
 
14621
-  return result;
 
14622
-}
 
14623
-
 
14624
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14625
-vcgtq_f64 (float64x2_t a, float64x2_t b)
 
14626
-{
 
14627
-  uint64x2_t result;
 
14628
-  __asm__ ("fcmgt %0.2d, %1.2d, %2.2d"
 
14629
-           : "=w"(result)
 
14630
-           : "w"(a), "w"(b)
 
14631
-           : /* No clobbers */);
 
14632
-  return result;
 
14633
-}
 
14634
-
 
14635
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14636
-vcle_f32 (float32x2_t a, float32x2_t b)
 
14637
-{
 
14638
-  uint32x2_t result;
 
14639
-  __asm__ ("fcmge %0.2s, %2.2s, %1.2s"
 
14640
-           : "=w"(result)
 
14641
-           : "w"(a), "w"(b)
 
14642
-           : /* No clobbers */);
 
14643
-  return result;
 
14644
-}
 
14645
-
 
14646
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14647
-vcle_f64 (float64x1_t a, float64x1_t b)
 
14648
-{
 
14649
-  uint64x1_t result;
 
14650
-  __asm__ ("fcmge %d0, %d2, %d1"
 
14651
-           : "=w"(result)
 
14652
-           : "w"(a), "w"(b)
 
14653
-           : /* No clobbers */);
 
14654
-  return result;
 
14655
-}
 
14656
-
 
14657
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14658
-vcleq_f32 (float32x4_t a, float32x4_t b)
 
14659
-{
 
14660
-  uint32x4_t result;
 
14661
-  __asm__ ("fcmge %0.4s, %2.4s, %1.4s"
 
14662
-           : "=w"(result)
 
14663
-           : "w"(a), "w"(b)
 
14664
-           : /* No clobbers */);
 
14665
-  return result;
 
14666
-}
 
14667
-
 
14668
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14669
-vcleq_f64 (float64x2_t a, float64x2_t b)
 
14670
-{
 
14671
-  uint64x2_t result;
 
14672
-  __asm__ ("fcmge %0.2d, %2.2d, %1.2d"
 
14673
-           : "=w"(result)
 
14674
-           : "w"(a), "w"(b)
 
14675
-           : /* No clobbers */);
 
14676
-  return result;
 
14677
-}
 
14678
-
 
14679
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
14680
 vcls_s8 (int8x8_t a)
 
14681
 {
 
14682
@@ -5513,50 +5039,6 @@
 
14683
   return result;
 
14684
 }
 
14685
 
 
14686
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14687
-vclt_f32 (float32x2_t a, float32x2_t b)
 
14688
-{
 
14689
-  uint32x2_t result;
 
14690
-  __asm__ ("fcmgt %0.2s, %2.2s, %1.2s"
 
14691
-           : "=w"(result)
 
14692
-           : "w"(a), "w"(b)
 
14693
-           : /* No clobbers */);
 
14694
-  return result;
 
14695
-}
 
14696
-
 
14697
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
14698
-vclt_f64 (float64x1_t a, float64x1_t b)
 
14699
-{
 
14700
-  uint64x1_t result;
 
14701
-  __asm__ ("fcmgt %d0, %d2, %d1"
 
14702
-           : "=w"(result)
 
14703
-           : "w"(a), "w"(b)
 
14704
-           : /* No clobbers */);
 
14705
-  return result;
 
14706
-}
 
14707
-
 
14708
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14709
-vcltq_f32 (float32x4_t a, float32x4_t b)
 
14710
-{
 
14711
-  uint32x4_t result;
 
14712
-  __asm__ ("fcmgt %0.4s, %2.4s, %1.4s"
 
14713
-           : "=w"(result)
 
14714
-           : "w"(a), "w"(b)
 
14715
-           : /* No clobbers */);
 
14716
-  return result;
 
14717
-}
 
14718
-
 
14719
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14720
-vcltq_f64 (float64x2_t a, float64x2_t b)
 
14721
-{
 
14722
-  uint64x2_t result;
 
14723
-  __asm__ ("fcmgt %0.2d, %2.2d, %1.2d"
 
14724
-           : "=w"(result)
 
14725
-           : "w"(a), "w"(b)
 
14726
-           : /* No clobbers */);
 
14727
-  return result;
 
14728
-}
 
14729
-
 
14730
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
14731
 vclz_s8 (int8x8_t a)
 
14732
 {
 
14733
@@ -5915,100 +5397,12 @@
 
14734
 
 
14735
 /* vcvt_f32_f16 not supported */
 
14736
 
 
14737
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
14738
-vcvt_f32_f64 (float64x2_t a)
 
14739
-{
 
14740
-  float32x2_t result;
 
14741
-  __asm__ ("fcvtn %0.2s,%1.2d"
 
14742
-           : "=w"(result)
 
14743
-           : "w"(a)
 
14744
-           : /* No clobbers */);
 
14745
-  return result;
 
14746
-}
 
14747
-
 
14748
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
14749
-vcvt_f32_s32 (int32x2_t a)
 
14750
-{
 
14751
-  float32x2_t result;
 
14752
-  __asm__ ("scvtf %0.2s, %1.2s"
 
14753
-           : "=w"(result)
 
14754
-           : "w"(a)
 
14755
-           : /* No clobbers */);
 
14756
-  return result;
 
14757
-}
 
14758
-
 
14759
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
14760
-vcvt_f32_u32 (uint32x2_t a)
 
14761
-{
 
14762
-  float32x2_t result;
 
14763
-  __asm__ ("ucvtf %0.2s, %1.2s"
 
14764
-           : "=w"(result)
 
14765
-           : "w"(a)
 
14766
-           : /* No clobbers */);
 
14767
-  return result;
 
14768
-}
 
14769
-
 
14770
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
14771
-vcvt_f64_f32 (float32x2_t a)
 
14772
-{
 
14773
-  float64x2_t result;
 
14774
-  __asm__ ("fcvtl %0.2d,%1.2s"
 
14775
-           : "=w"(result)
 
14776
-           : "w"(a)
 
14777
-           : /* No clobbers */);
 
14778
-  return result;
 
14779
-}
 
14780
-
 
14781
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
 
14782
-vcvt_f64_s64 (uint64x1_t a)
 
14783
-{
 
14784
-  float64x1_t result;
 
14785
-  __asm__ ("scvtf %d0, %d1"
 
14786
-           : "=w"(result)
 
14787
-           : "w"(a)
 
14788
-           : /* No clobbers */);
 
14789
-  return result;
 
14790
-}
 
14791
-
 
14792
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
 
14793
-vcvt_f64_u64 (uint64x1_t a)
 
14794
-{
 
14795
-  float64x1_t result;
 
14796
-  __asm__ ("ucvtf %d0, %d1"
 
14797
-           : "=w"(result)
 
14798
-           : "w"(a)
 
14799
-           : /* No clobbers */);
 
14800
-  return result;
 
14801
-}
 
14802
-
 
14803
 /* vcvt_high_f16_f32 not supported */
 
14804
 
 
14805
 /* vcvt_high_f32_f16 not supported */
 
14806
 
 
14807
 static float32x2_t vdup_n_f32 (float32_t);
 
14808
 
 
14809
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
14810
-vcvt_high_f32_f64 (float32x2_t a, float64x2_t b)
 
14811
-{
 
14812
-  float32x4_t result = vcombine_f32 (a, vdup_n_f32 (0.0f));
 
14813
-  __asm__ ("fcvtn2 %0.4s,%2.2d"
 
14814
-           : "+w"(result)
 
14815
-           : "w"(b)
 
14816
-           : /* No clobbers */);
 
14817
-  return result;
 
14818
-}
 
14819
-
 
14820
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
14821
-vcvt_high_f64_f32 (float32x4_t a)
 
14822
-{
 
14823
-  float64x2_t result;
 
14824
-  __asm__ ("fcvtl2 %0.2d,%1.4s"
 
14825
-           : "=w"(result)
 
14826
-           : "w"(a)
 
14827
-           : /* No clobbers */);
 
14828
-  return result;
 
14829
-}
 
14830
-
 
14831
 #define vcvt_n_f32_s32(a, b)                                            \
 
14832
   __extension__                                                         \
 
14833
     ({                                                                  \
 
14834
@@ -6057,160 +5451,6 @@
 
14835
        result;                                                          \
 
14836
      })
 
14837
 
 
14838
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
14839
-vcvt_s32_f32 (float32x2_t a)
 
14840
-{
 
14841
-  int32x2_t result;
 
14842
-  __asm__ ("fcvtzs %0.2s, %1.2s"
 
14843
-           : "=w"(result)
 
14844
-           : "w"(a)
 
14845
-           : /* No clobbers */);
 
14846
-  return result;
 
14847
-}
 
14848
-
 
14849
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14850
-vcvt_u32_f32 (float32x2_t a)
 
14851
-{
 
14852
-  uint32x2_t result;
 
14853
-  __asm__ ("fcvtzu %0.2s, %1.2s"
 
14854
-           : "=w"(result)
 
14855
-           : "w"(a)
 
14856
-           : /* No clobbers */);
 
14857
-  return result;
 
14858
-}
 
14859
-
 
14860
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
14861
-vcvta_s32_f32 (float32x2_t a)
 
14862
-{
 
14863
-  int32x2_t result;
 
14864
-  __asm__ ("fcvtas %0.2s, %1.2s"
 
14865
-           : "=w"(result)
 
14866
-           : "w"(a)
 
14867
-           : /* No clobbers */);
 
14868
-  return result;
 
14869
-}
 
14870
-
 
14871
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
14872
-vcvta_u32_f32 (float32x2_t a)
 
14873
-{
 
14874
-  uint32x2_t result;
 
14875
-  __asm__ ("fcvtau %0.2s, %1.2s"
 
14876
-           : "=w"(result)
 
14877
-           : "w"(a)
 
14878
-           : /* No clobbers */);
 
14879
-  return result;
 
14880
-}
 
14881
-
 
14882
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14883
-vcvtad_s64_f64 (float64_t a)
 
14884
-{
 
14885
-  float64_t result;
 
14886
-  __asm__ ("fcvtas %d0,%d1"
 
14887
-           : "=w"(result)
 
14888
-           : "w"(a)
 
14889
-           : /* No clobbers */);
 
14890
-  return result;
 
14891
-}
 
14892
-
 
14893
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
14894
-vcvtad_u64_f64 (float64_t a)
 
14895
-{
 
14896
-  float64_t result;
 
14897
-  __asm__ ("fcvtau %d0,%d1"
 
14898
-           : "=w"(result)
 
14899
-           : "w"(a)
 
14900
-           : /* No clobbers */);
 
14901
-  return result;
 
14902
-}
 
14903
-
 
14904
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
14905
-vcvtaq_s32_f32 (float32x4_t a)
 
14906
-{
 
14907
-  int32x4_t result;
 
14908
-  __asm__ ("fcvtas %0.4s, %1.4s"
 
14909
-           : "=w"(result)
 
14910
-           : "w"(a)
 
14911
-           : /* No clobbers */);
 
14912
-  return result;
 
14913
-}
 
14914
-
 
14915
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
14916
-vcvtaq_s64_f64 (float64x2_t a)
 
14917
-{
 
14918
-  int64x2_t result;
 
14919
-  __asm__ ("fcvtas %0.2d, %1.2d"
 
14920
-           : "=w"(result)
 
14921
-           : "w"(a)
 
14922
-           : /* No clobbers */);
 
14923
-  return result;
 
14924
-}
 
14925
-
 
14926
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
14927
-vcvtaq_u32_f32 (float32x4_t a)
 
14928
-{
 
14929
-  uint32x4_t result;
 
14930
-  __asm__ ("fcvtau %0.4s, %1.4s"
 
14931
-           : "=w"(result)
 
14932
-           : "w"(a)
 
14933
-           : /* No clobbers */);
 
14934
-  return result;
 
14935
-}
 
14936
-
 
14937
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
14938
-vcvtaq_u64_f64 (float64x2_t a)
 
14939
-{
 
14940
-  uint64x2_t result;
 
14941
-  __asm__ ("fcvtau %0.2d, %1.2d"
 
14942
-           : "=w"(result)
 
14943
-           : "w"(a)
 
14944
-           : /* No clobbers */);
 
14945
-  return result;
 
14946
-}
 
14947
-
 
14948
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14949
-vcvtas_s64_f64 (float32_t a)
 
14950
-{
 
14951
-  float32_t result;
 
14952
-  __asm__ ("fcvtas %s0,%s1"
 
14953
-           : "=w"(result)
 
14954
-           : "w"(a)
 
14955
-           : /* No clobbers */);
 
14956
-  return result;
 
14957
-}
 
14958
-
 
14959
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
14960
-vcvtas_u64_f64 (float32_t a)
 
14961
-{
 
14962
-  float32_t result;
 
14963
-  __asm__ ("fcvtau %s0,%s1"
 
14964
-           : "=w"(result)
 
14965
-           : "w"(a)
 
14966
-           : /* No clobbers */);
 
14967
-  return result;
 
14968
-}
 
14969
-
 
14970
-__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
14971
-vcvtd_f64_s64 (int64_t a)
 
14972
-{
 
14973
-  int64_t result;
 
14974
-  __asm__ ("scvtf %d0,%d1"
 
14975
-           : "=w"(result)
 
14976
-           : "w"(a)
 
14977
-           : /* No clobbers */);
 
14978
-  return result;
 
14979
-}
 
14980
-
 
14981
-__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
14982
-vcvtd_f64_u64 (uint64_t a)
 
14983
-{
 
14984
-  uint64_t result;
 
14985
-  __asm__ ("ucvtf %d0,%d1"
 
14986
-           : "=w"(result)
 
14987
-           : "w"(a)
 
14988
-           : /* No clobbers */);
 
14989
-  return result;
 
14990
-}
 
14991
-
 
14992
 #define vcvtd_n_f64_s64(a, b)                                           \
 
14993
   __extension__                                                         \
 
14994
     ({                                                                  \
 
14995
@@ -6259,402 +5499,6 @@
 
14996
        result;                                                          \
 
14997
      })
 
14998
 
 
14999
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15000
-vcvtd_s64_f64 (float64_t a)
 
15001
-{
 
15002
-  float64_t result;
 
15003
-  __asm__ ("fcvtzs %d0,%d1"
 
15004
-           : "=w"(result)
 
15005
-           : "w"(a)
 
15006
-           : /* No clobbers */);
 
15007
-  return result;
 
15008
-}
 
15009
-
 
15010
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15011
-vcvtd_u64_f64 (float64_t a)
 
15012
-{
 
15013
-  float64_t result;
 
15014
-  __asm__ ("fcvtzu %d0,%d1"
 
15015
-           : "=w"(result)
 
15016
-           : "w"(a)
 
15017
-           : /* No clobbers */);
 
15018
-  return result;
 
15019
-}
 
15020
-
 
15021
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
15022
-vcvtm_s32_f32 (float32x2_t a)
 
15023
-{
 
15024
-  int32x2_t result;
 
15025
-  __asm__ ("fcvtms %0.2s, %1.2s"
 
15026
-           : "=w"(result)
 
15027
-           : "w"(a)
 
15028
-           : /* No clobbers */);
 
15029
-  return result;
 
15030
-}
 
15031
-
 
15032
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
15033
-vcvtm_u32_f32 (float32x2_t a)
 
15034
-{
 
15035
-  uint32x2_t result;
 
15036
-  __asm__ ("fcvtmu %0.2s, %1.2s"
 
15037
-           : "=w"(result)
 
15038
-           : "w"(a)
 
15039
-           : /* No clobbers */);
 
15040
-  return result;
 
15041
-}
 
15042
-
 
15043
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15044
-vcvtmd_s64_f64 (float64_t a)
 
15045
-{
 
15046
-  float64_t result;
 
15047
-  __asm__ ("fcvtms %d0,%d1"
 
15048
-           : "=w"(result)
 
15049
-           : "w"(a)
 
15050
-           : /* No clobbers */);
 
15051
-  return result;
 
15052
-}
 
15053
-
 
15054
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15055
-vcvtmd_u64_f64 (float64_t a)
 
15056
-{
 
15057
-  float64_t result;
 
15058
-  __asm__ ("fcvtmu %d0,%d1"
 
15059
-           : "=w"(result)
 
15060
-           : "w"(a)
 
15061
-           : /* No clobbers */);
 
15062
-  return result;
 
15063
-}
 
15064
-
 
15065
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
15066
-vcvtmq_s32_f32 (float32x4_t a)
 
15067
-{
 
15068
-  int32x4_t result;
 
15069
-  __asm__ ("fcvtms %0.4s, %1.4s"
 
15070
-           : "=w"(result)
 
15071
-           : "w"(a)
 
15072
-           : /* No clobbers */);
 
15073
-  return result;
 
15074
-}
 
15075
-
 
15076
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
15077
-vcvtmq_s64_f64 (float64x2_t a)
 
15078
-{
 
15079
-  int64x2_t result;
 
15080
-  __asm__ ("fcvtms %0.2d, %1.2d"
 
15081
-           : "=w"(result)
 
15082
-           : "w"(a)
 
15083
-           : /* No clobbers */);
 
15084
-  return result;
 
15085
-}
 
15086
-
 
15087
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
15088
-vcvtmq_u32_f32 (float32x4_t a)
 
15089
-{
 
15090
-  uint32x4_t result;
 
15091
-  __asm__ ("fcvtmu %0.4s, %1.4s"
 
15092
-           : "=w"(result)
 
15093
-           : "w"(a)
 
15094
-           : /* No clobbers */);
 
15095
-  return result;
 
15096
-}
 
15097
-
 
15098
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
15099
-vcvtmq_u64_f64 (float64x2_t a)
 
15100
-{
 
15101
-  uint64x2_t result;
 
15102
-  __asm__ ("fcvtmu %0.2d, %1.2d"
 
15103
-           : "=w"(result)
 
15104
-           : "w"(a)
 
15105
-           : /* No clobbers */);
 
15106
-  return result;
 
15107
-}
 
15108
-
 
15109
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15110
-vcvtms_s64_f64 (float32_t a)
 
15111
-{
 
15112
-  float32_t result;
 
15113
-  __asm__ ("fcvtms %s0,%s1"
 
15114
-           : "=w"(result)
 
15115
-           : "w"(a)
 
15116
-           : /* No clobbers */);
 
15117
-  return result;
 
15118
-}
 
15119
-
 
15120
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15121
-vcvtms_u64_f64 (float32_t a)
 
15122
-{
 
15123
-  float32_t result;
 
15124
-  __asm__ ("fcvtmu %s0,%s1"
 
15125
-           : "=w"(result)
 
15126
-           : "w"(a)
 
15127
-           : /* No clobbers */);
 
15128
-  return result;
 
15129
-}
 
15130
-
 
15131
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
15132
-vcvtn_s32_f32 (float32x2_t a)
 
15133
-{
 
15134
-  int32x2_t result;
 
15135
-  __asm__ ("fcvtns %0.2s, %1.2s"
 
15136
-           : "=w"(result)
 
15137
-           : "w"(a)
 
15138
-           : /* No clobbers */);
 
15139
-  return result;
 
15140
-}
 
15141
-
 
15142
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
15143
-vcvtn_u32_f32 (float32x2_t a)
 
15144
-{
 
15145
-  uint32x2_t result;
 
15146
-  __asm__ ("fcvtnu %0.2s, %1.2s"
 
15147
-           : "=w"(result)
 
15148
-           : "w"(a)
 
15149
-           : /* No clobbers */);
 
15150
-  return result;
 
15151
-}
 
15152
-
 
15153
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15154
-vcvtnd_s64_f64 (float64_t a)
 
15155
-{
 
15156
-  float64_t result;
 
15157
-  __asm__ ("fcvtns %d0,%d1"
 
15158
-           : "=w"(result)
 
15159
-           : "w"(a)
 
15160
-           : /* No clobbers */);
 
15161
-  return result;
 
15162
-}
 
15163
-
 
15164
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15165
-vcvtnd_u64_f64 (float64_t a)
 
15166
-{
 
15167
-  float64_t result;
 
15168
-  __asm__ ("fcvtnu %d0,%d1"
 
15169
-           : "=w"(result)
 
15170
-           : "w"(a)
 
15171
-           : /* No clobbers */);
 
15172
-  return result;
 
15173
-}
 
15174
-
 
15175
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
15176
-vcvtnq_s32_f32 (float32x4_t a)
 
15177
-{
 
15178
-  int32x4_t result;
 
15179
-  __asm__ ("fcvtns %0.4s, %1.4s"
 
15180
-           : "=w"(result)
 
15181
-           : "w"(a)
 
15182
-           : /* No clobbers */);
 
15183
-  return result;
 
15184
-}
 
15185
-
 
15186
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
15187
-vcvtnq_s64_f64 (float64x2_t a)
 
15188
-{
 
15189
-  int64x2_t result;
 
15190
-  __asm__ ("fcvtns %0.2d, %1.2d"
 
15191
-           : "=w"(result)
 
15192
-           : "w"(a)
 
15193
-           : /* No clobbers */);
 
15194
-  return result;
 
15195
-}
 
15196
-
 
15197
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
15198
-vcvtnq_u32_f32 (float32x4_t a)
 
15199
-{
 
15200
-  uint32x4_t result;
 
15201
-  __asm__ ("fcvtnu %0.4s, %1.4s"
 
15202
-           : "=w"(result)
 
15203
-           : "w"(a)
 
15204
-           : /* No clobbers */);
 
15205
-  return result;
 
15206
-}
 
15207
-
 
15208
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
15209
-vcvtnq_u64_f64 (float64x2_t a)
 
15210
-{
 
15211
-  uint64x2_t result;
 
15212
-  __asm__ ("fcvtnu %0.2d, %1.2d"
 
15213
-           : "=w"(result)
 
15214
-           : "w"(a)
 
15215
-           : /* No clobbers */);
 
15216
-  return result;
 
15217
-}
 
15218
-
 
15219
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15220
-vcvtns_s64_f64 (float32_t a)
 
15221
-{
 
15222
-  float32_t result;
 
15223
-  __asm__ ("fcvtns %s0,%s1"
 
15224
-           : "=w"(result)
 
15225
-           : "w"(a)
 
15226
-           : /* No clobbers */);
 
15227
-  return result;
 
15228
-}
 
15229
-
 
15230
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15231
-vcvtns_u64_f64 (float32_t a)
 
15232
-{
 
15233
-  float32_t result;
 
15234
-  __asm__ ("fcvtnu %s0,%s1"
 
15235
-           : "=w"(result)
 
15236
-           : "w"(a)
 
15237
-           : /* No clobbers */);
 
15238
-  return result;
 
15239
-}
 
15240
-
 
15241
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
15242
-vcvtp_s32_f32 (float32x2_t a)
 
15243
-{
 
15244
-  int32x2_t result;
 
15245
-  __asm__ ("fcvtps %0.2s, %1.2s"
 
15246
-           : "=w"(result)
 
15247
-           : "w"(a)
 
15248
-           : /* No clobbers */);
 
15249
-  return result;
 
15250
-}
 
15251
-
 
15252
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
15253
-vcvtp_u32_f32 (float32x2_t a)
 
15254
-{
 
15255
-  uint32x2_t result;
 
15256
-  __asm__ ("fcvtpu %0.2s, %1.2s"
 
15257
-           : "=w"(result)
 
15258
-           : "w"(a)
 
15259
-           : /* No clobbers */);
 
15260
-  return result;
 
15261
-}
 
15262
-
 
15263
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15264
-vcvtpd_s64_f64 (float64_t a)
 
15265
-{
 
15266
-  float64_t result;
 
15267
-  __asm__ ("fcvtps %d0,%d1"
 
15268
-           : "=w"(result)
 
15269
-           : "w"(a)
 
15270
-           : /* No clobbers */);
 
15271
-  return result;
 
15272
-}
 
15273
-
 
15274
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
15275
-vcvtpd_u64_f64 (float64_t a)
 
15276
-{
 
15277
-  float64_t result;
 
15278
-  __asm__ ("fcvtpu %d0,%d1"
 
15279
-           : "=w"(result)
 
15280
-           : "w"(a)
 
15281
-           : /* No clobbers */);
 
15282
-  return result;
 
15283
-}
 
15284
-
 
15285
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
15286
-vcvtpq_s32_f32 (float32x4_t a)
 
15287
-{
 
15288
-  int32x4_t result;
 
15289
-  __asm__ ("fcvtps %0.4s, %1.4s"
 
15290
-           : "=w"(result)
 
15291
-           : "w"(a)
 
15292
-           : /* No clobbers */);
 
15293
-  return result;
 
15294
-}
 
15295
-
 
15296
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
15297
-vcvtpq_s64_f64 (float64x2_t a)
 
15298
-{
 
15299
-  int64x2_t result;
 
15300
-  __asm__ ("fcvtps %0.2d, %1.2d"
 
15301
-           : "=w"(result)
 
15302
-           : "w"(a)
 
15303
-           : /* No clobbers */);
 
15304
-  return result;
 
15305
-}
 
15306
-
 
15307
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
15308
-vcvtpq_u32_f32 (float32x4_t a)
 
15309
-{
 
15310
-  uint32x4_t result;
 
15311
-  __asm__ ("fcvtpu %0.4s, %1.4s"
 
15312
-           : "=w"(result)
 
15313
-           : "w"(a)
 
15314
-           : /* No clobbers */);
 
15315
-  return result;
 
15316
-}
 
15317
-
 
15318
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
15319
-vcvtpq_u64_f64 (float64x2_t a)
 
15320
-{
 
15321
-  uint64x2_t result;
 
15322
-  __asm__ ("fcvtpu %0.2d, %1.2d"
 
15323
-           : "=w"(result)
 
15324
-           : "w"(a)
 
15325
-           : /* No clobbers */);
 
15326
-  return result;
 
15327
-}
 
15328
-
 
15329
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15330
-vcvtps_s64_f64 (float32_t a)
 
15331
-{
 
15332
-  float32_t result;
 
15333
-  __asm__ ("fcvtps %s0,%s1"
 
15334
-           : "=w"(result)
 
15335
-           : "w"(a)
 
15336
-           : /* No clobbers */);
 
15337
-  return result;
 
15338
-}
 
15339
-
 
15340
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15341
-vcvtps_u64_f64 (float32_t a)
 
15342
-{
 
15343
-  float32_t result;
 
15344
-  __asm__ ("fcvtpu %s0,%s1"
 
15345
-           : "=w"(result)
 
15346
-           : "w"(a)
 
15347
-           : /* No clobbers */);
 
15348
-  return result;
 
15349
-}
 
15350
-
 
15351
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
15352
-vcvtq_f32_s32 (int32x4_t a)
 
15353
-{
 
15354
-  float32x4_t result;
 
15355
-  __asm__ ("scvtf %0.4s, %1.4s"
 
15356
-           : "=w"(result)
 
15357
-           : "w"(a)
 
15358
-           : /* No clobbers */);
 
15359
-  return result;
 
15360
-}
 
15361
-
 
15362
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
15363
-vcvtq_f32_u32 (uint32x4_t a)
 
15364
-{
 
15365
-  float32x4_t result;
 
15366
-  __asm__ ("ucvtf %0.4s, %1.4s"
 
15367
-           : "=w"(result)
 
15368
-           : "w"(a)
 
15369
-           : /* No clobbers */);
 
15370
-  return result;
 
15371
-}
 
15372
-
 
15373
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
15374
-vcvtq_f64_s64 (int64x2_t a)
 
15375
-{
 
15376
-  float64x2_t result;
 
15377
-  __asm__ ("scvtf %0.2d, %1.2d"
 
15378
-           : "=w"(result)
 
15379
-           : "w"(a)
 
15380
-           : /* No clobbers */);
 
15381
-  return result;
 
15382
-}
 
15383
-
 
15384
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
15385
-vcvtq_f64_u64 (uint64x2_t a)
 
15386
-{
 
15387
-  float64x2_t result;
 
15388
-  __asm__ ("ucvtf %0.2d, %1.2d"
 
15389
-           : "=w"(result)
 
15390
-           : "w"(a)
 
15391
-           : /* No clobbers */);
 
15392
-  return result;
 
15393
-}
 
15394
-
 
15395
 #define vcvtq_n_f32_s32(a, b)                                           \
 
15396
   __extension__                                                         \
 
15397
     ({                                                                  \
 
15398
@@ -6751,72 +5595,6 @@
 
15399
        result;                                                          \
 
15400
      })
 
15401
 
 
15402
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
15403
-vcvtq_s32_f32 (float32x4_t a)
 
15404
-{
 
15405
-  int32x4_t result;
 
15406
-  __asm__ ("fcvtzs %0.4s, %1.4s"
 
15407
-           : "=w"(result)
 
15408
-           : "w"(a)
 
15409
-           : /* No clobbers */);
 
15410
-  return result;
 
15411
-}
 
15412
-
 
15413
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
15414
-vcvtq_s64_f64 (float64x2_t a)
 
15415
-{
 
15416
-  int64x2_t result;
 
15417
-  __asm__ ("fcvtzs %0.2d, %1.2d"
 
15418
-           : "=w"(result)
 
15419
-           : "w"(a)
 
15420
-           : /* No clobbers */);
 
15421
-  return result;
 
15422
-}
 
15423
-
 
15424
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
15425
-vcvtq_u32_f32 (float32x4_t a)
 
15426
-{
 
15427
-  uint32x4_t result;
 
15428
-  __asm__ ("fcvtzu %0.4s, %1.4s"
 
15429
-           : "=w"(result)
 
15430
-           : "w"(a)
 
15431
-           : /* No clobbers */);
 
15432
-  return result;
 
15433
-}
 
15434
-
 
15435
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
15436
-vcvtq_u64_f64 (float64x2_t a)
 
15437
-{
 
15438
-  uint64x2_t result;
 
15439
-  __asm__ ("fcvtzu %0.2d, %1.2d"
 
15440
-           : "=w"(result)
 
15441
-           : "w"(a)
 
15442
-           : /* No clobbers */);
 
15443
-  return result;
 
15444
-}
 
15445
-
 
15446
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
15447
-vcvts_f64_s32 (int32_t a)
 
15448
-{
 
15449
-  int32_t result;
 
15450
-  __asm__ ("scvtf %s0,%s1"
 
15451
-           : "=w"(result)
 
15452
-           : "w"(a)
 
15453
-           : /* No clobbers */);
 
15454
-  return result;
 
15455
-}
 
15456
-
 
15457
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
15458
-vcvts_f64_u32 (uint32_t a)
 
15459
-{
 
15460
-  uint32_t result;
 
15461
-  __asm__ ("ucvtf %s0,%s1"
 
15462
-           : "=w"(result)
 
15463
-           : "w"(a)
 
15464
-           : /* No clobbers */);
 
15465
-  return result;
 
15466
-}
 
15467
-
 
15468
 #define vcvts_n_f32_s32(a, b)                                           \
 
15469
   __extension__                                                         \
 
15470
     ({                                                                  \
 
15471
@@ -6865,28 +5643,6 @@
 
15472
        result;                                                          \
 
15473
      })
 
15474
 
 
15475
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15476
-vcvts_s64_f64 (float32_t a)
 
15477
-{
 
15478
-  float32_t result;
 
15479
-  __asm__ ("fcvtzs %s0,%s1"
 
15480
-           : "=w"(result)
 
15481
-           : "w"(a)
 
15482
-           : /* No clobbers */);
 
15483
-  return result;
 
15484
-}
 
15485
-
 
15486
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15487
-vcvts_u64_f64 (float32_t a)
 
15488
-{
 
15489
-  float32_t result;
 
15490
-  __asm__ ("fcvtzu %s0,%s1"
 
15491
-           : "=w"(result)
 
15492
-           : "w"(a)
 
15493
-           : /* No clobbers */);
 
15494
-  return result;
 
15495
-}
 
15496
-
 
15497
 __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
15498
 vcvtx_f32_f64 (float64x2_t a)
 
15499
 {
 
15500
@@ -8110,151 +6866,7 @@
 
15501
   return result;
 
15502
 }
 
15503
 
 
15504
-#define vget_lane_f64(a, b)                                             \
 
15505
-  __extension__                                                         \
 
15506
-    ({                                                                  \
 
15507
-       float64x1_t a_ = (a);                                            \
 
15508
-       float64_t result;                                                \
 
15509
-       __asm__ ("umov %x0, %1.d[%2]"                                    \
 
15510
-                : "=r"(result)                                          \
 
15511
-                : "w"(a_), "i"(b)                                       \
 
15512
-                : /* No clobbers */);                                   \
 
15513
-       result;                                                          \
 
15514
-     })
 
15515
-
 
15516
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
15517
-vget_low_f32 (float32x4_t a)
 
15518
-{
 
15519
-  float32x2_t result;
 
15520
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15521
-           : "=w"(result)
 
15522
-           : "w"(a)
 
15523
-           : /* No clobbers */);
 
15524
-  return result;
 
15525
-}
 
15526
-
 
15527
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
 
15528
-vget_low_f64 (float64x2_t a)
 
15529
-{
 
15530
-  float64x1_t result;
 
15531
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15532
-           : "=w"(result)
 
15533
-           : "w"(a)
 
15534
-           : /* No clobbers */);
 
15535
-  return result;
 
15536
-}
 
15537
-
 
15538
-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
 
15539
-vget_low_p8 (poly8x16_t a)
 
15540
-{
 
15541
-  poly8x8_t result;
 
15542
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15543
-           : "=w"(result)
 
15544
-           : "w"(a)
 
15545
-           : /* No clobbers */);
 
15546
-  return result;
 
15547
-}
 
15548
-
 
15549
-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
 
15550
-vget_low_p16 (poly16x8_t a)
 
15551
-{
 
15552
-  poly16x4_t result;
 
15553
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15554
-           : "=w"(result)
 
15555
-           : "w"(a)
 
15556
-           : /* No clobbers */);
 
15557
-  return result;
 
15558
-}
 
15559
-
 
15560
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
15561
-vget_low_s8 (int8x16_t a)
 
15562
-{
 
15563
-  int8x8_t result;
 
15564
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15565
-           : "=w"(result)
 
15566
-           : "w"(a)
 
15567
-           : /* No clobbers */);
 
15568
-  return result;
 
15569
-}
 
15570
-
 
15571
-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
15572
-vget_low_s16 (int16x8_t a)
 
15573
-{
 
15574
-  int16x4_t result;
 
15575
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15576
-           : "=w"(result)
 
15577
-           : "w"(a)
 
15578
-           : /* No clobbers */);
 
15579
-  return result;
 
15580
-}
 
15581
-
 
15582
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
15583
-vget_low_s32 (int32x4_t a)
 
15584
-{
 
15585
-  int32x2_t result;
 
15586
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15587
-           : "=w"(result)
 
15588
-           : "w"(a)
 
15589
-           : /* No clobbers */);
 
15590
-  return result;
 
15591
-}
 
15592
-
 
15593
-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
15594
-vget_low_s64 (int64x2_t a)
 
15595
-{
 
15596
-  int64x1_t result;
 
15597
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15598
-           : "=w"(result)
 
15599
-           : "w"(a)
 
15600
-           : /* No clobbers */);
 
15601
-  return result;
 
15602
-}
 
15603
-
 
15604
-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
15605
-vget_low_u8 (uint8x16_t a)
 
15606
-{
 
15607
-  uint8x8_t result;
 
15608
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15609
-           : "=w"(result)
 
15610
-           : "w"(a)
 
15611
-           : /* No clobbers */);
 
15612
-  return result;
 
15613
-}
 
15614
-
 
15615
-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
15616
-vget_low_u16 (uint16x8_t a)
 
15617
-{
 
15618
-  uint16x4_t result;
 
15619
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15620
-           : "=w"(result)
 
15621
-           : "w"(a)
 
15622
-           : /* No clobbers */);
 
15623
-  return result;
 
15624
-}
 
15625
-
 
15626
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
15627
-vget_low_u32 (uint32x4_t a)
 
15628
-{
 
15629
-  uint32x2_t result;
 
15630
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15631
-           : "=w"(result)
 
15632
-           : "w"(a)
 
15633
-           : /* No clobbers */);
 
15634
-  return result;
 
15635
-}
 
15636
-
 
15637
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
15638
-vget_low_u64 (uint64x2_t a)
 
15639
-{
 
15640
-  uint64x1_t result;
 
15641
-  __asm__ ("ins %0.d[0], %1.d[0]"
 
15642
-           : "=w"(result)
 
15643
-           : "w"(a)
 
15644
-           : /* No clobbers */);
 
15645
-  return result;
 
15646
-}
 
15647
-
 
15648
-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
15649
 vhsub_s8 (int8x8_t a, int8x8_t b)
 
15650
 {
 
15651
   int8x8_t result;
 
15652
@@ -8962,303 +7574,6 @@
 
15653
        result;                                                          \
 
15654
      })
 
15655
 
 
15656
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
15657
-vmaxnm_f32 (float32x2_t a, float32x2_t b)
 
15658
-{
 
15659
-  float32x2_t result;
 
15660
-  __asm__ ("fmaxnm %0.2s,%1.2s,%2.2s"
 
15661
-           : "=w"(result)
 
15662
-           : "w"(a), "w"(b)
 
15663
-           : /* No clobbers */);
 
15664
-  return result;
 
15665
-}
 
15666
-
 
15667
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
15668
-vmaxnmq_f32 (float32x4_t a, float32x4_t b)
 
15669
-{
 
15670
-  float32x4_t result;
 
15671
-  __asm__ ("fmaxnm %0.4s,%1.4s,%2.4s"
 
15672
-           : "=w"(result)
 
15673
-           : "w"(a), "w"(b)
 
15674
-           : /* No clobbers */);
 
15675
-  return result;
 
15676
-}
 
15677
-
 
15678
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
15679
-vmaxnmq_f64 (float64x2_t a, float64x2_t b)
 
15680
-{
 
15681
-  float64x2_t result;
 
15682
-  __asm__ ("fmaxnm %0.2d,%1.2d,%2.2d"
 
15683
-           : "=w"(result)
 
15684
-           : "w"(a), "w"(b)
 
15685
-           : /* No clobbers */);
 
15686
-  return result;
 
15687
-}
 
15688
-
 
15689
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15690
-vmaxnmvq_f32 (float32x4_t a)
 
15691
-{
 
15692
-  float32_t result;
 
15693
-  __asm__ ("fmaxnmv %s0,%1.4s"
 
15694
-           : "=w"(result)
 
15695
-           : "w"(a)
 
15696
-           : /* No clobbers */);
 
15697
-  return result;
 
15698
-}
 
15699
-
 
15700
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
15701
-vmaxv_s8 (int8x8_t a)
 
15702
-{
 
15703
-  int8_t result;
 
15704
-  __asm__ ("smaxv %b0,%1.8b"
 
15705
-           : "=w"(result)
 
15706
-           : "w"(a)
 
15707
-           : /* No clobbers */);
 
15708
-  return result;
 
15709
-}
 
15710
-
 
15711
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
15712
-vmaxv_s16 (int16x4_t a)
 
15713
-{
 
15714
-  int16_t result;
 
15715
-  __asm__ ("smaxv %h0,%1.4h"
 
15716
-           : "=w"(result)
 
15717
-           : "w"(a)
 
15718
-           : /* No clobbers */);
 
15719
-  return result;
 
15720
-}
 
15721
-
 
15722
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
15723
-vmaxv_u8 (uint8x8_t a)
 
15724
-{
 
15725
-  uint8_t result;
 
15726
-  __asm__ ("umaxv %b0,%1.8b"
 
15727
-           : "=w"(result)
 
15728
-           : "w"(a)
 
15729
-           : /* No clobbers */);
 
15730
-  return result;
 
15731
-}
 
15732
-
 
15733
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
15734
-vmaxv_u16 (uint16x4_t a)
 
15735
-{
 
15736
-  uint16_t result;
 
15737
-  __asm__ ("umaxv %h0,%1.4h"
 
15738
-           : "=w"(result)
 
15739
-           : "w"(a)
 
15740
-           : /* No clobbers */);
 
15741
-  return result;
 
15742
-}
 
15743
-
 
15744
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15745
-vmaxvq_f32 (float32x4_t a)
 
15746
-{
 
15747
-  float32_t result;
 
15748
-  __asm__ ("fmaxv %s0,%1.4s"
 
15749
-           : "=w"(result)
 
15750
-           : "w"(a)
 
15751
-           : /* No clobbers */);
 
15752
-  return result;
 
15753
-}
 
15754
-
 
15755
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
15756
-vmaxvq_s8 (int8x16_t a)
 
15757
-{
 
15758
-  int8_t result;
 
15759
-  __asm__ ("smaxv %b0,%1.16b"
 
15760
-           : "=w"(result)
 
15761
-           : "w"(a)
 
15762
-           : /* No clobbers */);
 
15763
-  return result;
 
15764
-}
 
15765
-
 
15766
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
15767
-vmaxvq_s16 (int16x8_t a)
 
15768
-{
 
15769
-  int16_t result;
 
15770
-  __asm__ ("smaxv %h0,%1.8h"
 
15771
-           : "=w"(result)
 
15772
-           : "w"(a)
 
15773
-           : /* No clobbers */);
 
15774
-  return result;
 
15775
-}
 
15776
-
 
15777
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
15778
-vmaxvq_s32 (int32x4_t a)
 
15779
-{
 
15780
-  int32_t result;
 
15781
-  __asm__ ("smaxv %s0,%1.4s"
 
15782
-           : "=w"(result)
 
15783
-           : "w"(a)
 
15784
-           : /* No clobbers */);
 
15785
-  return result;
 
15786
-}
 
15787
-
 
15788
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
15789
-vmaxvq_u8 (uint8x16_t a)
 
15790
-{
 
15791
-  uint8_t result;
 
15792
-  __asm__ ("umaxv %b0,%1.16b"
 
15793
-           : "=w"(result)
 
15794
-           : "w"(a)
 
15795
-           : /* No clobbers */);
 
15796
-  return result;
 
15797
-}
 
15798
-
 
15799
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
15800
-vmaxvq_u16 (uint16x8_t a)
 
15801
-{
 
15802
-  uint16_t result;
 
15803
-  __asm__ ("umaxv %h0,%1.8h"
 
15804
-           : "=w"(result)
 
15805
-           : "w"(a)
 
15806
-           : /* No clobbers */);
 
15807
-  return result;
 
15808
-}
 
15809
-
 
15810
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
15811
-vmaxvq_u32 (uint32x4_t a)
 
15812
-{
 
15813
-  uint32_t result;
 
15814
-  __asm__ ("umaxv %s0,%1.4s"
 
15815
-           : "=w"(result)
 
15816
-           : "w"(a)
 
15817
-           : /* No clobbers */);
 
15818
-  return result;
 
15819
-}
 
15820
-
 
15821
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15822
-vminnmvq_f32 (float32x4_t a)
 
15823
-{
 
15824
-  float32_t result;
 
15825
-  __asm__ ("fminnmv %s0,%1.4s"
 
15826
-           : "=w"(result)
 
15827
-           : "w"(a)
 
15828
-           : /* No clobbers */);
 
15829
-  return result;
 
15830
-}
 
15831
-
 
15832
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
15833
-vminv_s8 (int8x8_t a)
 
15834
-{
 
15835
-  int8_t result;
 
15836
-  __asm__ ("sminv %b0,%1.8b"
 
15837
-           : "=w"(result)
 
15838
-           : "w"(a)
 
15839
-           : /* No clobbers */);
 
15840
-  return result;
 
15841
-}
 
15842
-
 
15843
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
15844
-vminv_s16 (int16x4_t a)
 
15845
-{
 
15846
-  int16_t result;
 
15847
-  __asm__ ("sminv %h0,%1.4h"
 
15848
-           : "=w"(result)
 
15849
-           : "w"(a)
 
15850
-           : /* No clobbers */);
 
15851
-  return result;
 
15852
-}
 
15853
-
 
15854
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
15855
-vminv_u8 (uint8x8_t a)
 
15856
-{
 
15857
-  uint8_t result;
 
15858
-  __asm__ ("uminv %b0,%1.8b"
 
15859
-           : "=w"(result)
 
15860
-           : "w"(a)
 
15861
-           : /* No clobbers */);
 
15862
-  return result;
 
15863
-}
 
15864
-
 
15865
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
15866
-vminv_u16 (uint16x4_t a)
 
15867
-{
 
15868
-  uint16_t result;
 
15869
-  __asm__ ("uminv %h0,%1.4h"
 
15870
-           : "=w"(result)
 
15871
-           : "w"(a)
 
15872
-           : /* No clobbers */);
 
15873
-  return result;
 
15874
-}
 
15875
-
 
15876
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
15877
-vminvq_f32 (float32x4_t a)
 
15878
-{
 
15879
-  float32_t result;
 
15880
-  __asm__ ("fminv %s0,%1.4s"
 
15881
-           : "=w"(result)
 
15882
-           : "w"(a)
 
15883
-           : /* No clobbers */);
 
15884
-  return result;
 
15885
-}
 
15886
-
 
15887
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
15888
-vminvq_s8 (int8x16_t a)
 
15889
-{
 
15890
-  int8_t result;
 
15891
-  __asm__ ("sminv %b0,%1.16b"
 
15892
-           : "=w"(result)
 
15893
-           : "w"(a)
 
15894
-           : /* No clobbers */);
 
15895
-  return result;
 
15896
-}
 
15897
-
 
15898
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
15899
-vminvq_s16 (int16x8_t a)
 
15900
-{
 
15901
-  int16_t result;
 
15902
-  __asm__ ("sminv %h0,%1.8h"
 
15903
-           : "=w"(result)
 
15904
-           : "w"(a)
 
15905
-           : /* No clobbers */);
 
15906
-  return result;
 
15907
-}
 
15908
-
 
15909
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
15910
-vminvq_s32 (int32x4_t a)
 
15911
-{
 
15912
-  int32_t result;
 
15913
-  __asm__ ("sminv %s0,%1.4s"
 
15914
-           : "=w"(result)
 
15915
-           : "w"(a)
 
15916
-           : /* No clobbers */);
 
15917
-  return result;
 
15918
-}
 
15919
-
 
15920
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
15921
-vminvq_u8 (uint8x16_t a)
 
15922
-{
 
15923
-  uint8_t result;
 
15924
-  __asm__ ("uminv %b0,%1.16b"
 
15925
-           : "=w"(result)
 
15926
-           : "w"(a)
 
15927
-           : /* No clobbers */);
 
15928
-  return result;
 
15929
-}
 
15930
-
 
15931
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
15932
-vminvq_u16 (uint16x8_t a)
 
15933
-{
 
15934
-  uint16_t result;
 
15935
-  __asm__ ("uminv %h0,%1.8h"
 
15936
-           : "=w"(result)
 
15937
-           : "w"(a)
 
15938
-           : /* No clobbers */);
 
15939
-  return result;
 
15940
-}
 
15941
-
 
15942
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
15943
-vminvq_u32 (uint32x4_t a)
 
15944
-{
 
15945
-  uint32_t result;
 
15946
-  __asm__ ("uminv %s0,%1.4s"
 
15947
-           : "=w"(result)
 
15948
-           : "w"(a)
 
15949
-           : /* No clobbers */);
 
15950
-  return result;
 
15951
-}
 
15952
-
 
15953
 #define vmla_lane_f32(a, b, c, d)                                       \
 
15954
   __extension__                                                         \
 
15955
     ({                                                                  \
 
15956
@@ -11382,7 +9697,7 @@
 
15957
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
15958
 vmovn_high_s16 (int8x8_t a, int16x8_t b)
 
15959
 {
 
15960
-  int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0)));
 
15961
+  int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
15962
   __asm__ ("xtn2 %0.16b,%1.8h"
 
15963
            : "+w"(result)
 
15964
            : "w"(b)
 
15965
@@ -11393,7 +9708,7 @@
 
15966
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
15967
 vmovn_high_s32 (int16x4_t a, int32x4_t b)
 
15968
 {
 
15969
-  int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0)));
 
15970
+  int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0)));
 
15971
   __asm__ ("xtn2 %0.8h,%1.4s"
 
15972
            : "+w"(result)
 
15973
            : "w"(b)
 
15974
@@ -11404,7 +9719,7 @@
 
15975
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
15976
 vmovn_high_s64 (int32x2_t a, int64x2_t b)
 
15977
 {
 
15978
-  int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0)));
 
15979
+  int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0)));
 
15980
   __asm__ ("xtn2 %0.4s,%1.2d"
 
15981
            : "+w"(result)
 
15982
            : "w"(b)
 
15983
@@ -11415,7 +9730,7 @@
 
15984
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
15985
 vmovn_high_u16 (uint8x8_t a, uint16x8_t b)
 
15986
 {
 
15987
-  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0)));
 
15988
+  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
15989
   __asm__ ("xtn2 %0.16b,%1.8h"
 
15990
            : "+w"(result)
 
15991
            : "w"(b)
 
15992
@@ -11426,7 +9741,7 @@
 
15993
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
15994
 vmovn_high_u32 (uint16x4_t a, uint32x4_t b)
 
15995
 {
 
15996
-  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0)));
 
15997
+  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0)));
 
15998
   __asm__ ("xtn2 %0.8h,%1.4s"
 
15999
            : "+w"(result)
 
16000
            : "w"(b)
 
16001
@@ -11437,7 +9752,7 @@
 
16002
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16003
 vmovn_high_u64 (uint32x2_t a, uint64x2_t b)
 
16004
 {
 
16005
-  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0)));
 
16006
+  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0)));
 
16007
   __asm__ ("xtn2 %0.4s,%1.2d"
 
16008
            : "+w"(result)
 
16009
            : "w"(b)
 
16010
@@ -13856,7 +12171,7 @@
 
16011
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
16012
 vqmovn_high_s16 (int8x8_t a, int16x8_t b)
 
16013
 {
 
16014
-  int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0)));
 
16015
+  int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16016
   __asm__ ("sqxtn2 %0.16b, %1.8h"
 
16017
            : "+w"(result)
 
16018
            : "w"(b)
 
16019
@@ -13867,7 +12182,7 @@
 
16020
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
16021
 vqmovn_high_s32 (int16x4_t a, int32x4_t b)
 
16022
 {
 
16023
-  int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0)));
 
16024
+  int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0)));
 
16025
   __asm__ ("sqxtn2 %0.8h, %1.4s"
 
16026
            : "+w"(result)
 
16027
            : "w"(b)
 
16028
@@ -13878,7 +12193,7 @@
 
16029
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
16030
 vqmovn_high_s64 (int32x2_t a, int64x2_t b)
 
16031
 {
 
16032
-  int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0)));
 
16033
+  int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0)));
 
16034
   __asm__ ("sqxtn2 %0.4s, %1.2d"
 
16035
            : "+w"(result)
 
16036
            : "w"(b)
 
16037
@@ -13889,7 +12204,7 @@
 
16038
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
16039
 vqmovn_high_u16 (uint8x8_t a, uint16x8_t b)
 
16040
 {
 
16041
-  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0)));
 
16042
+  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16043
   __asm__ ("uqxtn2 %0.16b, %1.8h"
 
16044
            : "+w"(result)
 
16045
            : "w"(b)
 
16046
@@ -13900,7 +12215,7 @@
 
16047
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
16048
 vqmovn_high_u32 (uint16x4_t a, uint32x4_t b)
 
16049
 {
 
16050
-  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0)));
 
16051
+  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0)));
 
16052
   __asm__ ("uqxtn2 %0.8h, %1.4s"
 
16053
            : "+w"(result)
 
16054
            : "w"(b)
 
16055
@@ -13911,7 +12226,7 @@
 
16056
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16057
 vqmovn_high_u64 (uint32x2_t a, uint64x2_t b)
 
16058
 {
 
16059
-  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0)));
 
16060
+  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0)));
 
16061
   __asm__ ("uqxtn2 %0.4s, %1.2d"
 
16062
            : "+w"(result)
 
16063
            : "w"(b)
 
16064
@@ -13922,7 +12237,7 @@
 
16065
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
16066
 vqmovun_high_s16 (uint8x8_t a, int16x8_t b)
 
16067
 {
 
16068
-  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0)));
 
16069
+  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16070
   __asm__ ("sqxtun2 %0.16b, %1.8h"
 
16071
            : "+w"(result)
 
16072
            : "w"(b)
 
16073
@@ -13933,7 +12248,7 @@
 
16074
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
16075
 vqmovun_high_s32 (uint16x4_t a, int32x4_t b)
 
16076
 {
 
16077
-  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0)));
 
16078
+  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0)));
 
16079
   __asm__ ("sqxtun2 %0.8h, %1.4s"
 
16080
            : "+w"(result)
 
16081
            : "w"(b)
 
16082
@@ -13944,7 +12259,7 @@
 
16083
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16084
 vqmovun_high_s64 (uint32x2_t a, int64x2_t b)
 
16085
 {
 
16086
-  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0)));
 
16087
+  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0)));
 
16088
   __asm__ ("sqxtun2 %0.4s, %1.2d"
 
16089
            : "+w"(result)
 
16090
            : "w"(b)
 
16091
@@ -14002,7 +12317,8 @@
 
16092
        int16x8_t b_ = (b);                                              \
 
16093
        int8x8_t a_ = (a);                                               \
 
16094
        int8x16_t result = vcombine_s8                                   \
 
16095
-                            (a_, vcreate_s8 (UINT64_C (0x0)));          \
 
16096
+                            (a_, vcreate_s8                             \
 
16097
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16098
        __asm__ ("sqrshrn2 %0.16b, %1.8h, #%2"                           \
 
16099
                 : "+w"(result)                                          \
 
16100
                 : "w"(b_), "i"(c)                                       \
 
16101
@@ -14016,7 +12332,8 @@
 
16102
        int32x4_t b_ = (b);                                              \
 
16103
        int16x4_t a_ = (a);                                              \
 
16104
        int16x8_t result = vcombine_s16                                  \
 
16105
-                            (a_, vcreate_s16 (UINT64_C (0x0)));         \
 
16106
+                            (a_, vcreate_s16                            \
 
16107
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16108
        __asm__ ("sqrshrn2 %0.8h, %1.4s, #%2"                            \
 
16109
                 : "+w"(result)                                          \
 
16110
                 : "w"(b_), "i"(c)                                       \
 
16111
@@ -14030,7 +12347,8 @@
 
16112
        int64x2_t b_ = (b);                                              \
 
16113
        int32x2_t a_ = (a);                                              \
 
16114
        int32x4_t result = vcombine_s32                                  \
 
16115
-                            (a_, vcreate_s32 (UINT64_C (0x0)));         \
 
16116
+                            (a_, vcreate_s32                            \
 
16117
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16118
        __asm__ ("sqrshrn2 %0.4s, %1.2d, #%2"                            \
 
16119
                 : "+w"(result)                                          \
 
16120
                 : "w"(b_), "i"(c)                                       \
 
16121
@@ -14044,7 +12362,8 @@
 
16122
        uint16x8_t b_ = (b);                                             \
 
16123
        uint8x8_t a_ = (a);                                              \
 
16124
        uint8x16_t result = vcombine_u8                                  \
 
16125
-                             (a_, vcreate_u8 (UINT64_C (0x0)));         \
 
16126
+                             (a_, vcreate_u8                            \
 
16127
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16128
        __asm__ ("uqrshrn2 %0.16b, %1.8h, #%2"                           \
 
16129
                 : "+w"(result)                                          \
 
16130
                 : "w"(b_), "i"(c)                                       \
 
16131
@@ -14058,7 +12377,8 @@
 
16132
        uint32x4_t b_ = (b);                                             \
 
16133
        uint16x4_t a_ = (a);                                             \
 
16134
        uint16x8_t result = vcombine_u16                                 \
 
16135
-                             (a_, vcreate_u16 (UINT64_C (0x0)));        \
 
16136
+                             (a_, vcreate_u16                           \
 
16137
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16138
        __asm__ ("uqrshrn2 %0.8h, %1.4s, #%2"                            \
 
16139
                 : "+w"(result)                                          \
 
16140
                 : "w"(b_), "i"(c)                                       \
 
16141
@@ -14072,7 +12392,8 @@
 
16142
        uint64x2_t b_ = (b);                                             \
 
16143
        uint32x2_t a_ = (a);                                             \
 
16144
        uint32x4_t result = vcombine_u32                                 \
 
16145
-                             (a_, vcreate_u32 (UINT64_C (0x0)));        \
 
16146
+                             (a_, vcreate_u32                           \
 
16147
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16148
        __asm__ ("uqrshrn2 %0.4s, %1.2d, #%2"                            \
 
16149
                 : "+w"(result)                                          \
 
16150
                 : "w"(b_), "i"(c)                                       \
 
16151
@@ -14086,7 +12407,8 @@
 
16152
        int16x8_t b_ = (b);                                              \
 
16153
        uint8x8_t a_ = (a);                                              \
 
16154
        uint8x16_t result = vcombine_u8                                  \
 
16155
-                             (a_, vcreate_u8 (UINT64_C (0x0)));         \
 
16156
+                             (a_, vcreate_u8                            \
 
16157
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16158
        __asm__ ("sqrshrun2 %0.16b, %1.8h, #%2"                          \
 
16159
                 : "+w"(result)                                          \
 
16160
                 : "w"(b_), "i"(c)                                       \
 
16161
@@ -14100,7 +12422,8 @@
 
16162
        int32x4_t b_ = (b);                                              \
 
16163
        uint16x4_t a_ = (a);                                             \
 
16164
        uint16x8_t result = vcombine_u16                                 \
 
16165
-                             (a_, vcreate_u16 (UINT64_C (0x0)));        \
 
16166
+                             (a_, vcreate_u16                           \
 
16167
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16168
        __asm__ ("sqrshrun2 %0.8h, %1.4s, #%2"                           \
 
16169
                 : "+w"(result)                                          \
 
16170
                 : "w"(b_), "i"(c)                                       \
 
16171
@@ -14114,7 +12437,8 @@
 
16172
        int64x2_t b_ = (b);                                              \
 
16173
        uint32x2_t a_ = (a);                                             \
 
16174
        uint32x4_t result = vcombine_u32                                 \
 
16175
-                             (a_, vcreate_u32 (UINT64_C (0x0)));        \
 
16176
+                             (a_, vcreate_u32                           \
 
16177
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16178
        __asm__ ("sqrshrun2 %0.4s, %1.2d, #%2"                           \
 
16179
                 : "+w"(result)                                          \
 
16180
                 : "w"(b_), "i"(c)                                       \
 
16181
@@ -14128,7 +12452,8 @@
 
16182
        int16x8_t b_ = (b);                                              \
 
16183
        int8x8_t a_ = (a);                                               \
 
16184
        int8x16_t result = vcombine_s8                                   \
 
16185
-                            (a_, vcreate_s8 (UINT64_C (0x0)));          \
 
16186
+                            (a_, vcreate_s8                             \
 
16187
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16188
        __asm__ ("sqshrn2 %0.16b, %1.8h, #%2"                            \
 
16189
                 : "+w"(result)                                          \
 
16190
                 : "w"(b_), "i"(c)                                       \
 
16191
@@ -14142,7 +12467,8 @@
 
16192
        int32x4_t b_ = (b);                                              \
 
16193
        int16x4_t a_ = (a);                                              \
 
16194
        int16x8_t result = vcombine_s16                                  \
 
16195
-                            (a_, vcreate_s16 (UINT64_C (0x0)));         \
 
16196
+                            (a_, vcreate_s16                            \
 
16197
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16198
        __asm__ ("sqshrn2 %0.8h, %1.4s, #%2"                             \
 
16199
                 : "+w"(result)                                          \
 
16200
                 : "w"(b_), "i"(c)                                       \
 
16201
@@ -14156,7 +12482,8 @@
 
16202
        int64x2_t b_ = (b);                                              \
 
16203
        int32x2_t a_ = (a);                                              \
 
16204
        int32x4_t result = vcombine_s32                                  \
 
16205
-                            (a_, vcreate_s32 (UINT64_C (0x0)));         \
 
16206
+                            (a_, vcreate_s32                            \
 
16207
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16208
        __asm__ ("sqshrn2 %0.4s, %1.2d, #%2"                             \
 
16209
                 : "+w"(result)                                          \
 
16210
                 : "w"(b_), "i"(c)                                       \
 
16211
@@ -14170,7 +12497,8 @@
 
16212
        uint16x8_t b_ = (b);                                             \
 
16213
        uint8x8_t a_ = (a);                                              \
 
16214
        uint8x16_t result = vcombine_u8                                  \
 
16215
-                             (a_, vcreate_u8 (UINT64_C (0x0)));         \
 
16216
+                             (a_, vcreate_u8                            \
 
16217
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16218
        __asm__ ("uqshrn2 %0.16b, %1.8h, #%2"                            \
 
16219
                 : "+w"(result)                                          \
 
16220
                 : "w"(b_), "i"(c)                                       \
 
16221
@@ -14184,7 +12512,8 @@
 
16222
        uint32x4_t b_ = (b);                                             \
 
16223
        uint16x4_t a_ = (a);                                             \
 
16224
        uint16x8_t result = vcombine_u16                                 \
 
16225
-                             (a_, vcreate_u16 (UINT64_C (0x0)));        \
 
16226
+                             (a_, vcreate_u16                           \
 
16227
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16228
        __asm__ ("uqshrn2 %0.8h, %1.4s, #%2"                             \
 
16229
                 : "+w"(result)                                          \
 
16230
                 : "w"(b_), "i"(c)                                       \
 
16231
@@ -14198,7 +12527,8 @@
 
16232
        uint64x2_t b_ = (b);                                             \
 
16233
        uint32x2_t a_ = (a);                                             \
 
16234
        uint32x4_t result = vcombine_u32                                 \
 
16235
-                             (a_, vcreate_u32 (UINT64_C (0x0)));        \
 
16236
+                             (a_, vcreate_u32                           \
 
16237
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16238
        __asm__ ("uqshrn2 %0.4s, %1.2d, #%2"                             \
 
16239
                 : "+w"(result)                                          \
 
16240
                 : "w"(b_), "i"(c)                                       \
 
16241
@@ -14212,7 +12542,8 @@
 
16242
        int16x8_t b_ = (b);                                              \
 
16243
        uint8x8_t a_ = (a);                                              \
 
16244
        uint8x16_t result = vcombine_u8                                  \
 
16245
-                             (a_, vcreate_u8 (UINT64_C (0x0)));         \
 
16246
+                             (a_, vcreate_u8                            \
 
16247
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16248
        __asm__ ("sqshrun2 %0.16b, %1.8h, #%2"                           \
 
16249
                 : "+w"(result)                                          \
 
16250
                 : "w"(b_), "i"(c)                                       \
 
16251
@@ -14226,7 +12557,8 @@
 
16252
        int32x4_t b_ = (b);                                              \
 
16253
        uint16x4_t a_ = (a);                                             \
 
16254
        uint16x8_t result = vcombine_u16                                 \
 
16255
-                             (a_, vcreate_u16 (UINT64_C (0x0)));        \
 
16256
+                             (a_, vcreate_u16                           \
 
16257
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16258
        __asm__ ("sqshrun2 %0.8h, %1.4s, #%2"                            \
 
16259
                 : "+w"(result)                                          \
 
16260
                 : "w"(b_), "i"(c)                                       \
 
16261
@@ -14240,7 +12572,8 @@
 
16262
        int64x2_t b_ = (b);                                              \
 
16263
        uint32x2_t a_ = (a);                                             \
 
16264
        uint32x4_t result = vcombine_u32                                 \
 
16265
-                             (a_, vcreate_u32 (UINT64_C (0x0)));        \
 
16266
+                             (a_, vcreate_u32                           \
 
16267
+                                    (__AARCH64_UINT64_C (0x0)));        \
 
16268
        __asm__ ("sqshrun2 %0.4s, %1.2d, #%2"                            \
 
16269
                 : "+w"(result)                                          \
 
16270
                 : "w"(b_), "i"(c)                                       \
 
16271
@@ -14292,17 +12625,6 @@
 
16272
   return result;
 
16273
 }
 
16274
 
 
16275
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16276
-vrecpe_f32 (float32x2_t a)
 
16277
-{
 
16278
-  float32x2_t result;
 
16279
-  __asm__ ("frecpe %0.2s,%1.2s"
 
16280
-           : "=w"(result)
 
16281
-           : "w"(a)
 
16282
-           : /* No clobbers */);
 
16283
-  return result;
 
16284
-}
 
16285
-
 
16286
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
16287
 vrecpe_u32 (uint32x2_t a)
 
16288
 {
 
16289
@@ -14314,39 +12636,6 @@
 
16290
   return result;
 
16291
 }
 
16292
 
 
16293
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
16294
-vrecped_f64 (float64_t a)
 
16295
-{
 
16296
-  float64_t result;
 
16297
-  __asm__ ("frecpe %d0,%d1"
 
16298
-           : "=w"(result)
 
16299
-           : "w"(a)
 
16300
-           : /* No clobbers */);
 
16301
-  return result;
 
16302
-}
 
16303
-
 
16304
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16305
-vrecpeq_f32 (float32x4_t a)
 
16306
-{
 
16307
-  float32x4_t result;
 
16308
-  __asm__ ("frecpe %0.4s,%1.4s"
 
16309
-           : "=w"(result)
 
16310
-           : "w"(a)
 
16311
-           : /* No clobbers */);
 
16312
-  return result;
 
16313
-}
 
16314
-
 
16315
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16316
-vrecpeq_f64 (float64x2_t a)
 
16317
-{
 
16318
-  float64x2_t result;
 
16319
-  __asm__ ("frecpe %0.2d,%1.2d"
 
16320
-           : "=w"(result)
 
16321
-           : "w"(a)
 
16322
-           : /* No clobbers */);
 
16323
-  return result;
 
16324
-}
 
16325
-
 
16326
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16327
 vrecpeq_u32 (uint32x4_t a)
 
16328
 {
 
16329
@@ -14358,94 +12647,6 @@
 
16330
   return result;
 
16331
 }
 
16332
 
 
16333
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
16334
-vrecpes_f32 (float32_t a)
 
16335
-{
 
16336
-  float32_t result;
 
16337
-  __asm__ ("frecpe %s0,%s1"
 
16338
-           : "=w"(result)
 
16339
-           : "w"(a)
 
16340
-           : /* No clobbers */);
 
16341
-  return result;
 
16342
-}
 
16343
-
 
16344
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16345
-vrecps_f32 (float32x2_t a, float32x2_t b)
 
16346
-{
 
16347
-  float32x2_t result;
 
16348
-  __asm__ ("frecps %0.2s,%1.2s,%2.2s"
 
16349
-           : "=w"(result)
 
16350
-           : "w"(a), "w"(b)
 
16351
-           : /* No clobbers */);
 
16352
-  return result;
 
16353
-}
 
16354
-
 
16355
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
16356
-vrecpsd_f64 (float64_t a, float64_t b)
 
16357
-{
 
16358
-  float64_t result;
 
16359
-  __asm__ ("frecps %d0,%d1,%d2"
 
16360
-           : "=w"(result)
 
16361
-           : "w"(a), "w"(b)
 
16362
-           : /* No clobbers */);
 
16363
-  return result;
 
16364
-}
 
16365
-
 
16366
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16367
-vrecpsq_f32 (float32x4_t a, float32x4_t b)
 
16368
-{
 
16369
-  float32x4_t result;
 
16370
-  __asm__ ("frecps %0.4s,%1.4s,%2.4s"
 
16371
-           : "=w"(result)
 
16372
-           : "w"(a), "w"(b)
 
16373
-           : /* No clobbers */);
 
16374
-  return result;
 
16375
-}
 
16376
-
 
16377
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16378
-vrecpsq_f64 (float64x2_t a, float64x2_t b)
 
16379
-{
 
16380
-  float64x2_t result;
 
16381
-  __asm__ ("frecps %0.2d,%1.2d,%2.2d"
 
16382
-           : "=w"(result)
 
16383
-           : "w"(a), "w"(b)
 
16384
-           : /* No clobbers */);
 
16385
-  return result;
 
16386
-}
 
16387
-
 
16388
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
16389
-vrecpss_f32 (float32_t a, float32_t b)
 
16390
-{
 
16391
-  float32_t result;
 
16392
-  __asm__ ("frecps %s0,%s1,%s2"
 
16393
-           : "=w"(result)
 
16394
-           : "w"(a), "w"(b)
 
16395
-           : /* No clobbers */);
 
16396
-  return result;
 
16397
-}
 
16398
-
 
16399
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
16400
-vrecpxd_f64 (float64_t a)
 
16401
-{
 
16402
-  float64_t result;
 
16403
-  __asm__ ("frecpe %d0,%d1"
 
16404
-           : "=w"(result)
 
16405
-           : "w"(a)
 
16406
-           : /* No clobbers */);
 
16407
-  return result;
 
16408
-}
 
16409
-
 
16410
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
16411
-vrecpxs_f32 (float32_t a)
 
16412
-{
 
16413
-  float32_t result;
 
16414
-  __asm__ ("frecpe %s0,%s1"
 
16415
-           : "=w"(result)
 
16416
-           : "w"(a)
 
16417
-           : /* No clobbers */);
 
16418
-  return result;
 
16419
-}
 
16420
-
 
16421
 __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
 
16422
 vrev16_p8 (poly8x8_t a)
 
16423
 {
 
16424
@@ -14842,178 +13043,14 @@
 
16425
   return result;
 
16426
 }
 
16427
 
 
16428
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16429
-vrnd_f32 (float32x2_t a)
 
16430
-{
 
16431
-  float32x2_t result;
 
16432
-  __asm__ ("frintz %0.2s,%1.2s"
 
16433
-           : "=w"(result)
 
16434
-           : "w"(a)
 
16435
-           : /* No clobbers */);
 
16436
-  return result;
 
16437
-}
 
16438
-
 
16439
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16440
-vrnda_f32 (float32x2_t a)
 
16441
-{
 
16442
-  float32x2_t result;
 
16443
-  __asm__ ("frinta %0.2s,%1.2s"
 
16444
-           : "=w"(result)
 
16445
-           : "w"(a)
 
16446
-           : /* No clobbers */);
 
16447
-  return result;
 
16448
-}
 
16449
-
 
16450
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16451
-vrndm_f32 (float32x2_t a)
 
16452
-{
 
16453
-  float32x2_t result;
 
16454
-  __asm__ ("frintm %0.2s,%1.2s"
 
16455
-           : "=w"(result)
 
16456
-           : "w"(a)
 
16457
-           : /* No clobbers */);
 
16458
-  return result;
 
16459
-}
 
16460
-
 
16461
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16462
-vrndn_f32 (float32x2_t a)
 
16463
-{
 
16464
-  float32x2_t result;
 
16465
-  __asm__ ("frintn %0.2s,%1.2s"
 
16466
-           : "=w"(result)
 
16467
-           : "w"(a)
 
16468
-           : /* No clobbers */);
 
16469
-  return result;
 
16470
-}
 
16471
-
 
16472
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
16473
-vrndp_f32 (float32x2_t a)
 
16474
-{
 
16475
-  float32x2_t result;
 
16476
-  __asm__ ("frintp %0.2s,%1.2s"
 
16477
-           : "=w"(result)
 
16478
-           : "w"(a)
 
16479
-           : /* No clobbers */);
 
16480
-  return result;
 
16481
-}
 
16482
-
 
16483
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16484
-vrndq_f32 (float32x4_t a)
 
16485
-{
 
16486
-  float32x4_t result;
 
16487
-  __asm__ ("frintz %0.4s,%1.4s"
 
16488
-           : "=w"(result)
 
16489
-           : "w"(a)
 
16490
-           : /* No clobbers */);
 
16491
-  return result;
 
16492
-}
 
16493
-
 
16494
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16495
-vrndq_f64 (float64x2_t a)
 
16496
-{
 
16497
-  float64x2_t result;
 
16498
-  __asm__ ("frintz %0.2d,%1.2d"
 
16499
-           : "=w"(result)
 
16500
-           : "w"(a)
 
16501
-           : /* No clobbers */);
 
16502
-  return result;
 
16503
-}
 
16504
-
 
16505
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16506
-vrndqa_f32 (float32x4_t a)
 
16507
-{
 
16508
-  float32x4_t result;
 
16509
-  __asm__ ("frinta %0.4s,%1.4s"
 
16510
-           : "=w"(result)
 
16511
-           : "w"(a)
 
16512
-           : /* No clobbers */);
 
16513
-  return result;
 
16514
-}
 
16515
-
 
16516
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16517
-vrndqa_f64 (float64x2_t a)
 
16518
-{
 
16519
-  float64x2_t result;
 
16520
-  __asm__ ("frinta %0.2d,%1.2d"
 
16521
-           : "=w"(result)
 
16522
-           : "w"(a)
 
16523
-           : /* No clobbers */);
 
16524
-  return result;
 
16525
-}
 
16526
-
 
16527
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16528
-vrndqm_f32 (float32x4_t a)
 
16529
-{
 
16530
-  float32x4_t result;
 
16531
-  __asm__ ("frintm %0.4s,%1.4s"
 
16532
-           : "=w"(result)
 
16533
-           : "w"(a)
 
16534
-           : /* No clobbers */);
 
16535
-  return result;
 
16536
-}
 
16537
-
 
16538
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16539
-vrndqm_f64 (float64x2_t a)
 
16540
-{
 
16541
-  float64x2_t result;
 
16542
-  __asm__ ("frintm %0.2d,%1.2d"
 
16543
-           : "=w"(result)
 
16544
-           : "w"(a)
 
16545
-           : /* No clobbers */);
 
16546
-  return result;
 
16547
-}
 
16548
-
 
16549
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16550
-vrndqn_f32 (float32x4_t a)
 
16551
-{
 
16552
-  float32x4_t result;
 
16553
-  __asm__ ("frintn %0.4s,%1.4s"
 
16554
-           : "=w"(result)
 
16555
-           : "w"(a)
 
16556
-           : /* No clobbers */);
 
16557
-  return result;
 
16558
-}
 
16559
-
 
16560
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16561
-vrndqn_f64 (float64x2_t a)
 
16562
-{
 
16563
-  float64x2_t result;
 
16564
-  __asm__ ("frintn %0.2d,%1.2d"
 
16565
-           : "=w"(result)
 
16566
-           : "w"(a)
 
16567
-           : /* No clobbers */);
 
16568
-  return result;
 
16569
-}
 
16570
-
 
16571
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
16572
-vrndqp_f32 (float32x4_t a)
 
16573
-{
 
16574
-  float32x4_t result;
 
16575
-  __asm__ ("frintp %0.4s,%1.4s"
 
16576
-           : "=w"(result)
 
16577
-           : "w"(a)
 
16578
-           : /* No clobbers */);
 
16579
-  return result;
 
16580
-}
 
16581
-
 
16582
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
16583
-vrndqp_f64 (float64x2_t a)
 
16584
-{
 
16585
-  float64x2_t result;
 
16586
-  __asm__ ("frintp %0.2d,%1.2d"
 
16587
-           : "=w"(result)
 
16588
-           : "w"(a)
 
16589
-           : /* No clobbers */);
 
16590
-  return result;
 
16591
-}
 
16592
-
 
16593
 #define vrshrn_high_n_s16(a, b, c)                                      \
 
16594
   __extension__                                                         \
 
16595
     ({                                                                  \
 
16596
        int16x8_t b_ = (b);                                              \
 
16597
        int8x8_t a_ = (a);                                               \
 
16598
        int8x16_t result = vcombine_s8                                   \
 
16599
-                            (a_, vcreate_s8 (UINT64_C (0x0)));          \
 
16600
+                            (a_, vcreate_s8                             \
 
16601
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16602
        __asm__ ("rshrn2 %0.16b,%1.8h,#%2"                               \
 
16603
                 : "+w"(result)                                          \
 
16604
                 : "w"(b_), "i"(c)                                       \
 
16605
@@ -15027,7 +13064,8 @@
 
16606
        int32x4_t b_ = (b);                                              \
 
16607
        int16x4_t a_ = (a);                                              \
 
16608
        int16x8_t result = vcombine_s16                                  \
 
16609
-                            (a_, vcreate_s16 (UINT64_C (0x0)));         \
 
16610
+                            (a_, vcreate_s16                            \
 
16611
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16612
        __asm__ ("rshrn2 %0.8h,%1.4s,#%2"                                \
 
16613
                 : "+w"(result)                                          \
 
16614
                 : "w"(b_), "i"(c)                                       \
 
16615
@@ -15041,7 +13079,8 @@
 
16616
        int64x2_t b_ = (b);                                              \
 
16617
        int32x2_t a_ = (a);                                              \
 
16618
        int32x4_t result = vcombine_s32                                  \
 
16619
-                            (a_, vcreate_s32 (UINT64_C (0x0)));         \
 
16620
+                            (a_, vcreate_s32                            \
 
16621
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16622
        __asm__ ("rshrn2 %0.4s,%1.2d,#%2"                                \
 
16623
                 : "+w"(result)                                          \
 
16624
                 : "w"(b_), "i"(c)                                       \
 
16625
@@ -15055,7 +13094,8 @@
 
16626
        uint16x8_t b_ = (b);                                             \
 
16627
        uint8x8_t a_ = (a);                                              \
 
16628
        uint8x16_t result = vcombine_u8                                  \
 
16629
-                            (a_, vcreate_u8 (UINT64_C (0x0)));          \
 
16630
+                            (a_, vcreate_u8                             \
 
16631
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16632
        __asm__ ("rshrn2 %0.16b,%1.8h,#%2"                               \
 
16633
                 : "+w"(result)                                          \
 
16634
                 : "w"(b_), "i"(c)                                       \
 
16635
@@ -15069,7 +13109,8 @@
 
16636
        uint32x4_t b_ = (b);                                             \
 
16637
        uint16x4_t a_ = (a);                                             \
 
16638
        uint16x8_t result = vcombine_u16                                 \
 
16639
-                            (a_, vcreate_u16 (UINT64_C (0x0)));         \
 
16640
+                            (a_, vcreate_u16                            \
 
16641
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16642
        __asm__ ("rshrn2 %0.8h,%1.4s,#%2"                                \
 
16643
                 : "+w"(result)                                          \
 
16644
                 : "w"(b_), "i"(c)                                       \
 
16645
@@ -15083,7 +13124,8 @@
 
16646
        uint64x2_t b_ = (b);                                             \
 
16647
        uint32x2_t a_ = (a);                                             \
 
16648
        uint32x4_t result = vcombine_u32                                 \
 
16649
-                            (a_, vcreate_u32 (UINT64_C (0x0)));         \
 
16650
+                            (a_, vcreate_u32                            \
 
16651
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16652
        __asm__ ("rshrn2 %0.4s,%1.2d,#%2"                                \
 
16653
                 : "+w"(result)                                          \
 
16654
                 : "w"(b_), "i"(c)                                       \
 
16655
@@ -15320,7 +13362,7 @@
 
16656
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
16657
 vrsubhn_high_s16 (int8x8_t a, int16x8_t b, int16x8_t c)
 
16658
 {
 
16659
-  int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0)));
 
16660
+  int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16661
   __asm__ ("rsubhn2 %0.16b, %1.8h, %2.8h"
 
16662
            : "+w"(result)
 
16663
            : "w"(b), "w"(c)
 
16664
@@ -15331,7 +13373,7 @@
 
16665
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
16666
 vrsubhn_high_s32 (int16x4_t a, int32x4_t b, int32x4_t c)
 
16667
 {
 
16668
-  int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0)));
 
16669
+  int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0)));
 
16670
   __asm__ ("rsubhn2 %0.8h, %1.4s, %2.4s"
 
16671
            : "+w"(result)
 
16672
            : "w"(b), "w"(c)
 
16673
@@ -15342,7 +13384,7 @@
 
16674
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
16675
 vrsubhn_high_s64 (int32x2_t a, int64x2_t b, int64x2_t c)
 
16676
 {
 
16677
-  int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0)));
 
16678
+  int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0)));
 
16679
   __asm__ ("rsubhn2 %0.4s, %1.2d, %2.2d"
 
16680
            : "+w"(result)
 
16681
            : "w"(b), "w"(c)
 
16682
@@ -15353,7 +13395,7 @@
 
16683
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
16684
 vrsubhn_high_u16 (uint8x8_t a, uint16x8_t b, uint16x8_t c)
 
16685
 {
 
16686
-  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0)));
 
16687
+  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16688
   __asm__ ("rsubhn2 %0.16b, %1.8h, %2.8h"
 
16689
            : "+w"(result)
 
16690
            : "w"(b), "w"(c)
 
16691
@@ -15364,7 +13406,7 @@
 
16692
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
16693
 vrsubhn_high_u32 (uint16x4_t a, uint32x4_t b, uint32x4_t c)
 
16694
 {
 
16695
-  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0)));
 
16696
+  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0)));
 
16697
   __asm__ ("rsubhn2 %0.8h, %1.4s, %2.4s"
 
16698
            : "+w"(result)
 
16699
            : "w"(b), "w"(c)
 
16700
@@ -15375,7 +13417,7 @@
 
16701
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16702
 vrsubhn_high_u64 (uint32x2_t a, uint64x2_t b, uint64x2_t c)
 
16703
 {
 
16704
-  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0)));
 
16705
+  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0)));
 
16706
   __asm__ ("rsubhn2 %0.4s, %1.2d, %2.2d"
 
16707
            : "+w"(result)
 
16708
            : "w"(b), "w"(c)
 
16709
@@ -15767,7 +13809,8 @@
 
16710
        int16x8_t b_ = (b);                                              \
 
16711
        int8x8_t a_ = (a);                                               \
 
16712
        int8x16_t result = vcombine_s8                                   \
 
16713
-                            (a_, vcreate_s8 (UINT64_C (0x0)));          \
 
16714
+                            (a_, vcreate_s8                             \
 
16715
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16716
        __asm__ ("shrn2 %0.16b,%1.8h,#%2"                                \
 
16717
                 : "+w"(result)                                          \
 
16718
                 : "w"(b_), "i"(c)                                       \
 
16719
@@ -15781,7 +13824,8 @@
 
16720
        int32x4_t b_ = (b);                                              \
 
16721
        int16x4_t a_ = (a);                                              \
 
16722
        int16x8_t result = vcombine_s16                                  \
 
16723
-                            (a_, vcreate_s16 (UINT64_C (0x0)));         \
 
16724
+                            (a_, vcreate_s16                            \
 
16725
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16726
        __asm__ ("shrn2 %0.8h,%1.4s,#%2"                                 \
 
16727
                 : "+w"(result)                                          \
 
16728
                 : "w"(b_), "i"(c)                                       \
 
16729
@@ -15795,7 +13839,8 @@
 
16730
        int64x2_t b_ = (b);                                              \
 
16731
        int32x2_t a_ = (a);                                              \
 
16732
        int32x4_t result = vcombine_s32                                  \
 
16733
-                            (a_, vcreate_s32 (UINT64_C (0x0)));         \
 
16734
+                            (a_, vcreate_s32                            \
 
16735
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16736
        __asm__ ("shrn2 %0.4s,%1.2d,#%2"                                 \
 
16737
                 : "+w"(result)                                          \
 
16738
                 : "w"(b_), "i"(c)                                       \
 
16739
@@ -15809,7 +13854,8 @@
 
16740
        uint16x8_t b_ = (b);                                             \
 
16741
        uint8x8_t a_ = (a);                                              \
 
16742
        uint8x16_t result = vcombine_u8                                  \
 
16743
-                            (a_, vcreate_u8 (UINT64_C (0x0)));          \
 
16744
+                            (a_, vcreate_u8                             \
 
16745
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16746
        __asm__ ("shrn2 %0.16b,%1.8h,#%2"                                \
 
16747
                 : "+w"(result)                                          \
 
16748
                 : "w"(b_), "i"(c)                                       \
 
16749
@@ -15823,7 +13869,8 @@
 
16750
        uint32x4_t b_ = (b);                                             \
 
16751
        uint16x4_t a_ = (a);                                             \
 
16752
        uint16x8_t result = vcombine_u16                                 \
 
16753
-                            (a_, vcreate_u16 (UINT64_C (0x0)));         \
 
16754
+                            (a_, vcreate_u16                            \
 
16755
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16756
        __asm__ ("shrn2 %0.8h,%1.4s,#%2"                                 \
 
16757
                 : "+w"(result)                                          \
 
16758
                 : "w"(b_), "i"(c)                                       \
 
16759
@@ -15837,7 +13884,8 @@
 
16760
        uint64x2_t b_ = (b);                                             \
 
16761
        uint32x2_t a_ = (a);                                             \
 
16762
        uint32x4_t result = vcombine_u32                                 \
 
16763
-                            (a_, vcreate_u32 (UINT64_C (0x0)));         \
 
16764
+                            (a_, vcreate_u32                            \
 
16765
+                                   (__AARCH64_UINT64_C (0x0)));         \
 
16766
        __asm__ ("shrn2 %0.4s,%1.2d,#%2"                                 \
 
16767
                 : "+w"(result)                                          \
 
16768
                 : "w"(b_), "i"(c)                                       \
 
16769
@@ -16289,7 +14337,7 @@
 
16770
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
16771
 vsubhn_high_s16 (int8x8_t a, int16x8_t b, int16x8_t c)
 
16772
 {
 
16773
-  int8x16_t result = vcombine_s8 (a, vcreate_s8 (UINT64_C (0x0)));
 
16774
+  int8x16_t result = vcombine_s8 (a, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16775
   __asm__ ("subhn2 %0.16b, %1.8h, %2.8h"
 
16776
            : "+w"(result)
 
16777
            : "w"(b), "w"(c)
 
16778
@@ -16300,7 +14348,7 @@
 
16779
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
16780
 vsubhn_high_s32 (int16x4_t a, int32x4_t b, int32x4_t c)
 
16781
 {
 
16782
-  int16x8_t result = vcombine_s16 (a, vcreate_s16 (UINT64_C (0x0)));
 
16783
+  int16x8_t result = vcombine_s16 (a, vcreate_s16 (__AARCH64_UINT64_C (0x0)));
 
16784
   __asm__ ("subhn2 %0.8h, %1.4s, %2.4s"
 
16785
            : "+w"(result)
 
16786
            : "w"(b), "w"(c)
 
16787
@@ -16311,7 +14359,7 @@
 
16788
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
16789
 vsubhn_high_s64 (int32x2_t a, int64x2_t b, int64x2_t c)
 
16790
 {
 
16791
-  int32x4_t result = vcombine_s32 (a, vcreate_s32 (UINT64_C (0x0)));
 
16792
+  int32x4_t result = vcombine_s32 (a, vcreate_s32 (__AARCH64_UINT64_C (0x0)));
 
16793
   __asm__ ("subhn2 %0.4s, %1.2d, %2.2d"
 
16794
            : "+w"(result)
 
16795
            : "w"(b), "w"(c)
 
16796
@@ -16322,7 +14370,7 @@
 
16797
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
16798
 vsubhn_high_u16 (uint8x8_t a, uint16x8_t b, uint16x8_t c)
 
16799
 {
 
16800
-  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (UINT64_C (0x0)));
 
16801
+  uint8x16_t result = vcombine_u8 (a, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16802
   __asm__ ("subhn2 %0.16b, %1.8h, %2.8h"
 
16803
            : "+w"(result)
 
16804
            : "w"(b), "w"(c)
 
16805
@@ -16333,7 +14381,7 @@
 
16806
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
16807
 vsubhn_high_u32 (uint16x4_t a, uint32x4_t b, uint32x4_t c)
 
16808
 {
 
16809
-  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (UINT64_C (0x0)));
 
16810
+  uint16x8_t result = vcombine_u16 (a, vcreate_u16 (__AARCH64_UINT64_C (0x0)));
 
16811
   __asm__ ("subhn2 %0.8h, %1.4s, %2.4s"
 
16812
            : "+w"(result)
 
16813
            : "w"(b), "w"(c)
 
16814
@@ -16344,7 +14392,7 @@
 
16815
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
16816
 vsubhn_high_u64 (uint32x2_t a, uint64x2_t b, uint64x2_t c)
 
16817
 {
 
16818
-  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (UINT64_C (0x0)));
 
16819
+  uint32x4_t result = vcombine_u32 (a, vcreate_u32 (__AARCH64_UINT64_C (0x0)));
 
16820
   __asm__ ("subhn2 %0.4s, %1.2d, %2.2d"
 
16821
            : "+w"(result)
 
16822
            : "w"(b), "w"(c)
 
16823
@@ -18309,86 +16357,6 @@
 
16824
   return result;
 
16825
 }
 
16826
 
 
16827
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
16828
-vaddv_s32 (int32x2_t a)
 
16829
-{
 
16830
-  int32_t result;
 
16831
-  __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16832
-  return result;
 
16833
-}
 
16834
-
 
16835
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
16836
-vaddv_u32 (uint32x2_t a)
 
16837
-{
 
16838
-  uint32_t result;
 
16839
-  __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16840
-  return result;
 
16841
-}
 
16842
-
 
16843
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
16844
-vmaxnmv_f32 (float32x2_t a)
 
16845
-{
 
16846
-  float32_t result;
 
16847
-  __asm__ ("fmaxnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16848
-  return result;
 
16849
-}
 
16850
-
 
16851
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
16852
-vminnmv_f32 (float32x2_t a)
 
16853
-{
 
16854
-  float32_t result;
 
16855
-  __asm__ ("fminnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16856
-  return result;
 
16857
-}
 
16858
-
 
16859
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
16860
-vmaxnmvq_f64 (float64x2_t a)
 
16861
-{
 
16862
-  float64_t result;
 
16863
-  __asm__ ("fmaxnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : );
 
16864
-  return result;
 
16865
-}
 
16866
-
 
16867
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
16868
-vmaxv_s32 (int32x2_t a)
 
16869
-{
 
16870
-  int32_t result;
 
16871
-  __asm__ ("smaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16872
-  return result;
 
16873
-}
 
16874
-
 
16875
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
16876
-vmaxv_u32 (uint32x2_t a)
 
16877
-{
 
16878
-  uint32_t result;
 
16879
-  __asm__ ("umaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16880
-  return result;
 
16881
-}
 
16882
-
 
16883
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
16884
-vminnmvq_f64 (float64x2_t a)
 
16885
-{
 
16886
-  float64_t result;
 
16887
-  __asm__ ("fminnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : );
 
16888
-  return result;
 
16889
-}
 
16890
-
 
16891
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
16892
-vminv_s32 (int32x2_t a)
 
16893
-{
 
16894
-  int32_t result;
 
16895
-  __asm__ ("sminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16896
-  return result;
 
16897
-}
 
16898
-
 
16899
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
16900
-vminv_u32 (uint32x2_t a)
 
16901
-{
 
16902
-  uint32_t result;
 
16903
-  __asm__ ("uminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
 
16904
-  return result;
 
16905
-}
 
16906
-
 
16907
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
16908
 vpaddd_s64 (int64x2_t __a)
 
16909
 {
 
16910
@@ -19022,7 +16990,7 @@
 
16911
 vtbl1_s8 (int8x8_t tab, int8x8_t idx)
 
16912
 {
 
16913
   int8x8_t result;
 
16914
-  int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (UINT64_C (0x0)));
 
16915
+  int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16916
   __asm__ ("tbl %0.8b, {%1.16b}, %2.8b"
 
16917
            : "=w"(result)
 
16918
            : "w"(temp), "w"(idx)
 
16919
@@ -19034,7 +17002,7 @@
 
16920
 vtbl1_u8 (uint8x8_t tab, uint8x8_t idx)
 
16921
 {
 
16922
   uint8x8_t result;
 
16923
-  uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (UINT64_C (0x0)));
 
16924
+  uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16925
   __asm__ ("tbl %0.8b, {%1.16b}, %2.8b"
 
16926
            : "=w"(result)
 
16927
            : "w"(temp), "w"(idx)
 
16928
@@ -19046,7 +17014,7 @@
 
16929
 vtbl1_p8 (poly8x8_t tab, uint8x8_t idx)
 
16930
 {
 
16931
   poly8x8_t result;
 
16932
-  poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (UINT64_C (0x0)));
 
16933
+  poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (__AARCH64_UINT64_C (0x0)));
 
16934
   __asm__ ("tbl %0.8b, {%1.16b}, %2.8b"
 
16935
            : "=w"(result)
 
16936
            : "w"(temp), "w"(idx)
 
16937
@@ -19096,7 +17064,7 @@
 
16938
   int8x8_t result;
 
16939
   int8x16x2_t temp;
 
16940
   temp.val[0] = vcombine_s8 (tab.val[0], tab.val[1]);
 
16941
-  temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (UINT64_C (0x0)));
 
16942
+  temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16943
   __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t"
 
16944
           "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t"
 
16945
            : "=w"(result)
 
16946
@@ -19111,7 +17079,7 @@
 
16947
   uint8x8_t result;
 
16948
   uint8x16x2_t temp;
 
16949
   temp.val[0] = vcombine_u8 (tab.val[0], tab.val[1]);
 
16950
-  temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (UINT64_C (0x0)));
 
16951
+  temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16952
   __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t"
 
16953
           "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t"
 
16954
            : "=w"(result)
 
16955
@@ -19126,7 +17094,7 @@
 
16956
   poly8x8_t result;
 
16957
   poly8x16x2_t temp;
 
16958
   temp.val[0] = vcombine_p8 (tab.val[0], tab.val[1]);
 
16959
-  temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (UINT64_C (0x0)));
 
16960
+  temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (__AARCH64_UINT64_C (0x0)));
 
16961
   __asm__ ("ld1 {v16.16b - v17.16b }, %1\n\t"
 
16962
           "tbl %0.8b, {v16.16b - v17.16b}, %2.8b\n\t"
 
16963
            : "=w"(result)
 
16964
@@ -19185,7 +17153,7 @@
 
16965
 {
 
16966
   int8x8_t result;
 
16967
   int8x8_t tmp1;
 
16968
-  int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (UINT64_C (0x0)));
 
16969
+  int8x16_t temp = vcombine_s8 (tab, vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16970
   __asm__ ("movi %0.8b, 8\n\t"
 
16971
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
16972
           "tbl %1.8b, {%2.16b}, %3.8b\n\t"
 
16973
@@ -19201,7 +17169,7 @@
 
16974
 {
 
16975
   uint8x8_t result;
 
16976
   uint8x8_t tmp1;
 
16977
-  uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (UINT64_C (0x0)));
 
16978
+  uint8x16_t temp = vcombine_u8 (tab, vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
16979
   __asm__ ("movi %0.8b, 8\n\t"
 
16980
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
16981
           "tbl %1.8b, {%2.16b}, %3.8b\n\t"
 
16982
@@ -19217,7 +17185,7 @@
 
16983
 {
 
16984
   poly8x8_t result;
 
16985
   poly8x8_t tmp1;
 
16986
-  poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (UINT64_C (0x0)));
 
16987
+  poly8x16_t temp = vcombine_p8 (tab, vcreate_p8 (__AARCH64_UINT64_C (0x0)));
 
16988
   __asm__ ("movi %0.8b, 8\n\t"
 
16989
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
16990
           "tbl %1.8b, {%2.16b}, %3.8b\n\t"
 
16991
@@ -19271,7 +17239,7 @@
 
16992
   int8x8_t tmp1;
 
16993
   int8x16x2_t temp;
 
16994
   temp.val[0] = vcombine_s8 (tab.val[0], tab.val[1]);
 
16995
-  temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (UINT64_C (0x0)));
 
16996
+  temp.val[1] = vcombine_s8 (tab.val[2], vcreate_s8 (__AARCH64_UINT64_C (0x0)));
 
16997
   __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t"
 
16998
           "movi %0.8b, 24\n\t"
 
16999
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
17000
@@ -19290,7 +17258,7 @@
 
17001
   uint8x8_t tmp1;
 
17002
   uint8x16x2_t temp;
 
17003
   temp.val[0] = vcombine_u8 (tab.val[0], tab.val[1]);
 
17004
-  temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (UINT64_C (0x0)));
 
17005
+  temp.val[1] = vcombine_u8 (tab.val[2], vcreate_u8 (__AARCH64_UINT64_C (0x0)));
 
17006
   __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t"
 
17007
           "movi %0.8b, 24\n\t"
 
17008
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
17009
@@ -19309,7 +17277,7 @@
 
17010
   poly8x8_t tmp1;
 
17011
   poly8x16x2_t temp;
 
17012
   temp.val[0] = vcombine_p8 (tab.val[0], tab.val[1]);
 
17013
-  temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (UINT64_C (0x0)));
 
17014
+  temp.val[1] = vcombine_p8 (tab.val[2], vcreate_p8 (__AARCH64_UINT64_C (0x0)));
 
17015
   __asm__ ("ld1 {v16.16b - v17.16b}, %2\n\t"
 
17016
           "movi %0.8b, 24\n\t"
 
17017
           "cmhs %0.8b, %3.8b, %0.8b\n\t"
 
17018
@@ -19370,6 +17338,80 @@
 
17019
 
 
17020
 /* Start of optimal implementations in approved order.  */
 
17021
 
 
17022
+/* vabs  */
 
17023
+
 
17024
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
17025
+vabs_f32 (float32x2_t __a)
 
17026
+{
 
17027
+  return __builtin_aarch64_absv2sf (__a);
 
17028
+}
 
17029
+
 
17030
+__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
 
17031
+vabs_f64 (float64x1_t __a)
 
17032
+{
 
17033
+  return __builtin_fabs (__a);
 
17034
+}
 
17035
+
 
17036
+__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
17037
+vabs_s8 (int8x8_t __a)
 
17038
+{
 
17039
+  return __builtin_aarch64_absv8qi (__a);
 
17040
+}
 
17041
+
 
17042
+__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
17043
+vabs_s16 (int16x4_t __a)
 
17044
+{
 
17045
+  return __builtin_aarch64_absv4hi (__a);
 
17046
+}
 
17047
+
 
17048
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
17049
+vabs_s32 (int32x2_t __a)
 
17050
+{
 
17051
+  return __builtin_aarch64_absv2si (__a);
 
17052
+}
 
17053
+
 
17054
+__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
17055
+vabs_s64 (int64x1_t __a)
 
17056
+{
 
17057
+  return __builtin_llabs (__a);
 
17058
+}
 
17059
+
 
17060
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
17061
+vabsq_f32 (float32x4_t __a)
 
17062
+{
 
17063
+  return __builtin_aarch64_absv4sf (__a);
 
17064
+}
 
17065
+
 
17066
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
17067
+vabsq_f64 (float64x2_t __a)
 
17068
+{
 
17069
+  return __builtin_aarch64_absv2df (__a);
 
17070
+}
 
17071
+
 
17072
+__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
17073
+vabsq_s8 (int8x16_t __a)
 
17074
+{
 
17075
+  return __builtin_aarch64_absv16qi (__a);
 
17076
+}
 
17077
+
 
17078
+__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
17079
+vabsq_s16 (int16x8_t __a)
 
17080
+{
 
17081
+  return __builtin_aarch64_absv8hi (__a);
 
17082
+}
 
17083
+
 
17084
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
17085
+vabsq_s32 (int32x4_t __a)
 
17086
+{
 
17087
+  return __builtin_aarch64_absv4si (__a);
 
17088
+}
 
17089
+
 
17090
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
17091
+vabsq_s64 (int64x2_t __a)
 
17092
+{
 
17093
+  return __builtin_aarch64_absv2di (__a);
 
17094
+}
 
17095
+
 
17096
 /* vadd */
 
17097
 
 
17098
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
17099
@@ -19384,8 +17426,238 @@
 
17100
   return __a + __b;
 
17101
 }
 
17102
 
 
17103
-/* vceq */
 
17104
+/* vaddv */
 
17105
 
 
17106
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
17107
+vaddv_s8 (int8x8_t __a)
 
17108
+{
 
17109
+  return vget_lane_s8 (__builtin_aarch64_reduc_splus_v8qi (__a), 0);
 
17110
+}
 
17111
+
 
17112
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
17113
+vaddv_s16 (int16x4_t __a)
 
17114
+{
 
17115
+  return vget_lane_s16 (__builtin_aarch64_reduc_splus_v4hi (__a), 0);
 
17116
+}
 
17117
+
 
17118
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
17119
+vaddv_s32 (int32x2_t __a)
 
17120
+{
 
17121
+  return vget_lane_s32 (__builtin_aarch64_reduc_splus_v2si (__a), 0);
 
17122
+}
 
17123
+
 
17124
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
17125
+vaddv_u8 (uint8x8_t __a)
 
17126
+{
 
17127
+  return vget_lane_u8 ((uint8x8_t)
 
17128
+               __builtin_aarch64_reduc_uplus_v8qi ((int8x8_t) __a), 0);
 
17129
+}
 
17130
+
 
17131
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
17132
+vaddv_u16 (uint16x4_t __a)
 
17133
+{
 
17134
+  return vget_lane_u16 ((uint16x4_t)
 
17135
+               __builtin_aarch64_reduc_uplus_v4hi ((int16x4_t) __a), 0);
 
17136
+}
 
17137
+
 
17138
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17139
+vaddv_u32 (uint32x2_t __a)
 
17140
+{
 
17141
+  return vget_lane_u32 ((uint32x2_t)
 
17142
+               __builtin_aarch64_reduc_uplus_v2si ((int32x2_t) __a), 0);
 
17143
+}
 
17144
+
 
17145
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
17146
+vaddvq_s8 (int8x16_t __a)
 
17147
+{
 
17148
+  return vgetq_lane_s8 (__builtin_aarch64_reduc_splus_v16qi (__a), 0);
 
17149
+}
 
17150
+
 
17151
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
17152
+vaddvq_s16 (int16x8_t __a)
 
17153
+{
 
17154
+  return vgetq_lane_s16 (__builtin_aarch64_reduc_splus_v8hi (__a), 0);
 
17155
+}
 
17156
+
 
17157
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
17158
+vaddvq_s32 (int32x4_t __a)
 
17159
+{
 
17160
+  return vgetq_lane_s32 (__builtin_aarch64_reduc_splus_v4si (__a), 0);
 
17161
+}
 
17162
+
 
17163
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
17164
+vaddvq_s64 (int64x2_t __a)
 
17165
+{
 
17166
+  return vgetq_lane_s64 (__builtin_aarch64_reduc_splus_v2di (__a), 0);
 
17167
+}
 
17168
+
 
17169
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
17170
+vaddvq_u8 (uint8x16_t __a)
 
17171
+{
 
17172
+  return vgetq_lane_u8 ((uint8x16_t)
 
17173
+               __builtin_aarch64_reduc_uplus_v16qi ((int8x16_t) __a), 0);
 
17174
+}
 
17175
+
 
17176
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
17177
+vaddvq_u16 (uint16x8_t __a)
 
17178
+{
 
17179
+  return vgetq_lane_u16 ((uint16x8_t)
 
17180
+               __builtin_aarch64_reduc_uplus_v8hi ((int16x8_t) __a), 0);
 
17181
+}
 
17182
+
 
17183
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17184
+vaddvq_u32 (uint32x4_t __a)
 
17185
+{
 
17186
+  return vgetq_lane_u32 ((uint32x4_t)
 
17187
+               __builtin_aarch64_reduc_uplus_v4si ((int32x4_t) __a), 0);
 
17188
+}
 
17189
+
 
17190
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17191
+vaddvq_u64 (uint64x2_t __a)
 
17192
+{
 
17193
+  return vgetq_lane_u64 ((uint64x2_t)
 
17194
+               __builtin_aarch64_reduc_uplus_v2di ((int64x2_t) __a), 0);
 
17195
+}
 
17196
+
 
17197
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
17198
+vaddv_f32 (float32x2_t __a)
 
17199
+{
 
17200
+  float32x2_t t = __builtin_aarch64_reduc_splus_v2sf (__a);
 
17201
+  return vget_lane_f32 (t, 0);
 
17202
+}
 
17203
+
 
17204
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
17205
+vaddvq_f32 (float32x4_t __a)
 
17206
+{
 
17207
+  float32x4_t t = __builtin_aarch64_reduc_splus_v4sf (__a);
 
17208
+  return vgetq_lane_f32 (t, 0);
 
17209
+}
 
17210
+
 
17211
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
17212
+vaddvq_f64 (float64x2_t __a)
 
17213
+{
 
17214
+  float64x2_t t = __builtin_aarch64_reduc_splus_v2df (__a);
 
17215
+  return vgetq_lane_f64 (t, 0);
 
17216
+}
 
17217
+
 
17218
+/* vcage  */
 
17219
+
 
17220
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17221
+vcages_f32 (float32_t __a, float32_t __b)
 
17222
+{
 
17223
+  return __builtin_fabsf (__a) >= __builtin_fabsf (__b) ? -1 : 0;
 
17224
+}
 
17225
+
 
17226
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17227
+vcage_f32 (float32x2_t __a, float32x2_t __b)
 
17228
+{
 
17229
+  return vabs_f32 (__a) >= vabs_f32 (__b);
 
17230
+}
 
17231
+
 
17232
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17233
+vcageq_f32 (float32x4_t __a, float32x4_t __b)
 
17234
+{
 
17235
+  return vabsq_f32 (__a) >= vabsq_f32 (__b);
 
17236
+}
 
17237
+
 
17238
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17239
+vcaged_f64 (float64_t __a, float64_t __b)
 
17240
+{
 
17241
+  return __builtin_fabs (__a) >= __builtin_fabs (__b) ? -1 : 0;
 
17242
+}
 
17243
+
 
17244
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17245
+vcageq_f64 (float64x2_t __a, float64x2_t __b)
 
17246
+{
 
17247
+  return vabsq_f64 (__a) >= vabsq_f64 (__b);
 
17248
+}
 
17249
+
 
17250
+/* vcagt  */
 
17251
+
 
17252
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17253
+vcagts_f32 (float32_t __a, float32_t __b)
 
17254
+{
 
17255
+  return __builtin_fabsf (__a) > __builtin_fabsf (__b) ? -1 : 0;
 
17256
+}
 
17257
+
 
17258
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17259
+vcagt_f32 (float32x2_t __a, float32x2_t __b)
 
17260
+{
 
17261
+  return vabs_f32 (__a) > vabs_f32 (__b);
 
17262
+}
 
17263
+
 
17264
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17265
+vcagtq_f32 (float32x4_t __a, float32x4_t __b)
 
17266
+{
 
17267
+  return vabsq_f32 (__a) > vabsq_f32 (__b);
 
17268
+}
 
17269
+
 
17270
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17271
+vcagtd_f64 (float64_t __a, float64_t __b)
 
17272
+{
 
17273
+  return __builtin_fabs (__a) > __builtin_fabs (__b) ? -1 : 0;
 
17274
+}
 
17275
+
 
17276
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17277
+vcagtq_f64 (float64x2_t __a, float64x2_t __b)
 
17278
+{
 
17279
+  return vabsq_f64 (__a) > vabsq_f64 (__b);
 
17280
+}
 
17281
+
 
17282
+/* vcale  */
 
17283
+
 
17284
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17285
+vcale_f32 (float32x2_t __a, float32x2_t __b)
 
17286
+{
 
17287
+  return vabs_f32 (__a) <= vabs_f32 (__b);
 
17288
+}
 
17289
+
 
17290
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17291
+vcaleq_f32 (float32x4_t __a, float32x4_t __b)
 
17292
+{
 
17293
+  return vabsq_f32 (__a) <= vabsq_f32 (__b);
 
17294
+}
 
17295
+
 
17296
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17297
+vcaleq_f64 (float64x2_t __a, float64x2_t __b)
 
17298
+{
 
17299
+  return vabsq_f64 (__a) <= vabsq_f64 (__b);
 
17300
+}
 
17301
+
 
17302
+/* vcalt  */
 
17303
+
 
17304
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17305
+vcalt_f32 (float32x2_t __a, float32x2_t __b)
 
17306
+{
 
17307
+  return vabs_f32 (__a) < vabs_f32 (__b);
 
17308
+}
 
17309
+
 
17310
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17311
+vcaltq_f32 (float32x4_t __a, float32x4_t __b)
 
17312
+{
 
17313
+  return vabsq_f32 (__a) < vabsq_f32 (__b);
 
17314
+}
 
17315
+
 
17316
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17317
+vcaltq_f64 (float64x2_t __a, float64x2_t __b)
 
17318
+{
 
17319
+  return vabsq_f64 (__a) < vabsq_f64 (__b);
 
17320
+}
 
17321
+
 
17322
+/* vceq - vector.  */
 
17323
+
 
17324
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17325
+vceq_f32 (float32x2_t __a, float32x2_t __b)
 
17326
+{
 
17327
+  return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b);
 
17328
+}
 
17329
+
 
17330
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17331
+vceq_f64 (float64x1_t __a, float64x1_t __b)
 
17332
+{
 
17333
+  return __a == __b ? -1ll : 0ll;
 
17334
+}
 
17335
+
 
17336
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17337
 vceq_p8 (poly8x8_t __a, poly8x8_t __b)
 
17338
 {
 
17339
@@ -19414,7 +17686,7 @@
 
17340
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17341
 vceq_s64 (int64x1_t __a, int64x1_t __b)
 
17342
 {
 
17343
-  return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
 
17344
+  return __a == __b ? -1ll : 0ll;
 
17345
 }
 
17346
 
 
17347
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17348
@@ -19441,10 +17713,21 @@
 
17349
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17350
 vceq_u64 (uint64x1_t __a, uint64x1_t __b)
 
17351
 {
 
17352
-  return (uint64x1_t) __builtin_aarch64_cmeqdi ((int64x1_t) __a,
 
17353
-                                               (int64x1_t) __b);
 
17354
+  return __a == __b ? -1ll : 0ll;
 
17355
 }
 
17356
 
 
17357
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17358
+vceqq_f32 (float32x4_t __a, float32x4_t __b)
 
17359
+{
 
17360
+  return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b);
 
17361
+}
 
17362
+
 
17363
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17364
+vceqq_f64 (float64x2_t __a, float64x2_t __b)
 
17365
+{
 
17366
+  return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b);
 
17367
+}
 
17368
+
 
17369
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17370
 vceqq_p8 (poly8x16_t __a, poly8x16_t __b)
 
17371
 {
 
17372
@@ -19504,27 +17787,245 @@
 
17373
                                                  (int64x2_t) __b);
 
17374
 }
 
17375
 
 
17376
+/* vceq - scalar.  */
 
17377
+
 
17378
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17379
+vceqs_f32 (float32_t __a, float32_t __b)
 
17380
+{
 
17381
+  return __a == __b ? -1 : 0;
 
17382
+}
 
17383
+
 
17384
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17385
 vceqd_s64 (int64x1_t __a, int64x1_t __b)
 
17386
 {
 
17387
-  return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
 
17388
+  return __a == __b ? -1ll : 0ll;
 
17389
 }
 
17390
 
 
17391
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17392
 vceqd_u64 (uint64x1_t __a, uint64x1_t __b)
 
17393
 {
 
17394
-  return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
 
17395
+  return __a == __b ? -1ll : 0ll;
 
17396
 }
 
17397
 
 
17398
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17399
+vceqd_f64 (float64_t __a, float64_t __b)
 
17400
+{
 
17401
+  return __a == __b ? -1ll : 0ll;
 
17402
+}
 
17403
+
 
17404
+/* vceqz - vector.  */
 
17405
+
 
17406
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17407
+vceqz_f32 (float32x2_t __a)
 
17408
+{
 
17409
+  float32x2_t __b = {0.0f, 0.0f};
 
17410
+  return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b);
 
17411
+}
 
17412
+
 
17413
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17414
+vceqz_f64 (float64x1_t __a)
 
17415
+{
 
17416
+  return __a == 0.0 ? -1ll : 0ll;
 
17417
+}
 
17418
+
 
17419
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17420
+vceqz_p8 (poly8x8_t __a)
 
17421
+{
 
17422
+  poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17423
+  return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a,
 
17424
+                                                (int8x8_t) __b);
 
17425
+}
 
17426
+
 
17427
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17428
+vceqz_s8 (int8x8_t __a)
 
17429
+{
 
17430
+  int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17431
+  return (uint8x8_t) __builtin_aarch64_cmeqv8qi (__a, __b);
 
17432
+}
 
17433
+
 
17434
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17435
+vceqz_s16 (int16x4_t __a)
 
17436
+{
 
17437
+  int16x4_t __b = {0, 0, 0, 0};
 
17438
+  return (uint16x4_t) __builtin_aarch64_cmeqv4hi (__a, __b);
 
17439
+}
 
17440
+
 
17441
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17442
+vceqz_s32 (int32x2_t __a)
 
17443
+{
 
17444
+  int32x2_t __b = {0, 0};
 
17445
+  return (uint32x2_t) __builtin_aarch64_cmeqv2si (__a, __b);
 
17446
+}
 
17447
+
 
17448
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17449
+vceqz_s64 (int64x1_t __a)
 
17450
+{
 
17451
+  return __a == 0ll ? -1ll : 0ll;
 
17452
+}
 
17453
+
 
17454
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17455
+vceqz_u8 (uint8x8_t __a)
 
17456
+{
 
17457
+  uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17458
+  return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a,
 
17459
+                                                (int8x8_t) __b);
 
17460
+}
 
17461
+
 
17462
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17463
+vceqz_u16 (uint16x4_t __a)
 
17464
+{
 
17465
+  uint16x4_t __b = {0, 0, 0, 0};
 
17466
+  return (uint16x4_t) __builtin_aarch64_cmeqv4hi ((int16x4_t) __a,
 
17467
+                                                 (int16x4_t) __b);
 
17468
+}
 
17469
+
 
17470
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17471
+vceqz_u32 (uint32x2_t __a)
 
17472
+{
 
17473
+  uint32x2_t __b = {0, 0};
 
17474
+  return (uint32x2_t) __builtin_aarch64_cmeqv2si ((int32x2_t) __a,
 
17475
+                                                 (int32x2_t) __b);
 
17476
+}
 
17477
+
 
17478
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17479
+vceqz_u64 (uint64x1_t __a)
 
17480
+{
 
17481
+  return __a == 0ll ? -1ll : 0ll;
 
17482
+}
 
17483
+
 
17484
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17485
+vceqzq_f32 (float32x4_t __a)
 
17486
+{
 
17487
+  float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
 
17488
+  return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b);
 
17489
+}
 
17490
+
 
17491
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17492
+vceqzq_f64 (float64x2_t __a)
 
17493
+{
 
17494
+  float64x2_t __b = {0.0, 0.0};
 
17495
+  return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b);
 
17496
+}
 
17497
+
 
17498
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17499
+vceqzq_p8 (poly8x16_t __a)
 
17500
+{
 
17501
+  poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17502
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
17503
+  return (uint8x16_t) __builtin_aarch64_cmeqv16qi ((int8x16_t) __a,
 
17504
+                                                  (int8x16_t) __b);
 
17505
+}
 
17506
+
 
17507
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17508
+vceqzq_s8 (int8x16_t __a)
 
17509
+{
 
17510
+  int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17511
+                  0, 0, 0, 0, 0, 0, 0, 0};
 
17512
+  return (uint8x16_t) __builtin_aarch64_cmeqv16qi (__a, __b);
 
17513
+}
 
17514
+
 
17515
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
17516
+vceqzq_s16 (int16x8_t __a)
 
17517
+{
 
17518
+  int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17519
+  return (uint16x8_t) __builtin_aarch64_cmeqv8hi (__a, __b);
 
17520
+}
 
17521
+
 
17522
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17523
+vceqzq_s32 (int32x4_t __a)
 
17524
+{
 
17525
+  int32x4_t __b = {0, 0, 0, 0};
 
17526
+  return (uint32x4_t) __builtin_aarch64_cmeqv4si (__a, __b);
 
17527
+}
 
17528
+
 
17529
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17530
+vceqzq_s64 (int64x2_t __a)
 
17531
+{
 
17532
+  int64x2_t __b = {0, 0};
 
17533
+  return (uint64x2_t) __builtin_aarch64_cmeqv2di (__a, __b);
 
17534
+}
 
17535
+
 
17536
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17537
+vceqzq_u8 (uint8x16_t __a)
 
17538
+{
 
17539
+  uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17540
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
17541
+  return (uint8x16_t) __builtin_aarch64_cmeqv16qi ((int8x16_t) __a,
 
17542
+                                                  (int8x16_t) __b);
 
17543
+}
 
17544
+
 
17545
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
17546
+vceqzq_u16 (uint16x8_t __a)
 
17547
+{
 
17548
+  uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17549
+  return (uint16x8_t) __builtin_aarch64_cmeqv8hi ((int16x8_t) __a,
 
17550
+                                                 (int16x8_t) __b);
 
17551
+}
 
17552
+
 
17553
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17554
+vceqzq_u32 (uint32x4_t __a)
 
17555
+{
 
17556
+  uint32x4_t __b = {0, 0, 0, 0};
 
17557
+  return (uint32x4_t) __builtin_aarch64_cmeqv4si ((int32x4_t) __a,
 
17558
+                                                 (int32x4_t) __b);
 
17559
+}
 
17560
+
 
17561
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17562
+vceqzq_u64 (uint64x2_t __a)
 
17563
+{
 
17564
+  uint64x2_t __b = {0, 0};
 
17565
+  return (uint64x2_t) __builtin_aarch64_cmeqv2di ((int64x2_t) __a,
 
17566
+                                                 (int64x2_t) __b);
 
17567
+}
 
17568
+
 
17569
+/* vceqz - scalar.  */
 
17570
+
 
17571
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17572
+vceqzs_f32 (float32_t __a)
 
17573
+{
 
17574
+  return __a == 0.0f ? -1 : 0;
 
17575
+}
 
17576
+
 
17577
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17578
 vceqzd_s64 (int64x1_t __a)
 
17579
 {
 
17580
-  return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, 0);
 
17581
+  return __a == 0 ? -1ll : 0ll;
 
17582
 }
 
17583
 
 
17584
-/* vcge */
 
17585
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17586
+vceqzd_u64 (int64x1_t __a)
 
17587
+{
 
17588
+  return __a == 0 ? -1ll : 0ll;
 
17589
+}
 
17590
 
 
17591
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17592
+vceqzd_f64 (float64_t __a)
 
17593
+{
 
17594
+  return __a == 0.0 ? -1ll : 0ll;
 
17595
+}
 
17596
+
 
17597
+/* vcge - vector.  */
 
17598
+
 
17599
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17600
+vcge_f32 (float32x2_t __a, float32x2_t __b)
 
17601
+{
 
17602
+  return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b);
 
17603
+}
 
17604
+
 
17605
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17606
+vcge_f64 (float64x1_t __a, float64x1_t __b)
 
17607
+{
 
17608
+  return __a >= __b ? -1ll : 0ll;
 
17609
+}
 
17610
+
 
17611
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17612
+vcge_p8 (poly8x8_t __a, poly8x8_t __b)
 
17613
+{
 
17614
+  return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a,
 
17615
+                                                (int8x8_t) __b);
 
17616
+}
 
17617
+
 
17618
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17619
 vcge_s8 (int8x8_t __a, int8x8_t __b)
 
17620
 {
 
17621
   return (uint8x8_t) __builtin_aarch64_cmgev8qi (__a, __b);
 
17622
@@ -19545,38 +18046,56 @@
 
17623
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17624
 vcge_s64 (int64x1_t __a, int64x1_t __b)
 
17625
 {
 
17626
-  return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b);
 
17627
+  return __a >= __b ? -1ll : 0ll;
 
17628
 }
 
17629
 
 
17630
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17631
 vcge_u8 (uint8x8_t __a, uint8x8_t __b)
 
17632
 {
 
17633
-  return (uint8x8_t) __builtin_aarch64_cmhsv8qi ((int8x8_t) __a,
 
17634
+  return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __a,
 
17635
                                                 (int8x8_t) __b);
 
17636
 }
 
17637
 
 
17638
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17639
 vcge_u16 (uint16x4_t __a, uint16x4_t __b)
 
17640
 {
 
17641
-  return (uint16x4_t) __builtin_aarch64_cmhsv4hi ((int16x4_t) __a,
 
17642
+  return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __a,
 
17643
                                                  (int16x4_t) __b);
 
17644
 }
 
17645
 
 
17646
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17647
 vcge_u32 (uint32x2_t __a, uint32x2_t __b)
 
17648
 {
 
17649
-  return (uint32x2_t) __builtin_aarch64_cmhsv2si ((int32x2_t) __a,
 
17650
+  return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __a,
 
17651
                                                  (int32x2_t) __b);
 
17652
 }
 
17653
 
 
17654
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17655
 vcge_u64 (uint64x1_t __a, uint64x1_t __b)
 
17656
 {
 
17657
-  return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __a,
 
17658
-                                               (int64x1_t) __b);
 
17659
+  return __a >= __b ? -1ll : 0ll;
 
17660
 }
 
17661
 
 
17662
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17663
+vcgeq_f32 (float32x4_t __a, float32x4_t __b)
 
17664
+{
 
17665
+  return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b);
 
17666
+}
 
17667
+
 
17668
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17669
+vcgeq_f64 (float64x2_t __a, float64x2_t __b)
 
17670
+{
 
17671
+  return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b);
 
17672
+}
 
17673
+
 
17674
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17675
+vcgeq_p8 (poly8x16_t __a, poly8x16_t __b)
 
17676
+{
 
17677
+  return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __a,
 
17678
+                                                  (int8x16_t) __b);
 
17679
+}
 
17680
+
 
17681
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17682
 vcgeq_s8 (int8x16_t __a, int8x16_t __b)
 
17683
 {
 
17684
   return (uint8x16_t) __builtin_aarch64_cmgev16qi (__a, __b);
 
17685
@@ -19603,53 +18122,270 @@
 
17686
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17687
 vcgeq_u8 (uint8x16_t __a, uint8x16_t __b)
 
17688
 {
 
17689
-  return (uint8x16_t) __builtin_aarch64_cmhsv16qi ((int8x16_t) __a,
 
17690
+  return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __a,
 
17691
                                                   (int8x16_t) __b);
 
17692
 }
 
17693
 
 
17694
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
17695
 vcgeq_u16 (uint16x8_t __a, uint16x8_t __b)
 
17696
 {
 
17697
-  return (uint16x8_t) __builtin_aarch64_cmhsv8hi ((int16x8_t) __a,
 
17698
+  return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __a,
 
17699
                                                  (int16x8_t) __b);
 
17700
 }
 
17701
 
 
17702
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17703
 vcgeq_u32 (uint32x4_t __a, uint32x4_t __b)
 
17704
 {
 
17705
-  return (uint32x4_t) __builtin_aarch64_cmhsv4si ((int32x4_t) __a,
 
17706
+  return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __a,
 
17707
                                                  (int32x4_t) __b);
 
17708
 }
 
17709
 
 
17710
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17711
 vcgeq_u64 (uint64x2_t __a, uint64x2_t __b)
 
17712
 {
 
17713
-  return (uint64x2_t) __builtin_aarch64_cmhsv2di ((int64x2_t) __a,
 
17714
+  return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __a,
 
17715
                                                  (int64x2_t) __b);
 
17716
 }
 
17717
 
 
17718
+/* vcge - scalar.  */
 
17719
+
 
17720
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17721
+vcges_f32 (float32_t __a, float32_t __b)
 
17722
+{
 
17723
+  return __a >= __b ? -1 : 0;
 
17724
+}
 
17725
+
 
17726
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17727
 vcged_s64 (int64x1_t __a, int64x1_t __b)
 
17728
 {
 
17729
-  return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b);
 
17730
+  return __a >= __b ? -1ll : 0ll;
 
17731
 }
 
17732
 
 
17733
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17734
 vcged_u64 (uint64x1_t __a, uint64x1_t __b)
 
17735
 {
 
17736
-  return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __a,
 
17737
-                                               (int64x1_t) __b);
 
17738
+  return __a >= __b ? -1ll : 0ll;
 
17739
 }
 
17740
 
 
17741
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17742
+vcged_f64 (float64_t __a, float64_t __b)
 
17743
+{
 
17744
+  return __a >= __b ? -1ll : 0ll;
 
17745
+}
 
17746
+
 
17747
+/* vcgez - vector.  */
 
17748
+
 
17749
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17750
+vcgez_f32 (float32x2_t __a)
 
17751
+{
 
17752
+  float32x2_t __b = {0.0f, 0.0f};
 
17753
+  return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b);
 
17754
+}
 
17755
+
 
17756
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17757
+vcgez_f64 (float64x1_t __a)
 
17758
+{
 
17759
+  return __a >= 0.0 ? -1ll : 0ll;
 
17760
+}
 
17761
+
 
17762
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17763
+vcgez_p8 (poly8x8_t __a)
 
17764
+{
 
17765
+  poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17766
+  return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a,
 
17767
+                                                (int8x8_t) __b);
 
17768
+}
 
17769
+
 
17770
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17771
+vcgez_s8 (int8x8_t __a)
 
17772
+{
 
17773
+  int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17774
+  return (uint8x8_t) __builtin_aarch64_cmgev8qi (__a, __b);
 
17775
+}
 
17776
+
 
17777
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17778
+vcgez_s16 (int16x4_t __a)
 
17779
+{
 
17780
+  int16x4_t __b = {0, 0, 0, 0};
 
17781
+  return (uint16x4_t) __builtin_aarch64_cmgev4hi (__a, __b);
 
17782
+}
 
17783
+
 
17784
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17785
+vcgez_s32 (int32x2_t __a)
 
17786
+{
 
17787
+  int32x2_t __b = {0, 0};
 
17788
+  return (uint32x2_t) __builtin_aarch64_cmgev2si (__a, __b);
 
17789
+}
 
17790
+
 
17791
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17792
+vcgez_s64 (int64x1_t __a)
 
17793
+{
 
17794
+  return __a >= 0ll ? -1ll : 0ll;
 
17795
+}
 
17796
+
 
17797
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17798
+vcgez_u8 (uint8x8_t __a)
 
17799
+{
 
17800
+  uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17801
+  return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __a,
 
17802
+                                                (int8x8_t) __b);
 
17803
+}
 
17804
+
 
17805
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17806
+vcgez_u16 (uint16x4_t __a)
 
17807
+{
 
17808
+  uint16x4_t __b = {0, 0, 0, 0};
 
17809
+  return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __a,
 
17810
+                                                 (int16x4_t) __b);
 
17811
+}
 
17812
+
 
17813
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17814
+vcgez_u32 (uint32x2_t __a)
 
17815
+{
 
17816
+  uint32x2_t __b = {0, 0};
 
17817
+  return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __a,
 
17818
+                                                 (int32x2_t) __b);
 
17819
+}
 
17820
+
 
17821
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17822
+vcgez_u64 (uint64x1_t __a)
 
17823
+{
 
17824
+  return __a >= 0ll ? -1ll : 0ll;
 
17825
+}
 
17826
+
 
17827
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17828
+vcgezq_f32 (float32x4_t __a)
 
17829
+{
 
17830
+  float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
 
17831
+  return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b);
 
17832
+}
 
17833
+
 
17834
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17835
+vcgezq_f64 (float64x2_t __a)
 
17836
+{
 
17837
+  float64x2_t __b = {0.0, 0.0};
 
17838
+  return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b);
 
17839
+}
 
17840
+
 
17841
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17842
+vcgezq_p8 (poly8x16_t __a)
 
17843
+{
 
17844
+  poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17845
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
17846
+  return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __a,
 
17847
+                                                  (int8x16_t) __b);
 
17848
+}
 
17849
+
 
17850
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17851
+vcgezq_s8 (int8x16_t __a)
 
17852
+{
 
17853
+  int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17854
+                  0, 0, 0, 0, 0, 0, 0, 0};
 
17855
+  return (uint8x16_t) __builtin_aarch64_cmgev16qi (__a, __b);
 
17856
+}
 
17857
+
 
17858
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
17859
+vcgezq_s16 (int16x8_t __a)
 
17860
+{
 
17861
+  int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17862
+  return (uint16x8_t) __builtin_aarch64_cmgev8hi (__a, __b);
 
17863
+}
 
17864
+
 
17865
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17866
+vcgezq_s32 (int32x4_t __a)
 
17867
+{
 
17868
+  int32x4_t __b = {0, 0, 0, 0};
 
17869
+  return (uint32x4_t) __builtin_aarch64_cmgev4si (__a, __b);
 
17870
+}
 
17871
+
 
17872
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17873
+vcgezq_s64 (int64x2_t __a)
 
17874
+{
 
17875
+  int64x2_t __b = {0, 0};
 
17876
+  return (uint64x2_t) __builtin_aarch64_cmgev2di (__a, __b);
 
17877
+}
 
17878
+
 
17879
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
17880
+vcgezq_u8 (uint8x16_t __a)
 
17881
+{
 
17882
+  uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
17883
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
17884
+  return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __a,
 
17885
+                                                  (int8x16_t) __b);
 
17886
+}
 
17887
+
 
17888
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
17889
+vcgezq_u16 (uint16x8_t __a)
 
17890
+{
 
17891
+  uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
17892
+  return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __a,
 
17893
+                                                 (int16x8_t) __b);
 
17894
+}
 
17895
+
 
17896
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
17897
+vcgezq_u32 (uint32x4_t __a)
 
17898
+{
 
17899
+  uint32x4_t __b = {0, 0, 0, 0};
 
17900
+  return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __a,
 
17901
+                                                 (int32x4_t) __b);
 
17902
+}
 
17903
+
 
17904
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
17905
+vcgezq_u64 (uint64x2_t __a)
 
17906
+{
 
17907
+  uint64x2_t __b = {0, 0};
 
17908
+  return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __a,
 
17909
+                                                 (int64x2_t) __b);
 
17910
+}
 
17911
+
 
17912
+/* vcgez - scalar.  */
 
17913
+
 
17914
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
17915
+vcgezs_f32 (float32_t __a)
 
17916
+{
 
17917
+  return __a >= 0.0f ? -1 : 0;
 
17918
+}
 
17919
+
 
17920
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17921
 vcgezd_s64 (int64x1_t __a)
 
17922
 {
 
17923
-  return (uint64x1_t) __builtin_aarch64_cmgedi (__a, 0);
 
17924
+  return __a >= 0 ? -1ll : 0ll;
 
17925
 }
 
17926
 
 
17927
-/* vcgt */
 
17928
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17929
+vcgezd_u64 (int64x1_t __a)
 
17930
+{
 
17931
+  return __a >= 0 ? -1ll : 0ll;
 
17932
+}
 
17933
 
 
17934
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
17935
+vcgezd_f64 (float64_t __a)
 
17936
+{
 
17937
+  return __a >= 0.0 ? -1ll : 0ll;
 
17938
+}
 
17939
+
 
17940
+/* vcgt - vector.  */
 
17941
+
 
17942
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17943
+vcgt_f32 (float32x2_t __a, float32x2_t __b)
 
17944
+{
 
17945
+  return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b);
 
17946
+}
 
17947
+
 
17948
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17949
+vcgt_f64 (float64x1_t __a, float64x1_t __b)
 
17950
+{
 
17951
+  return __a > __b ? -1ll : 0ll;
 
17952
+}
 
17953
+
 
17954
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17955
+vcgt_p8 (poly8x8_t __a, poly8x8_t __b)
 
17956
+{
 
17957
+  return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a,
 
17958
+                                                (int8x8_t) __b);
 
17959
+}
 
17960
+
 
17961
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17962
 vcgt_s8 (int8x8_t __a, int8x8_t __b)
 
17963
 {
 
17964
   return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__a, __b);
 
17965
@@ -19670,38 +18406,56 @@
 
17966
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17967
 vcgt_s64 (int64x1_t __a, int64x1_t __b)
 
17968
 {
 
17969
-  return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b);
 
17970
+  return __a > __b ? -1ll : 0ll;
 
17971
 }
 
17972
 
 
17973
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
17974
 vcgt_u8 (uint8x8_t __a, uint8x8_t __b)
 
17975
 {
 
17976
-  return (uint8x8_t) __builtin_aarch64_cmhiv8qi ((int8x8_t) __a,
 
17977
+  return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __a,
 
17978
                                                 (int8x8_t) __b);
 
17979
 }
 
17980
 
 
17981
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
17982
 vcgt_u16 (uint16x4_t __a, uint16x4_t __b)
 
17983
 {
 
17984
-  return (uint16x4_t) __builtin_aarch64_cmhiv4hi ((int16x4_t) __a,
 
17985
+  return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __a,
 
17986
                                                  (int16x4_t) __b);
 
17987
 }
 
17988
 
 
17989
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
17990
 vcgt_u32 (uint32x2_t __a, uint32x2_t __b)
 
17991
 {
 
17992
-  return (uint32x2_t) __builtin_aarch64_cmhiv2si ((int32x2_t) __a,
 
17993
+  return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __a,
 
17994
                                                  (int32x2_t) __b);
 
17995
 }
 
17996
 
 
17997
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
17998
 vcgt_u64 (uint64x1_t __a, uint64x1_t __b)
 
17999
 {
 
18000
-  return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __a,
 
18001
-                                               (int64x1_t) __b);
 
18002
+  return __a > __b ? -1ll : 0ll;
 
18003
 }
 
18004
 
 
18005
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18006
+vcgtq_f32 (float32x4_t __a, float32x4_t __b)
 
18007
+{
 
18008
+  return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b);
 
18009
+}
 
18010
+
 
18011
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18012
+vcgtq_f64 (float64x2_t __a, float64x2_t __b)
 
18013
+{
 
18014
+  return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b);
 
18015
+}
 
18016
+
 
18017
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18018
+vcgtq_p8 (poly8x16_t __a, poly8x16_t __b)
 
18019
+{
 
18020
+  return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __a,
 
18021
+                                                  (int8x16_t) __b);
 
18022
+}
 
18023
+
 
18024
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18025
 vcgtq_s8 (int8x16_t __a, int8x16_t __b)
 
18026
 {
 
18027
   return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__a, __b);
 
18028
@@ -19728,53 +18482,270 @@
 
18029
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18030
 vcgtq_u8 (uint8x16_t __a, uint8x16_t __b)
 
18031
 {
 
18032
-  return (uint8x16_t) __builtin_aarch64_cmhiv16qi ((int8x16_t) __a,
 
18033
+  return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __a,
 
18034
                                                   (int8x16_t) __b);
 
18035
 }
 
18036
 
 
18037
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18038
 vcgtq_u16 (uint16x8_t __a, uint16x8_t __b)
 
18039
 {
 
18040
-  return (uint16x8_t) __builtin_aarch64_cmhiv8hi ((int16x8_t) __a,
 
18041
+  return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __a,
 
18042
                                                  (int16x8_t) __b);
 
18043
 }
 
18044
 
 
18045
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18046
 vcgtq_u32 (uint32x4_t __a, uint32x4_t __b)
 
18047
 {
 
18048
-  return (uint32x4_t) __builtin_aarch64_cmhiv4si ((int32x4_t) __a,
 
18049
+  return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __a,
 
18050
                                                  (int32x4_t) __b);
 
18051
 }
 
18052
 
 
18053
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18054
 vcgtq_u64 (uint64x2_t __a, uint64x2_t __b)
 
18055
 {
 
18056
-  return (uint64x2_t) __builtin_aarch64_cmhiv2di ((int64x2_t) __a,
 
18057
+  return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __a,
 
18058
                                                  (int64x2_t) __b);
 
18059
 }
 
18060
 
 
18061
+/* vcgt - scalar.  */
 
18062
+
 
18063
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18064
+vcgts_f32 (float32_t __a, float32_t __b)
 
18065
+{
 
18066
+  return __a > __b ? -1 : 0;
 
18067
+}
 
18068
+
 
18069
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18070
 vcgtd_s64 (int64x1_t __a, int64x1_t __b)
 
18071
 {
 
18072
-  return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b);
 
18073
+  return __a > __b ? -1ll : 0ll;
 
18074
 }
 
18075
 
 
18076
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18077
 vcgtd_u64 (uint64x1_t __a, uint64x1_t __b)
 
18078
 {
 
18079
-  return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __a,
 
18080
-                                               (int64x1_t) __b);
 
18081
+  return __a > __b ? -1ll : 0ll;
 
18082
 }
 
18083
 
 
18084
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18085
+vcgtd_f64 (float64_t __a, float64_t __b)
 
18086
+{
 
18087
+  return __a > __b ? -1ll : 0ll;
 
18088
+}
 
18089
+
 
18090
+/* vcgtz - vector.  */
 
18091
+
 
18092
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18093
+vcgtz_f32 (float32x2_t __a)
 
18094
+{
 
18095
+  float32x2_t __b = {0.0f, 0.0f};
 
18096
+  return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b);
 
18097
+}
 
18098
+
 
18099
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18100
+vcgtz_f64 (float64x1_t __a)
 
18101
+{
 
18102
+  return __a > 0.0 ? -1ll : 0ll;
 
18103
+}
 
18104
+
 
18105
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18106
+vcgtz_p8 (poly8x8_t __a)
 
18107
+{
 
18108
+  poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18109
+  return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a,
 
18110
+                                                (int8x8_t) __b);
 
18111
+}
 
18112
+
 
18113
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18114
+vcgtz_s8 (int8x8_t __a)
 
18115
+{
 
18116
+  int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18117
+  return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__a, __b);
 
18118
+}
 
18119
+
 
18120
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18121
+vcgtz_s16 (int16x4_t __a)
 
18122
+{
 
18123
+  int16x4_t __b = {0, 0, 0, 0};
 
18124
+  return (uint16x4_t) __builtin_aarch64_cmgtv4hi (__a, __b);
 
18125
+}
 
18126
+
 
18127
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18128
+vcgtz_s32 (int32x2_t __a)
 
18129
+{
 
18130
+  int32x2_t __b = {0, 0};
 
18131
+  return (uint32x2_t) __builtin_aarch64_cmgtv2si (__a, __b);
 
18132
+}
 
18133
+
 
18134
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18135
+vcgtz_s64 (int64x1_t __a)
 
18136
+{
 
18137
+  return __a > 0ll ? -1ll : 0ll;
 
18138
+}
 
18139
+
 
18140
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18141
+vcgtz_u8 (uint8x8_t __a)
 
18142
+{
 
18143
+  uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18144
+  return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __a,
 
18145
+                                                (int8x8_t) __b);
 
18146
+}
 
18147
+
 
18148
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18149
+vcgtz_u16 (uint16x4_t __a)
 
18150
+{
 
18151
+  uint16x4_t __b = {0, 0, 0, 0};
 
18152
+  return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __a,
 
18153
+                                                 (int16x4_t) __b);
 
18154
+}
 
18155
+
 
18156
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18157
+vcgtz_u32 (uint32x2_t __a)
 
18158
+{
 
18159
+  uint32x2_t __b = {0, 0};
 
18160
+  return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __a,
 
18161
+                                                 (int32x2_t) __b);
 
18162
+}
 
18163
+
 
18164
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18165
+vcgtz_u64 (uint64x1_t __a)
 
18166
+{
 
18167
+  return __a > 0ll ? -1ll : 0ll;
 
18168
+}
 
18169
+
 
18170
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18171
+vcgtzq_f32 (float32x4_t __a)
 
18172
+{
 
18173
+  float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
 
18174
+  return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b);
 
18175
+}
 
18176
+
 
18177
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18178
+vcgtzq_f64 (float64x2_t __a)
 
18179
+{
 
18180
+  float64x2_t __b = {0.0, 0.0};
 
18181
+  return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b);
 
18182
+}
 
18183
+
 
18184
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18185
+vcgtzq_p8 (poly8x16_t __a)
 
18186
+{
 
18187
+  poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18188
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
18189
+  return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __a,
 
18190
+                                                  (int8x16_t) __b);
 
18191
+}
 
18192
+
 
18193
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18194
+vcgtzq_s8 (int8x16_t __a)
 
18195
+{
 
18196
+  int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18197
+                  0, 0, 0, 0, 0, 0, 0, 0};
 
18198
+  return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__a, __b);
 
18199
+}
 
18200
+
 
18201
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18202
+vcgtzq_s16 (int16x8_t __a)
 
18203
+{
 
18204
+  int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18205
+  return (uint16x8_t) __builtin_aarch64_cmgtv8hi (__a, __b);
 
18206
+}
 
18207
+
 
18208
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18209
+vcgtzq_s32 (int32x4_t __a)
 
18210
+{
 
18211
+  int32x4_t __b = {0, 0, 0, 0};
 
18212
+  return (uint32x4_t) __builtin_aarch64_cmgtv4si (__a, __b);
 
18213
+}
 
18214
+
 
18215
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18216
+vcgtzq_s64 (int64x2_t __a)
 
18217
+{
 
18218
+  int64x2_t __b = {0, 0};
 
18219
+  return (uint64x2_t) __builtin_aarch64_cmgtv2di (__a, __b);
 
18220
+}
 
18221
+
 
18222
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18223
+vcgtzq_u8 (uint8x16_t __a)
 
18224
+{
 
18225
+  uint8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18226
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
18227
+  return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __a,
 
18228
+                                                  (int8x16_t) __b);
 
18229
+}
 
18230
+
 
18231
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18232
+vcgtzq_u16 (uint16x8_t __a)
 
18233
+{
 
18234
+  uint16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18235
+  return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __a,
 
18236
+                                                 (int16x8_t) __b);
 
18237
+}
 
18238
+
 
18239
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18240
+vcgtzq_u32 (uint32x4_t __a)
 
18241
+{
 
18242
+  uint32x4_t __b = {0, 0, 0, 0};
 
18243
+  return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __a,
 
18244
+                                                 (int32x4_t) __b);
 
18245
+}
 
18246
+
 
18247
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18248
+vcgtzq_u64 (uint64x2_t __a)
 
18249
+{
 
18250
+  uint64x2_t __b = {0, 0};
 
18251
+  return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __a,
 
18252
+                                                 (int64x2_t) __b);
 
18253
+}
 
18254
+
 
18255
+/* vcgtz - scalar.  */
 
18256
+
 
18257
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18258
+vcgtzs_f32 (float32_t __a)
 
18259
+{
 
18260
+  return __a > 0.0f ? -1 : 0;
 
18261
+}
 
18262
+
 
18263
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18264
 vcgtzd_s64 (int64x1_t __a)
 
18265
 {
 
18266
-  return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, 0);
 
18267
+  return __a > 0 ? -1ll : 0ll;
 
18268
 }
 
18269
 
 
18270
-/* vcle */
 
18271
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18272
+vcgtzd_u64 (int64x1_t __a)
 
18273
+{
 
18274
+  return __a > 0 ? -1ll : 0ll;
 
18275
+}
 
18276
 
 
18277
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18278
+vcgtzd_f64 (float64_t __a)
 
18279
+{
 
18280
+  return __a > 0.0 ? -1ll : 0ll;
 
18281
+}
 
18282
+
 
18283
+/* vcle - vector.  */
 
18284
+
 
18285
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18286
+vcle_f32 (float32x2_t __a, float32x2_t __b)
 
18287
+{
 
18288
+  return (uint32x2_t) __builtin_aarch64_cmgev2sf (__b, __a);
 
18289
+}
 
18290
+
 
18291
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18292
+vcle_f64 (float64x1_t __a, float64x1_t __b)
 
18293
+{
 
18294
+  return __a <= __b ? -1ll : 0ll;
 
18295
+}
 
18296
+
 
18297
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18298
+vcle_p8 (poly8x8_t __a, poly8x8_t __b)
 
18299
+{
 
18300
+  return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __b,
 
18301
+                                                (int8x8_t) __a);
 
18302
+}
 
18303
+
 
18304
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18305
 vcle_s8 (int8x8_t __a, int8x8_t __b)
 
18306
 {
 
18307
   return (uint8x8_t) __builtin_aarch64_cmgev8qi (__b, __a);
 
18308
@@ -19795,38 +18766,56 @@
 
18309
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18310
 vcle_s64 (int64x1_t __a, int64x1_t __b)
 
18311
 {
 
18312
-  return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a);
 
18313
+  return __a <= __b ? -1ll : 0ll;
 
18314
 }
 
18315
 
 
18316
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18317
 vcle_u8 (uint8x8_t __a, uint8x8_t __b)
 
18318
 {
 
18319
-  return (uint8x8_t) __builtin_aarch64_cmhsv8qi ((int8x8_t) __b,
 
18320
+  return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __b,
 
18321
                                                 (int8x8_t) __a);
 
18322
 }
 
18323
 
 
18324
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18325
 vcle_u16 (uint16x4_t __a, uint16x4_t __b)
 
18326
 {
 
18327
-  return (uint16x4_t) __builtin_aarch64_cmhsv4hi ((int16x4_t) __b,
 
18328
+  return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __b,
 
18329
                                                  (int16x4_t) __a);
 
18330
 }
 
18331
 
 
18332
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18333
 vcle_u32 (uint32x2_t __a, uint32x2_t __b)
 
18334
 {
 
18335
-  return (uint32x2_t) __builtin_aarch64_cmhsv2si ((int32x2_t) __b,
 
18336
+  return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __b,
 
18337
                                                  (int32x2_t) __a);
 
18338
 }
 
18339
 
 
18340
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18341
 vcle_u64 (uint64x1_t __a, uint64x1_t __b)
 
18342
 {
 
18343
-  return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __b,
 
18344
-                                               (int64x1_t) __a);
 
18345
+  return __a <= __b ? -1ll : 0ll;
 
18346
 }
 
18347
 
 
18348
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18349
+vcleq_f32 (float32x4_t __a, float32x4_t __b)
 
18350
+{
 
18351
+  return (uint32x4_t) __builtin_aarch64_cmgev4sf (__b, __a);
 
18352
+}
 
18353
+
 
18354
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18355
+vcleq_f64 (float64x2_t __a, float64x2_t __b)
 
18356
+{
 
18357
+  return (uint64x2_t) __builtin_aarch64_cmgev2df (__b, __a);
 
18358
+}
 
18359
+
 
18360
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18361
+vcleq_p8 (poly8x16_t __a, poly8x16_t __b)
 
18362
+{
 
18363
+  return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __b,
 
18364
+                                                  (int8x16_t) __a);
 
18365
+}
 
18366
+
 
18367
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18368
 vcleq_s8 (int8x16_t __a, int8x16_t __b)
 
18369
 {
 
18370
   return (uint8x16_t) __builtin_aarch64_cmgev16qi (__b, __a);
 
18371
@@ -19853,46 +18842,213 @@
 
18372
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18373
 vcleq_u8 (uint8x16_t __a, uint8x16_t __b)
 
18374
 {
 
18375
-  return (uint8x16_t) __builtin_aarch64_cmhsv16qi ((int8x16_t) __b,
 
18376
+  return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __b,
 
18377
                                                   (int8x16_t) __a);
 
18378
 }
 
18379
 
 
18380
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18381
 vcleq_u16 (uint16x8_t __a, uint16x8_t __b)
 
18382
 {
 
18383
-  return (uint16x8_t) __builtin_aarch64_cmhsv8hi ((int16x8_t) __b,
 
18384
+  return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __b,
 
18385
                                                  (int16x8_t) __a);
 
18386
 }
 
18387
 
 
18388
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18389
 vcleq_u32 (uint32x4_t __a, uint32x4_t __b)
 
18390
 {
 
18391
-  return (uint32x4_t) __builtin_aarch64_cmhsv4si ((int32x4_t) __b,
 
18392
+  return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __b,
 
18393
                                                  (int32x4_t) __a);
 
18394
 }
 
18395
 
 
18396
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18397
 vcleq_u64 (uint64x2_t __a, uint64x2_t __b)
 
18398
 {
 
18399
-  return (uint64x2_t) __builtin_aarch64_cmhsv2di ((int64x2_t) __b,
 
18400
+  return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __b,
 
18401
                                                  (int64x2_t) __a);
 
18402
 }
 
18403
 
 
18404
+/* vcle - scalar.  */
 
18405
+
 
18406
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18407
+vcles_f32 (float32_t __a, float32_t __b)
 
18408
+{
 
18409
+  return __a <= __b ? -1 : 0;
 
18410
+}
 
18411
+
 
18412
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18413
 vcled_s64 (int64x1_t __a, int64x1_t __b)
 
18414
 {
 
18415
-  return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a);
 
18416
+  return __a <= __b ? -1ll : 0ll;
 
18417
 }
 
18418
 
 
18419
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18420
+vcled_u64 (uint64x1_t __a, uint64x1_t __b)
 
18421
+{
 
18422
+  return __a <= __b ? -1ll : 0ll;
 
18423
+}
 
18424
+
 
18425
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18426
+vcled_f64 (float64_t __a, float64_t __b)
 
18427
+{
 
18428
+  return __a <= __b ? -1ll : 0ll;
 
18429
+}
 
18430
+
 
18431
+/* vclez - vector.  */
 
18432
+
 
18433
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18434
+vclez_f32 (float32x2_t __a)
 
18435
+{
 
18436
+  float32x2_t __b = {0.0f, 0.0f};
 
18437
+  return (uint32x2_t) __builtin_aarch64_cmlev2sf (__a, __b);
 
18438
+}
 
18439
+
 
18440
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18441
+vclez_f64 (float64x1_t __a)
 
18442
+{
 
18443
+  return __a <= 0.0 ? -1ll : 0ll;
 
18444
+}
 
18445
+
 
18446
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18447
+vclez_p8 (poly8x8_t __a)
 
18448
+{
 
18449
+  poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18450
+  return (uint8x8_t) __builtin_aarch64_cmlev8qi ((int8x8_t) __a,
 
18451
+                                                (int8x8_t) __b);
 
18452
+}
 
18453
+
 
18454
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18455
+vclez_s8 (int8x8_t __a)
 
18456
+{
 
18457
+  int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18458
+  return (uint8x8_t) __builtin_aarch64_cmlev8qi (__a, __b);
 
18459
+}
 
18460
+
 
18461
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18462
+vclez_s16 (int16x4_t __a)
 
18463
+{
 
18464
+  int16x4_t __b = {0, 0, 0, 0};
 
18465
+  return (uint16x4_t) __builtin_aarch64_cmlev4hi (__a, __b);
 
18466
+}
 
18467
+
 
18468
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18469
+vclez_s32 (int32x2_t __a)
 
18470
+{
 
18471
+  int32x2_t __b = {0, 0};
 
18472
+  return (uint32x2_t) __builtin_aarch64_cmlev2si (__a, __b);
 
18473
+}
 
18474
+
 
18475
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18476
+vclez_s64 (int64x1_t __a)
 
18477
+{
 
18478
+  return __a <= 0ll ? -1ll : 0ll;
 
18479
+}
 
18480
+
 
18481
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18482
+vclez_u64 (uint64x1_t __a)
 
18483
+{
 
18484
+  return __a <= 0ll ? -1ll : 0ll;
 
18485
+}
 
18486
+
 
18487
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18488
+vclezq_f32 (float32x4_t __a)
 
18489
+{
 
18490
+  float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
 
18491
+  return (uint32x4_t) __builtin_aarch64_cmlev4sf (__a, __b);
 
18492
+}
 
18493
+
 
18494
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18495
+vclezq_f64 (float64x2_t __a)
 
18496
+{
 
18497
+  float64x2_t __b = {0.0, 0.0};
 
18498
+  return (uint64x2_t) __builtin_aarch64_cmlev2df (__a, __b);
 
18499
+}
 
18500
+
 
18501
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18502
+vclezq_p8 (poly8x16_t __a)
 
18503
+{
 
18504
+  poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18505
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
18506
+  return (uint8x16_t) __builtin_aarch64_cmlev16qi ((int8x16_t) __a,
 
18507
+                                                  (int8x16_t) __b);
 
18508
+}
 
18509
+
 
18510
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18511
+vclezq_s8 (int8x16_t __a)
 
18512
+{
 
18513
+  int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18514
+                  0, 0, 0, 0, 0, 0, 0, 0};
 
18515
+  return (uint8x16_t) __builtin_aarch64_cmlev16qi (__a, __b);
 
18516
+}
 
18517
+
 
18518
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18519
+vclezq_s16 (int16x8_t __a)
 
18520
+{
 
18521
+  int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18522
+  return (uint16x8_t) __builtin_aarch64_cmlev8hi (__a, __b);
 
18523
+}
 
18524
+
 
18525
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18526
+vclezq_s32 (int32x4_t __a)
 
18527
+{
 
18528
+  int32x4_t __b = {0, 0, 0, 0};
 
18529
+  return (uint32x4_t) __builtin_aarch64_cmlev4si (__a, __b);
 
18530
+}
 
18531
+
 
18532
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18533
+vclezq_s64 (int64x2_t __a)
 
18534
+{
 
18535
+  int64x2_t __b = {0, 0};
 
18536
+  return (uint64x2_t) __builtin_aarch64_cmlev2di (__a, __b);
 
18537
+}
 
18538
+
 
18539
+/* vclez - scalar.  */
 
18540
+
 
18541
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18542
+vclezs_f32 (float32_t __a)
 
18543
+{
 
18544
+  return __a <= 0.0f ? -1 : 0;
 
18545
+}
 
18546
+
 
18547
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18548
 vclezd_s64 (int64x1_t __a)
 
18549
 {
 
18550
-  return (uint64x1_t) __builtin_aarch64_cmledi (__a, 0);
 
18551
+  return __a <= 0 ? -1ll : 0ll;
 
18552
 }
 
18553
 
 
18554
-/* vclt */
 
18555
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18556
+vclezd_u64 (int64x1_t __a)
 
18557
+{
 
18558
+  return __a <= 0 ? -1ll : 0ll;
 
18559
+}
 
18560
 
 
18561
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18562
+vclezd_f64 (float64_t __a)
 
18563
+{
 
18564
+  return __a <= 0.0 ? -1ll : 0ll;
 
18565
+}
 
18566
+
 
18567
+/* vclt - vector.  */
 
18568
+
 
18569
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18570
+vclt_f32 (float32x2_t __a, float32x2_t __b)
 
18571
+{
 
18572
+  return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__b, __a);
 
18573
+}
 
18574
+
 
18575
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18576
+vclt_f64 (float64x1_t __a, float64x1_t __b)
 
18577
+{
 
18578
+  return __a < __b ? -1ll : 0ll;
 
18579
+}
 
18580
+
 
18581
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18582
+vclt_p8 (poly8x8_t __a, poly8x8_t __b)
 
18583
+{
 
18584
+  return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __b,
 
18585
+                                                (int8x8_t) __a);
 
18586
+}
 
18587
+
 
18588
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18589
 vclt_s8 (int8x8_t __a, int8x8_t __b)
 
18590
 {
 
18591
   return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__b, __a);
 
18592
@@ -19913,38 +19069,56 @@
 
18593
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18594
 vclt_s64 (int64x1_t __a, int64x1_t __b)
 
18595
 {
 
18596
-  return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a);
 
18597
+  return __a < __b ? -1ll : 0ll;
 
18598
 }
 
18599
 
 
18600
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18601
 vclt_u8 (uint8x8_t __a, uint8x8_t __b)
 
18602
 {
 
18603
-  return (uint8x8_t) __builtin_aarch64_cmhiv8qi ((int8x8_t) __b,
 
18604
+  return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __b,
 
18605
                                                 (int8x8_t) __a);
 
18606
 }
 
18607
 
 
18608
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18609
 vclt_u16 (uint16x4_t __a, uint16x4_t __b)
 
18610
 {
 
18611
-  return (uint16x4_t) __builtin_aarch64_cmhiv4hi ((int16x4_t) __b,
 
18612
+  return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __b,
 
18613
                                                  (int16x4_t) __a);
 
18614
 }
 
18615
 
 
18616
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18617
 vclt_u32 (uint32x2_t __a, uint32x2_t __b)
 
18618
 {
 
18619
-  return (uint32x2_t) __builtin_aarch64_cmhiv2si ((int32x2_t) __b,
 
18620
+  return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __b,
 
18621
                                                  (int32x2_t) __a);
 
18622
 }
 
18623
 
 
18624
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18625
 vclt_u64 (uint64x1_t __a, uint64x1_t __b)
 
18626
 {
 
18627
-  return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __b,
 
18628
-                                               (int64x1_t) __a);
 
18629
+  return __a < __b ? -1ll : 0ll;
 
18630
 }
 
18631
 
 
18632
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18633
+vcltq_f32 (float32x4_t __a, float32x4_t __b)
 
18634
+{
 
18635
+  return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__b, __a);
 
18636
+}
 
18637
+
 
18638
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18639
+vcltq_f64 (float64x2_t __a, float64x2_t __b)
 
18640
+{
 
18641
+  return (uint64x2_t) __builtin_aarch64_cmgtv2df (__b, __a);
 
18642
+}
 
18643
+
 
18644
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18645
+vcltq_p8 (poly8x16_t __a, poly8x16_t __b)
 
18646
+{
 
18647
+  return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __b,
 
18648
+                                                  (int8x16_t) __a);
 
18649
+}
 
18650
+
 
18651
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18652
 vcltq_s8 (int8x16_t __a, int8x16_t __b)
 
18653
 {
 
18654
   return (uint8x16_t) __builtin_aarch64_cmgtv16qi (__b, __a);
 
18655
@@ -19971,91 +19145,664 @@
 
18656
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18657
 vcltq_u8 (uint8x16_t __a, uint8x16_t __b)
 
18658
 {
 
18659
-  return (uint8x16_t) __builtin_aarch64_cmhiv16qi ((int8x16_t) __b,
 
18660
+  return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __b,
 
18661
                                                   (int8x16_t) __a);
 
18662
 }
 
18663
 
 
18664
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18665
 vcltq_u16 (uint16x8_t __a, uint16x8_t __b)
 
18666
 {
 
18667
-  return (uint16x8_t) __builtin_aarch64_cmhiv8hi ((int16x8_t) __b,
 
18668
+  return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __b,
 
18669
                                                  (int16x8_t) __a);
 
18670
 }
 
18671
 
 
18672
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18673
 vcltq_u32 (uint32x4_t __a, uint32x4_t __b)
 
18674
 {
 
18675
-  return (uint32x4_t) __builtin_aarch64_cmhiv4si ((int32x4_t) __b,
 
18676
+  return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __b,
 
18677
                                                  (int32x4_t) __a);
 
18678
 }
 
18679
 
 
18680
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18681
 vcltq_u64 (uint64x2_t __a, uint64x2_t __b)
 
18682
 {
 
18683
-  return (uint64x2_t) __builtin_aarch64_cmhiv2di ((int64x2_t) __b,
 
18684
+  return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __b,
 
18685
                                                  (int64x2_t) __a);
 
18686
 }
 
18687
 
 
18688
+/* vclt - scalar.  */
 
18689
+
 
18690
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18691
+vclts_f32 (float32_t __a, float32_t __b)
 
18692
+{
 
18693
+  return __a < __b ? -1 : 0;
 
18694
+}
 
18695
+
 
18696
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18697
 vcltd_s64 (int64x1_t __a, int64x1_t __b)
 
18698
 {
 
18699
-  return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a);
 
18700
+  return __a < __b ? -1ll : 0ll;
 
18701
 }
 
18702
 
 
18703
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18704
+vcltd_u64 (uint64x1_t __a, uint64x1_t __b)
 
18705
+{
 
18706
+  return __a < __b ? -1ll : 0ll;
 
18707
+}
 
18708
+
 
18709
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18710
+vcltd_f64 (float64_t __a, float64_t __b)
 
18711
+{
 
18712
+  return __a < __b ? -1ll : 0ll;
 
18713
+}
 
18714
+
 
18715
+/* vcltz - vector.  */
 
18716
+
 
18717
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18718
+vcltz_f32 (float32x2_t __a)
 
18719
+{
 
18720
+  float32x2_t __b = {0.0f, 0.0f};
 
18721
+  return (uint32x2_t) __builtin_aarch64_cmltv2sf (__a, __b);
 
18722
+}
 
18723
+
 
18724
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18725
+vcltz_f64 (float64x1_t __a)
 
18726
+{
 
18727
+  return __a < 0.0 ? -1ll : 0ll;
 
18728
+}
 
18729
+
 
18730
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18731
+vcltz_p8 (poly8x8_t __a)
 
18732
+{
 
18733
+  poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18734
+  return (uint8x8_t) __builtin_aarch64_cmltv8qi ((int8x8_t) __a,
 
18735
+                                                (int8x8_t) __b);
 
18736
+}
 
18737
+
 
18738
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
18739
+vcltz_s8 (int8x8_t __a)
 
18740
+{
 
18741
+  int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18742
+  return (uint8x8_t) __builtin_aarch64_cmltv8qi (__a, __b);
 
18743
+}
 
18744
+
 
18745
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
18746
+vcltz_s16 (int16x4_t __a)
 
18747
+{
 
18748
+  int16x4_t __b = {0, 0, 0, 0};
 
18749
+  return (uint16x4_t) __builtin_aarch64_cmltv4hi (__a, __b);
 
18750
+}
 
18751
+
 
18752
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18753
+vcltz_s32 (int32x2_t __a)
 
18754
+{
 
18755
+  int32x2_t __b = {0, 0};
 
18756
+  return (uint32x2_t) __builtin_aarch64_cmltv2si (__a, __b);
 
18757
+}
 
18758
+
 
18759
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18760
+vcltz_s64 (int64x1_t __a)
 
18761
+{
 
18762
+  return __a < 0ll ? -1ll : 0ll;
 
18763
+}
 
18764
+
 
18765
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18766
+vcltzq_f32 (float32x4_t __a)
 
18767
+{
 
18768
+  float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
 
18769
+  return (uint32x4_t) __builtin_aarch64_cmltv4sf (__a, __b);
 
18770
+}
 
18771
+
 
18772
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18773
+vcltzq_f64 (float64x2_t __a)
 
18774
+{
 
18775
+  float64x2_t __b = {0.0, 0.0};
 
18776
+  return (uint64x2_t) __builtin_aarch64_cmltv2df (__a, __b);
 
18777
+}
 
18778
+
 
18779
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18780
+vcltzq_p8 (poly8x16_t __a)
 
18781
+{
 
18782
+  poly8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18783
+                   0, 0, 0, 0, 0, 0, 0, 0};
 
18784
+  return (uint8x16_t) __builtin_aarch64_cmltv16qi ((int8x16_t) __a,
 
18785
+                                                  (int8x16_t) __b);
 
18786
+}
 
18787
+
 
18788
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
18789
+vcltzq_s8 (int8x16_t __a)
 
18790
+{
 
18791
+  int8x16_t __b = {0, 0, 0, 0, 0, 0, 0, 0,
 
18792
+                  0, 0, 0, 0, 0, 0, 0, 0};
 
18793
+  return (uint8x16_t) __builtin_aarch64_cmltv16qi (__a, __b);
 
18794
+}
 
18795
+
 
18796
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
18797
+vcltzq_s16 (int16x8_t __a)
 
18798
+{
 
18799
+  int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
 
18800
+  return (uint16x8_t) __builtin_aarch64_cmltv8hi (__a, __b);
 
18801
+}
 
18802
+
 
18803
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18804
+vcltzq_s32 (int32x4_t __a)
 
18805
+{
 
18806
+  int32x4_t __b = {0, 0, 0, 0};
 
18807
+  return (uint32x4_t) __builtin_aarch64_cmltv4si (__a, __b);
 
18808
+}
 
18809
+
 
18810
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18811
+vcltzq_s64 (int64x2_t __a)
 
18812
+{
 
18813
+  int64x2_t __b = {0, 0};
 
18814
+  return (uint64x2_t) __builtin_aarch64_cmltv2di (__a, __b);
 
18815
+}
 
18816
+
 
18817
+/* vcltz - scalar.  */
 
18818
+
 
18819
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18820
+vcltzs_f32 (float32_t __a)
 
18821
+{
 
18822
+  return __a < 0.0f ? -1 : 0;
 
18823
+}
 
18824
+
 
18825
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18826
 vcltzd_s64 (int64x1_t __a)
 
18827
 {
 
18828
-  return (uint64x1_t) __builtin_aarch64_cmltdi (__a, 0);
 
18829
+  return __a < 0 ? -1ll : 0ll;
 
18830
 }
 
18831
 
 
18832
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
18833
+vcltzd_u64 (int64x1_t __a)
 
18834
+{
 
18835
+  return __a < 0 ? -1ll : 0ll;
 
18836
+}
 
18837
+
 
18838
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18839
+vcltzd_f64 (float64_t __a)
 
18840
+{
 
18841
+  return __a < 0.0 ? -1ll : 0ll;
 
18842
+}
 
18843
+
 
18844
+/* vcvt (double -> float).  */
 
18845
+
 
18846
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
18847
+vcvt_f32_f64 (float64x2_t __a)
 
18848
+{
 
18849
+  return __builtin_aarch64_float_truncate_lo_v2sf (__a);
 
18850
+}
 
18851
+
 
18852
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
18853
+vcvt_high_f32_f64 (float32x2_t __a, float64x2_t __b)
 
18854
+{
 
18855
+  return __builtin_aarch64_float_truncate_hi_v4sf (__a, __b);
 
18856
+}
 
18857
+
 
18858
+/* vcvt (float -> double).  */
 
18859
+
 
18860
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
18861
+vcvt_f64_f32 (float32x2_t __a)
 
18862
+{
 
18863
+
 
18864
+  return __builtin_aarch64_float_extend_lo_v2df (__a);
 
18865
+}
 
18866
+
 
18867
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
18868
+vcvt_high_f64_f32 (float32x4_t __a)
 
18869
+{
 
18870
+  return __builtin_aarch64_vec_unpacks_hi_v4sf (__a);
 
18871
+}
 
18872
+
 
18873
+/* vcvt  (<u>int -> float)  */
 
18874
+
 
18875
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
18876
+vcvtd_f64_s64 (int64_t __a)
 
18877
+{
 
18878
+  return (float64_t) __a;
 
18879
+}
 
18880
+
 
18881
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
18882
+vcvtd_f64_u64 (uint64_t __a)
 
18883
+{
 
18884
+  return (float64_t) __a;
 
18885
+}
 
18886
+
 
18887
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
18888
+vcvts_f32_s32 (int32_t __a)
 
18889
+{
 
18890
+  return (float32_t) __a;
 
18891
+}
 
18892
+
 
18893
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
18894
+vcvts_f32_u32 (uint32_t __a)
 
18895
+{
 
18896
+  return (float32_t) __a;
 
18897
+}
 
18898
+
 
18899
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
18900
+vcvt_f32_s32 (int32x2_t __a)
 
18901
+{
 
18902
+  return __builtin_aarch64_floatv2siv2sf (__a);
 
18903
+}
 
18904
+
 
18905
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
18906
+vcvt_f32_u32 (uint32x2_t __a)
 
18907
+{
 
18908
+  return __builtin_aarch64_floatunsv2siv2sf ((int32x2_t) __a);
 
18909
+}
 
18910
+
 
18911
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
18912
+vcvtq_f32_s32 (int32x4_t __a)
 
18913
+{
 
18914
+  return __builtin_aarch64_floatv4siv4sf (__a);
 
18915
+}
 
18916
+
 
18917
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
18918
+vcvtq_f32_u32 (uint32x4_t __a)
 
18919
+{
 
18920
+  return __builtin_aarch64_floatunsv4siv4sf ((int32x4_t) __a);
 
18921
+}
 
18922
+
 
18923
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
18924
+vcvtq_f64_s64 (int64x2_t __a)
 
18925
+{
 
18926
+  return __builtin_aarch64_floatv2div2df (__a);
 
18927
+}
 
18928
+
 
18929
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
18930
+vcvtq_f64_u64 (uint64x2_t __a)
 
18931
+{
 
18932
+  return __builtin_aarch64_floatunsv2div2df ((int64x2_t) __a);
 
18933
+}
 
18934
+
 
18935
+/* vcvt (float -> <u>int)  */
 
18936
+
 
18937
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
18938
+vcvtd_s64_f64 (float64_t __a)
 
18939
+{
 
18940
+  return (int64_t) __a;
 
18941
+}
 
18942
+
 
18943
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
18944
+vcvtd_u64_f64 (float64_t __a)
 
18945
+{
 
18946
+  return (uint64_t) __a;
 
18947
+}
 
18948
+
 
18949
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
18950
+vcvts_s32_f32 (float32_t __a)
 
18951
+{
 
18952
+  return (int32_t) __a;
 
18953
+}
 
18954
+
 
18955
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
18956
+vcvts_u32_f32 (float32_t __a)
 
18957
+{
 
18958
+  return (uint32_t) __a;
 
18959
+}
 
18960
+
 
18961
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
18962
+vcvt_s32_f32 (float32x2_t __a)
 
18963
+{
 
18964
+  return __builtin_aarch64_lbtruncv2sfv2si (__a);
 
18965
+}
 
18966
+
 
18967
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
18968
+vcvt_u32_f32 (float32x2_t __a)
 
18969
+{
 
18970
+  /* TODO: This cast should go away when builtins have
 
18971
+     their correct types.  */
 
18972
+  return (uint32x2_t) __builtin_aarch64_lbtruncuv2sfv2si (__a);
 
18973
+}
 
18974
+
 
18975
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
18976
+vcvtq_s32_f32 (float32x4_t __a)
 
18977
+{
 
18978
+  return __builtin_aarch64_lbtruncv4sfv4si (__a);
 
18979
+}
 
18980
+
 
18981
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
18982
+vcvtq_u32_f32 (float32x4_t __a)
 
18983
+{
 
18984
+  /* TODO: This cast should go away when builtins have
 
18985
+     their correct types.  */
 
18986
+  return (uint32x4_t) __builtin_aarch64_lbtruncuv4sfv4si (__a);
 
18987
+}
 
18988
+
 
18989
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
18990
+vcvtq_s64_f64 (float64x2_t __a)
 
18991
+{
 
18992
+  return __builtin_aarch64_lbtruncv2dfv2di (__a);
 
18993
+}
 
18994
+
 
18995
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
18996
+vcvtq_u64_f64 (float64x2_t __a)
 
18997
+{
 
18998
+  /* TODO: This cast should go away when builtins have
 
18999
+     their correct types.  */
 
19000
+  return (uint64x2_t) __builtin_aarch64_lbtruncuv2dfv2di (__a);
 
19001
+}
 
19002
+
 
19003
+/* vcvta  */
 
19004
+
 
19005
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
19006
+vcvtad_s64_f64 (float64_t __a)
 
19007
+{
 
19008
+  return __builtin_aarch64_lrounddfdi (__a);
 
19009
+}
 
19010
+
 
19011
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
19012
+vcvtad_u64_f64 (float64_t __a)
 
19013
+{
 
19014
+  return __builtin_aarch64_lroundudfdi (__a);
 
19015
+}
 
19016
+
 
19017
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19018
+vcvtas_s32_f32 (float32_t __a)
 
19019
+{
 
19020
+  return __builtin_aarch64_lroundsfsi (__a);
 
19021
+}
 
19022
+
 
19023
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19024
+vcvtas_u32_f32 (float32_t __a)
 
19025
+{
 
19026
+  return __builtin_aarch64_lroundusfsi (__a);
 
19027
+}
 
19028
+
 
19029
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
19030
+vcvta_s32_f32 (float32x2_t __a)
 
19031
+{
 
19032
+  return __builtin_aarch64_lroundv2sfv2si (__a);
 
19033
+}
 
19034
+
 
19035
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
19036
+vcvta_u32_f32 (float32x2_t __a)
 
19037
+{
 
19038
+  /* TODO: This cast should go away when builtins have
 
19039
+     their correct types.  */
 
19040
+  return (uint32x2_t) __builtin_aarch64_lrounduv2sfv2si (__a);
 
19041
+}
 
19042
+
 
19043
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19044
+vcvtaq_s32_f32 (float32x4_t __a)
 
19045
+{
 
19046
+  return __builtin_aarch64_lroundv4sfv4si (__a);
 
19047
+}
 
19048
+
 
19049
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
19050
+vcvtaq_u32_f32 (float32x4_t __a)
 
19051
+{
 
19052
+  /* TODO: This cast should go away when builtins have
 
19053
+     their correct types.  */
 
19054
+  return (uint32x4_t) __builtin_aarch64_lrounduv4sfv4si (__a);
 
19055
+}
 
19056
+
 
19057
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19058
+vcvtaq_s64_f64 (float64x2_t __a)
 
19059
+{
 
19060
+  return __builtin_aarch64_lroundv2dfv2di (__a);
 
19061
+}
 
19062
+
 
19063
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
19064
+vcvtaq_u64_f64 (float64x2_t __a)
 
19065
+{
 
19066
+  /* TODO: This cast should go away when builtins have
 
19067
+     their correct types.  */
 
19068
+  return (uint64x2_t) __builtin_aarch64_lrounduv2dfv2di (__a);
 
19069
+}
 
19070
+
 
19071
+/* vcvtm  */
 
19072
+
 
19073
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
19074
+vcvtmd_s64_f64 (float64_t __a)
 
19075
+{
 
19076
+  return __builtin_lfloor (__a);
 
19077
+}
 
19078
+
 
19079
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
19080
+vcvtmd_u64_f64 (float64_t __a)
 
19081
+{
 
19082
+  return __builtin_aarch64_lfloorudfdi (__a);
 
19083
+}
 
19084
+
 
19085
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19086
+vcvtms_s32_f32 (float32_t __a)
 
19087
+{
 
19088
+  return __builtin_ifloorf (__a);
 
19089
+}
 
19090
+
 
19091
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19092
+vcvtms_u32_f32 (float32_t __a)
 
19093
+{
 
19094
+  return __builtin_aarch64_lfloorusfsi (__a);
 
19095
+}
 
19096
+
 
19097
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
19098
+vcvtm_s32_f32 (float32x2_t __a)
 
19099
+{
 
19100
+  return __builtin_aarch64_lfloorv2sfv2si (__a);
 
19101
+}
 
19102
+
 
19103
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
19104
+vcvtm_u32_f32 (float32x2_t __a)
 
19105
+{
 
19106
+  /* TODO: This cast should go away when builtins have
 
19107
+     their correct types.  */
 
19108
+  return (uint32x2_t) __builtin_aarch64_lflooruv2sfv2si (__a);
 
19109
+}
 
19110
+
 
19111
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19112
+vcvtmq_s32_f32 (float32x4_t __a)
 
19113
+{
 
19114
+  return __builtin_aarch64_lfloorv4sfv4si (__a);
 
19115
+}
 
19116
+
 
19117
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
19118
+vcvtmq_u32_f32 (float32x4_t __a)
 
19119
+{
 
19120
+  /* TODO: This cast should go away when builtins have
 
19121
+     their correct types.  */
 
19122
+  return (uint32x4_t) __builtin_aarch64_lflooruv4sfv4si (__a);
 
19123
+}
 
19124
+
 
19125
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19126
+vcvtmq_s64_f64 (float64x2_t __a)
 
19127
+{
 
19128
+  return __builtin_aarch64_lfloorv2dfv2di (__a);
 
19129
+}
 
19130
+
 
19131
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
19132
+vcvtmq_u64_f64 (float64x2_t __a)
 
19133
+{
 
19134
+  /* TODO: This cast should go away when builtins have
 
19135
+     their correct types.  */
 
19136
+  return (uint64x2_t) __builtin_aarch64_lflooruv2dfv2di (__a);
 
19137
+}
 
19138
+
 
19139
+/* vcvtn  */
 
19140
+
 
19141
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
19142
+vcvtnd_s64_f64 (float64_t __a)
 
19143
+{
 
19144
+  return __builtin_aarch64_lfrintndfdi (__a);
 
19145
+}
 
19146
+
 
19147
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
19148
+vcvtnd_u64_f64 (float64_t __a)
 
19149
+{
 
19150
+  return __builtin_aarch64_lfrintnudfdi (__a);
 
19151
+}
 
19152
+
 
19153
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19154
+vcvtns_s32_f32 (float32_t __a)
 
19155
+{
 
19156
+  return __builtin_aarch64_lfrintnsfsi (__a);
 
19157
+}
 
19158
+
 
19159
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19160
+vcvtns_u32_f32 (float32_t __a)
 
19161
+{
 
19162
+  return __builtin_aarch64_lfrintnusfsi (__a);
 
19163
+}
 
19164
+
 
19165
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
19166
+vcvtn_s32_f32 (float32x2_t __a)
 
19167
+{
 
19168
+  return __builtin_aarch64_lfrintnv2sfv2si (__a);
 
19169
+}
 
19170
+
 
19171
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
19172
+vcvtn_u32_f32 (float32x2_t __a)
 
19173
+{
 
19174
+  /* TODO: This cast should go away when builtins have
 
19175
+     their correct types.  */
 
19176
+  return (uint32x2_t) __builtin_aarch64_lfrintnuv2sfv2si (__a);
 
19177
+}
 
19178
+
 
19179
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19180
+vcvtnq_s32_f32 (float32x4_t __a)
 
19181
+{
 
19182
+  return __builtin_aarch64_lfrintnv4sfv4si (__a);
 
19183
+}
 
19184
+
 
19185
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
19186
+vcvtnq_u32_f32 (float32x4_t __a)
 
19187
+{
 
19188
+  /* TODO: This cast should go away when builtins have
 
19189
+     their correct types.  */
 
19190
+  return (uint32x4_t) __builtin_aarch64_lfrintnuv4sfv4si (__a);
 
19191
+}
 
19192
+
 
19193
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19194
+vcvtnq_s64_f64 (float64x2_t __a)
 
19195
+{
 
19196
+  return __builtin_aarch64_lfrintnv2dfv2di (__a);
 
19197
+}
 
19198
+
 
19199
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
19200
+vcvtnq_u64_f64 (float64x2_t __a)
 
19201
+{
 
19202
+  /* TODO: This cast should go away when builtins have
 
19203
+     their correct types.  */
 
19204
+  return (uint64x2_t) __builtin_aarch64_lfrintnuv2dfv2di (__a);
 
19205
+}
 
19206
+
 
19207
+/* vcvtp  */
 
19208
+
 
19209
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
 
19210
+vcvtpd_s64_f64 (float64_t __a)
 
19211
+{
 
19212
+  return __builtin_lceil (__a);
 
19213
+}
 
19214
+
 
19215
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
 
19216
+vcvtpd_u64_f64 (float64_t __a)
 
19217
+{
 
19218
+  return __builtin_aarch64_lceiludfdi (__a);
 
19219
+}
 
19220
+
 
19221
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19222
+vcvtps_s32_f32 (float32_t __a)
 
19223
+{
 
19224
+  return __builtin_iceilf (__a);
 
19225
+}
 
19226
+
 
19227
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19228
+vcvtps_u32_f32 (float32_t __a)
 
19229
+{
 
19230
+  return __builtin_aarch64_lceilusfsi (__a);
 
19231
+}
 
19232
+
 
19233
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
19234
+vcvtp_s32_f32 (float32x2_t __a)
 
19235
+{
 
19236
+  return __builtin_aarch64_lceilv2sfv2si (__a);
 
19237
+}
 
19238
+
 
19239
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
19240
+vcvtp_u32_f32 (float32x2_t __a)
 
19241
+{
 
19242
+  /* TODO: This cast should go away when builtins have
 
19243
+     their correct types.  */
 
19244
+  return (uint32x2_t) __builtin_aarch64_lceiluv2sfv2si (__a);
 
19245
+}
 
19246
+
 
19247
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19248
+vcvtpq_s32_f32 (float32x4_t __a)
 
19249
+{
 
19250
+  return __builtin_aarch64_lceilv4sfv4si (__a);
 
19251
+}
 
19252
+
 
19253
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
19254
+vcvtpq_u32_f32 (float32x4_t __a)
 
19255
+{
 
19256
+  /* TODO: This cast should go away when builtins have
 
19257
+     their correct types.  */
 
19258
+  return (uint32x4_t) __builtin_aarch64_lceiluv4sfv4si (__a);
 
19259
+}
 
19260
+
 
19261
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19262
+vcvtpq_s64_f64 (float64x2_t __a)
 
19263
+{
 
19264
+  return __builtin_aarch64_lceilv2dfv2di (__a);
 
19265
+}
 
19266
+
 
19267
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
19268
+vcvtpq_u64_f64 (float64x2_t __a)
 
19269
+{
 
19270
+  /* TODO: This cast should go away when builtins have
 
19271
+     their correct types.  */
 
19272
+  return (uint64x2_t) __builtin_aarch64_lceiluv2dfv2di (__a);
 
19273
+}
 
19274
+
 
19275
 /* vdup */
 
19276
 
 
19277
 __extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
 
19278
 vdupb_lane_s8 (int8x16_t a, int const b)
 
19279
 {
 
19280
-  return __builtin_aarch64_dup_laneqi (a, b);
 
19281
+  return __aarch64_vgetq_lane_s8 (a, b);
 
19282
 }
 
19283
 
 
19284
 __extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
 
19285
 vdupb_lane_u8 (uint8x16_t a, int const b)
 
19286
 {
 
19287
-  return (uint8x1_t) __builtin_aarch64_dup_laneqi ((int8x16_t) a, b);
 
19288
+  return __aarch64_vgetq_lane_u8 (a, b);
 
19289
 }
 
19290
 
 
19291
 __extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
 
19292
 vduph_lane_s16 (int16x8_t a, int const b)
 
19293
 {
 
19294
-  return __builtin_aarch64_dup_lanehi (a, b);
 
19295
+  return __aarch64_vgetq_lane_s16 (a, b);
 
19296
 }
 
19297
 
 
19298
 __extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
 
19299
 vduph_lane_u16 (uint16x8_t a, int const b)
 
19300
 {
 
19301
-  return (uint16x1_t) __builtin_aarch64_dup_lanehi ((int16x8_t) a, b);
 
19302
+  return __aarch64_vgetq_lane_u16 (a, b);
 
19303
 }
 
19304
 
 
19305
 __extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
 
19306
 vdups_lane_s32 (int32x4_t a, int const b)
 
19307
 {
 
19308
-  return __builtin_aarch64_dup_lanesi (a, b);
 
19309
+  return __aarch64_vgetq_lane_s32 (a, b);
 
19310
 }
 
19311
 
 
19312
 __extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
 
19313
 vdups_lane_u32 (uint32x4_t a, int const b)
 
19314
 {
 
19315
-  return (uint32x1_t) __builtin_aarch64_dup_lanesi ((int32x4_t) a, b);
 
19316
+  return __aarch64_vgetq_lane_u32 (a, b);
 
19317
 }
 
19318
 
 
19319
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
19320
 vdupd_lane_s64 (int64x2_t a, int const b)
 
19321
 {
 
19322
-  return __builtin_aarch64_dup_lanedi (a, b);
 
19323
+  return __aarch64_vgetq_lane_s64 (a, b);
 
19324
 }
 
19325
 
 
19326
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
19327
 vdupd_lane_u64 (uint64x2_t a, int const b)
 
19328
 {
 
19329
-  return (uint64x1_t) __builtin_aarch64_dup_lanedi ((int64x2_t) a, b);
 
19330
+  return __aarch64_vgetq_lane_u64 (a, b);
 
19331
 }
 
19332
 
 
19333
 /* vld1 */
 
19334
@@ -21088,7 +20835,7 @@
 
19335
 __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19336
 vmax_f32 (float32x2_t __a, float32x2_t __b)
 
19337
 {
 
19338
-  return __builtin_aarch64_fmaxv2sf (__a, __b);
 
19339
+  return __builtin_aarch64_smax_nanv2sf (__a, __b);
 
19340
 }
 
19341
 
 
19342
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
19343
@@ -21133,13 +20880,13 @@
 
19344
 __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19345
 vmaxq_f32 (float32x4_t __a, float32x4_t __b)
 
19346
 {
 
19347
-  return __builtin_aarch64_fmaxv4sf (__a, __b);
 
19348
+  return __builtin_aarch64_smax_nanv4sf (__a, __b);
 
19349
 }
 
19350
 
 
19351
 __extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19352
 vmaxq_f64 (float64x2_t __a, float64x2_t __b)
 
19353
 {
 
19354
-  return __builtin_aarch64_fmaxv2df (__a, __b);
 
19355
+  return __builtin_aarch64_smax_nanv2df (__a, __b);
 
19356
 }
 
19357
 
 
19358
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
19359
@@ -21181,12 +20928,150 @@
 
19360
                                                  (int32x4_t) __b);
 
19361
 }
 
19362
 
 
19363
-/* vmin */
 
19364
+/* vmaxnm  */
 
19365
 
 
19366
 __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19367
+vmaxnm_f32 (float32x2_t __a, float32x2_t __b)
 
19368
+{
 
19369
+  return __builtin_aarch64_smaxv2sf (__a, __b);
 
19370
+}
 
19371
+
 
19372
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19373
+vmaxnmq_f32 (float32x4_t __a, float32x4_t __b)
 
19374
+{
 
19375
+  return __builtin_aarch64_smaxv4sf (__a, __b);
 
19376
+}
 
19377
+
 
19378
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19379
+vmaxnmq_f64 (float64x2_t __a, float64x2_t __b)
 
19380
+{
 
19381
+  return __builtin_aarch64_smaxv2df (__a, __b);
 
19382
+}
 
19383
+
 
19384
+/* vmaxv  */
 
19385
+
 
19386
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19387
+vmaxv_f32 (float32x2_t __a)
 
19388
+{
 
19389
+  return vget_lane_f32 (__builtin_aarch64_reduc_smax_nan_v2sf (__a), 0);
 
19390
+}
 
19391
+
 
19392
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
19393
+vmaxv_s8 (int8x8_t __a)
 
19394
+{
 
19395
+  return vget_lane_s8 (__builtin_aarch64_reduc_smax_v8qi (__a), 0);
 
19396
+}
 
19397
+
 
19398
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
19399
+vmaxv_s16 (int16x4_t __a)
 
19400
+{
 
19401
+  return vget_lane_s16 (__builtin_aarch64_reduc_smax_v4hi (__a), 0);
 
19402
+}
 
19403
+
 
19404
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19405
+vmaxv_s32 (int32x2_t __a)
 
19406
+{
 
19407
+  return vget_lane_s32 (__builtin_aarch64_reduc_smax_v2si (__a), 0);
 
19408
+}
 
19409
+
 
19410
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
19411
+vmaxv_u8 (uint8x8_t __a)
 
19412
+{
 
19413
+  return vget_lane_u8 ((uint8x8_t)
 
19414
+               __builtin_aarch64_reduc_umax_v8qi ((int8x8_t) __a), 0);
 
19415
+}
 
19416
+
 
19417
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
19418
+vmaxv_u16 (uint16x4_t __a)
 
19419
+{
 
19420
+  return vget_lane_u16 ((uint16x4_t)
 
19421
+               __builtin_aarch64_reduc_umax_v4hi ((int16x4_t) __a), 0);
 
19422
+}
 
19423
+
 
19424
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19425
+vmaxv_u32 (uint32x2_t __a)
 
19426
+{
 
19427
+  return vget_lane_u32 ((uint32x2_t)
 
19428
+               __builtin_aarch64_reduc_umax_v2si ((int32x2_t) __a), 0);
 
19429
+}
 
19430
+
 
19431
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19432
+vmaxvq_f32 (float32x4_t __a)
 
19433
+{
 
19434
+  return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_nan_v4sf (__a), 0);
 
19435
+}
 
19436
+
 
19437
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19438
+vmaxvq_f64 (float64x2_t __a)
 
19439
+{
 
19440
+  return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_nan_v2df (__a), 0);
 
19441
+}
 
19442
+
 
19443
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
19444
+vmaxvq_s8 (int8x16_t __a)
 
19445
+{
 
19446
+  return vgetq_lane_s8 (__builtin_aarch64_reduc_smax_v16qi (__a), 0);
 
19447
+}
 
19448
+
 
19449
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
19450
+vmaxvq_s16 (int16x8_t __a)
 
19451
+{
 
19452
+  return vgetq_lane_s16 (__builtin_aarch64_reduc_smax_v8hi (__a), 0);
 
19453
+}
 
19454
+
 
19455
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19456
+vmaxvq_s32 (int32x4_t __a)
 
19457
+{
 
19458
+  return vgetq_lane_s32 (__builtin_aarch64_reduc_smax_v4si (__a), 0);
 
19459
+}
 
19460
+
 
19461
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
19462
+vmaxvq_u8 (uint8x16_t __a)
 
19463
+{
 
19464
+  return vgetq_lane_u8 ((uint8x16_t)
 
19465
+               __builtin_aarch64_reduc_umax_v16qi ((int8x16_t) __a), 0);
 
19466
+}
 
19467
+
 
19468
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
19469
+vmaxvq_u16 (uint16x8_t __a)
 
19470
+{
 
19471
+  return vgetq_lane_u16 ((uint16x8_t)
 
19472
+               __builtin_aarch64_reduc_umax_v8hi ((int16x8_t) __a), 0);
 
19473
+}
 
19474
+
 
19475
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19476
+vmaxvq_u32 (uint32x4_t __a)
 
19477
+{
 
19478
+  return vgetq_lane_u32 ((uint32x4_t)
 
19479
+               __builtin_aarch64_reduc_umax_v4si ((int32x4_t) __a), 0);
 
19480
+}
 
19481
+
 
19482
+/* vmaxnmv  */
 
19483
+
 
19484
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19485
+vmaxnmv_f32 (float32x2_t __a)
 
19486
+{
 
19487
+  return vget_lane_f32 (__builtin_aarch64_reduc_smax_v2sf (__a), 0);
 
19488
+}
 
19489
+
 
19490
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19491
+vmaxnmvq_f32 (float32x4_t __a)
 
19492
+{
 
19493
+  return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_v4sf (__a), 0);
 
19494
+}
 
19495
+
 
19496
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19497
+vmaxnmvq_f64 (float64x2_t __a)
 
19498
+{
 
19499
+  return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_v2df (__a), 0);
 
19500
+}
 
19501
+
 
19502
+/* vmin  */
 
19503
+
 
19504
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19505
 vmin_f32 (float32x2_t __a, float32x2_t __b)
 
19506
 {
 
19507
-  return __builtin_aarch64_fminv2sf (__a, __b);
 
19508
+  return __builtin_aarch64_smin_nanv2sf (__a, __b);
 
19509
 }
 
19510
 
 
19511
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
19512
@@ -21231,13 +21116,13 @@
 
19513
 __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19514
 vminq_f32 (float32x4_t __a, float32x4_t __b)
 
19515
 {
 
19516
-  return __builtin_aarch64_fminv4sf (__a, __b);
 
19517
+  return __builtin_aarch64_smin_nanv4sf (__a, __b);
 
19518
 }
 
19519
 
 
19520
 __extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19521
 vminq_f64 (float64x2_t __a, float64x2_t __b)
 
19522
 {
 
19523
-  return __builtin_aarch64_fminv2df (__a, __b);
 
19524
+  return __builtin_aarch64_smin_nanv2df (__a, __b);
 
19525
 }
 
19526
 
 
19527
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
19528
@@ -21279,6 +21164,144 @@
 
19529
                                                  (int32x4_t) __b);
 
19530
 }
 
19531
 
 
19532
+/* vminnm  */
 
19533
+
 
19534
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19535
+vminnm_f32 (float32x2_t __a, float32x2_t __b)
 
19536
+{
 
19537
+  return __builtin_aarch64_sminv2sf (__a, __b);
 
19538
+}
 
19539
+
 
19540
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19541
+vminnmq_f32 (float32x4_t __a, float32x4_t __b)
 
19542
+{
 
19543
+  return __builtin_aarch64_sminv4sf (__a, __b);
 
19544
+}
 
19545
+
 
19546
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19547
+vminnmq_f64 (float64x2_t __a, float64x2_t __b)
 
19548
+{
 
19549
+  return __builtin_aarch64_sminv2df (__a, __b);
 
19550
+}
 
19551
+
 
19552
+/* vminv  */
 
19553
+
 
19554
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19555
+vminv_f32 (float32x2_t __a)
 
19556
+{
 
19557
+  return vget_lane_f32 (__builtin_aarch64_reduc_smin_nan_v2sf (__a), 0);
 
19558
+}
 
19559
+
 
19560
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
19561
+vminv_s8 (int8x8_t __a)
 
19562
+{
 
19563
+  return vget_lane_s8 (__builtin_aarch64_reduc_smin_v8qi (__a), 0);
 
19564
+}
 
19565
+
 
19566
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
19567
+vminv_s16 (int16x4_t __a)
 
19568
+{
 
19569
+  return vget_lane_s16 (__builtin_aarch64_reduc_smin_v4hi (__a), 0);
 
19570
+}
 
19571
+
 
19572
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19573
+vminv_s32 (int32x2_t __a)
 
19574
+{
 
19575
+  return vget_lane_s32 (__builtin_aarch64_reduc_smin_v2si (__a), 0);
 
19576
+}
 
19577
+
 
19578
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
19579
+vminv_u8 (uint8x8_t __a)
 
19580
+{
 
19581
+  return vget_lane_u8 ((uint8x8_t)
 
19582
+               __builtin_aarch64_reduc_umin_v8qi ((int8x8_t) __a), 0);
 
19583
+}
 
19584
+
 
19585
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
19586
+vminv_u16 (uint16x4_t __a)
 
19587
+{
 
19588
+  return vget_lane_u16 ((uint16x4_t)
 
19589
+               __builtin_aarch64_reduc_umin_v4hi ((int16x4_t) __a), 0);
 
19590
+}
 
19591
+
 
19592
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19593
+vminv_u32 (uint32x2_t __a)
 
19594
+{
 
19595
+  return vget_lane_u32 ((uint32x2_t)
 
19596
+               __builtin_aarch64_reduc_umin_v2si ((int32x2_t) __a), 0);
 
19597
+}
 
19598
+
 
19599
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19600
+vminvq_f32 (float32x4_t __a)
 
19601
+{
 
19602
+  return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_nan_v4sf (__a), 0);
 
19603
+}
 
19604
+
 
19605
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19606
+vminvq_f64 (float64x2_t __a)
 
19607
+{
 
19608
+  return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_nan_v2df (__a), 0);
 
19609
+}
 
19610
+
 
19611
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
 
19612
+vminvq_s8 (int8x16_t __a)
 
19613
+{
 
19614
+  return vgetq_lane_s8 (__builtin_aarch64_reduc_smin_v16qi (__a), 0);
 
19615
+}
 
19616
+
 
19617
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
 
19618
+vminvq_s16 (int16x8_t __a)
 
19619
+{
 
19620
+  return vgetq_lane_s16 (__builtin_aarch64_reduc_smin_v8hi (__a), 0);
 
19621
+}
 
19622
+
 
19623
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
 
19624
+vminvq_s32 (int32x4_t __a)
 
19625
+{
 
19626
+  return vgetq_lane_s32 (__builtin_aarch64_reduc_smin_v4si (__a), 0);
 
19627
+}
 
19628
+
 
19629
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
 
19630
+vminvq_u8 (uint8x16_t __a)
 
19631
+{
 
19632
+  return vgetq_lane_u8 ((uint8x16_t)
 
19633
+               __builtin_aarch64_reduc_umin_v16qi ((int8x16_t) __a), 0);
 
19634
+}
 
19635
+
 
19636
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
 
19637
+vminvq_u16 (uint16x8_t __a)
 
19638
+{
 
19639
+  return vgetq_lane_u16 ((uint16x8_t)
 
19640
+               __builtin_aarch64_reduc_umin_v8hi ((int16x8_t) __a), 0);
 
19641
+}
 
19642
+
 
19643
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
 
19644
+vminvq_u32 (uint32x4_t __a)
 
19645
+{
 
19646
+  return vgetq_lane_u32 ((uint32x4_t)
 
19647
+               __builtin_aarch64_reduc_umin_v4si ((int32x4_t) __a), 0);
 
19648
+}
 
19649
+
 
19650
+/* vminnmv  */
 
19651
+
 
19652
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19653
+vminnmv_f32 (float32x2_t __a)
 
19654
+{
 
19655
+  return vget_lane_f32 (__builtin_aarch64_reduc_smin_v2sf (__a), 0);
 
19656
+}
 
19657
+
 
19658
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19659
+vminnmvq_f32 (float32x4_t __a)
 
19660
+{
 
19661
+  return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_v4sf (__a), 0);
 
19662
+}
 
19663
+
 
19664
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19665
+vminnmvq_f64 (float64x2_t __a)
 
19666
+{
 
19667
+  return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_v2df (__a), 0);
 
19668
+}
 
19669
+
 
19670
 /* vmla */
 
19671
 
 
19672
 __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19673
@@ -21430,7 +21453,7 @@
 
19674
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19675
 vqdmlal_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d)
 
19676
 {
 
19677
-  int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (INT64_C (0)));
 
19678
+  int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0)));
 
19679
   return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __tmp, __d);
 
19680
 }
 
19681
 
 
19682
@@ -21481,7 +21504,7 @@
 
19683
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19684
 vqdmlal_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d)
 
19685
 {
 
19686
-  int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (INT64_C (0)));
 
19687
+  int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0)));
 
19688
   return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __tmp, __d);
 
19689
 }
 
19690
 
 
19691
@@ -21558,7 +21581,7 @@
 
19692
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19693
 vqdmlsl_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d)
 
19694
 {
 
19695
-  int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (INT64_C (0)));
 
19696
+  int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0)));
 
19697
   return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __tmp, __d);
 
19698
 }
 
19699
 
 
19700
@@ -21609,7 +21632,7 @@
 
19701
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19702
 vqdmlsl_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d)
 
19703
 {
 
19704
-  int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (INT64_C (0)));
 
19705
+  int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0)));
 
19706
   return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __tmp, __d);
 
19707
 }
 
19708
 
 
19709
@@ -21734,7 +21757,7 @@
 
19710
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
19711
 vqdmull_lane_s16 (int16x4_t __a, int16x4_t __b, int const __c)
 
19712
 {
 
19713
-  int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (INT64_C (0)));
 
19714
+  int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (__AARCH64_INT64_C (0)));
 
19715
   return __builtin_aarch64_sqdmull_lanev4hi (__a, __tmp, __c);
 
19716
 }
 
19717
 
 
19718
@@ -21783,7 +21806,7 @@
 
19719
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
19720
 vqdmull_lane_s32 (int32x2_t __a, int32x2_t __b, int const __c)
 
19721
 {
 
19722
-  int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (INT64_C (0)));
 
19723
+  int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (__AARCH64_INT64_C (0)));
 
19724
   return __builtin_aarch64_sqdmull_lanev2si (__a, __tmp, __c);
 
19725
 }
 
19726
 
 
19727
@@ -22795,6 +22818,223 @@
 
19728
   return (uint64x1_t) __builtin_aarch64_uqsubdi (__a, __b);
 
19729
 }
 
19730
 
 
19731
+/* vrecpe  */
 
19732
+
 
19733
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19734
+vrecpes_f32 (float32_t __a)
 
19735
+{
 
19736
+  return __builtin_aarch64_frecpesf (__a);
 
19737
+}
 
19738
+
 
19739
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19740
+vrecped_f64 (float64_t __a)
 
19741
+{
 
19742
+  return __builtin_aarch64_frecpedf (__a);
 
19743
+}
 
19744
+
 
19745
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19746
+vrecpe_f32 (float32x2_t __a)
 
19747
+{
 
19748
+  return __builtin_aarch64_frecpev2sf (__a);
 
19749
+}
 
19750
+
 
19751
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19752
+vrecpeq_f32 (float32x4_t __a)
 
19753
+{
 
19754
+  return __builtin_aarch64_frecpev4sf (__a);
 
19755
+}
 
19756
+
 
19757
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19758
+vrecpeq_f64 (float64x2_t __a)
 
19759
+{
 
19760
+  return __builtin_aarch64_frecpev2df (__a);
 
19761
+}
 
19762
+
 
19763
+/* vrecps  */
 
19764
+
 
19765
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19766
+vrecpss_f32 (float32_t __a, float32_t __b)
 
19767
+{
 
19768
+  return __builtin_aarch64_frecpssf (__a, __b);
 
19769
+}
 
19770
+
 
19771
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19772
+vrecpsd_f64 (float64_t __a, float64_t __b)
 
19773
+{
 
19774
+  return __builtin_aarch64_frecpsdf (__a, __b);
 
19775
+}
 
19776
+
 
19777
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19778
+vrecps_f32 (float32x2_t __a, float32x2_t __b)
 
19779
+{
 
19780
+  return __builtin_aarch64_frecpsv2sf (__a, __b);
 
19781
+}
 
19782
+
 
19783
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19784
+vrecpsq_f32 (float32x4_t __a, float32x4_t __b)
 
19785
+{
 
19786
+  return __builtin_aarch64_frecpsv4sf (__a, __b);
 
19787
+}
 
19788
+
 
19789
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19790
+vrecpsq_f64 (float64x2_t __a, float64x2_t __b)
 
19791
+{
 
19792
+  return __builtin_aarch64_frecpsv2df (__a, __b);
 
19793
+}
 
19794
+
 
19795
+/* vrecpx  */
 
19796
+
 
19797
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
 
19798
+vrecpxs_f32 (float32_t __a)
 
19799
+{
 
19800
+  return __builtin_aarch64_frecpxsf (__a);
 
19801
+}
 
19802
+
 
19803
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
 
19804
+vrecpxd_f64 (float64_t __a)
 
19805
+{
 
19806
+  return __builtin_aarch64_frecpxdf (__a);
 
19807
+}
 
19808
+
 
19809
+/* vrnd  */
 
19810
+
 
19811
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19812
+vrnd_f32 (float32x2_t __a)
 
19813
+{
 
19814
+  return __builtin_aarch64_btruncv2sf (__a);
 
19815
+}
 
19816
+
 
19817
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19818
+vrndq_f32 (float32x4_t __a)
 
19819
+{
 
19820
+  return __builtin_aarch64_btruncv4sf (__a);
 
19821
+}
 
19822
+
 
19823
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19824
+vrndq_f64 (float64x2_t __a)
 
19825
+{
 
19826
+  return __builtin_aarch64_btruncv2df (__a);
 
19827
+}
 
19828
+
 
19829
+/* vrnda  */
 
19830
+
 
19831
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19832
+vrnda_f32 (float32x2_t __a)
 
19833
+{
 
19834
+  return __builtin_aarch64_roundv2sf (__a);
 
19835
+}
 
19836
+
 
19837
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19838
+vrndaq_f32 (float32x4_t __a)
 
19839
+{
 
19840
+  return __builtin_aarch64_roundv4sf (__a);
 
19841
+}
 
19842
+
 
19843
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19844
+vrndaq_f64 (float64x2_t __a)
 
19845
+{
 
19846
+  return __builtin_aarch64_roundv2df (__a);
 
19847
+}
 
19848
+
 
19849
+/* vrndi  */
 
19850
+
 
19851
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19852
+vrndi_f32 (float32x2_t __a)
 
19853
+{
 
19854
+  return __builtin_aarch64_nearbyintv2sf (__a);
 
19855
+}
 
19856
+
 
19857
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19858
+vrndiq_f32 (float32x4_t __a)
 
19859
+{
 
19860
+  return __builtin_aarch64_nearbyintv4sf (__a);
 
19861
+}
 
19862
+
 
19863
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19864
+vrndiq_f64 (float64x2_t __a)
 
19865
+{
 
19866
+  return __builtin_aarch64_nearbyintv2df (__a);
 
19867
+}
 
19868
+
 
19869
+/* vrndm  */
 
19870
+
 
19871
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19872
+vrndm_f32 (float32x2_t __a)
 
19873
+{
 
19874
+  return __builtin_aarch64_floorv2sf (__a);
 
19875
+}
 
19876
+
 
19877
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19878
+vrndmq_f32 (float32x4_t __a)
 
19879
+{
 
19880
+  return __builtin_aarch64_floorv4sf (__a);
 
19881
+}
 
19882
+
 
19883
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19884
+vrndmq_f64 (float64x2_t __a)
 
19885
+{
 
19886
+  return __builtin_aarch64_floorv2df (__a);
 
19887
+}
 
19888
+
 
19889
+/* vrndn  */
 
19890
+
 
19891
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19892
+vrndn_f32 (float32x2_t __a)
 
19893
+{
 
19894
+  return __builtin_aarch64_frintnv2sf (__a);
 
19895
+}
 
19896
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19897
+vrndnq_f32 (float32x4_t __a)
 
19898
+{
 
19899
+  return __builtin_aarch64_frintnv4sf (__a);
 
19900
+}
 
19901
+
 
19902
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19903
+vrndnq_f64 (float64x2_t __a)
 
19904
+{
 
19905
+  return __builtin_aarch64_frintnv2df (__a);
 
19906
+}
 
19907
+
 
19908
+/* vrndp  */
 
19909
+
 
19910
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19911
+vrndp_f32 (float32x2_t __a)
 
19912
+{
 
19913
+  return __builtin_aarch64_ceilv2sf (__a);
 
19914
+}
 
19915
+
 
19916
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19917
+vrndpq_f32 (float32x4_t __a)
 
19918
+{
 
19919
+  return __builtin_aarch64_ceilv4sf (__a);
 
19920
+}
 
19921
+
 
19922
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19923
+vrndpq_f64 (float64x2_t __a)
 
19924
+{
 
19925
+  return __builtin_aarch64_ceilv2df (__a);
 
19926
+}
 
19927
+
 
19928
+/* vrndx  */
 
19929
+
 
19930
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
 
19931
+vrndx_f32 (float32x2_t __a)
 
19932
+{
 
19933
+  return __builtin_aarch64_rintv2sf (__a);
 
19934
+}
 
19935
+
 
19936
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
19937
+vrndxq_f32 (float32x4_t __a)
 
19938
+{
 
19939
+  return __builtin_aarch64_rintv4sf (__a);
 
19940
+}
 
19941
+
 
19942
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
 
19943
+vrndxq_f64 (float64x2_t __a)
 
19944
+{
 
19945
+  return __builtin_aarch64_rintv2df (__a);
 
19946
+}
 
19947
+
 
19948
 /* vrshl */
 
19949
 
 
19950
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
19951
@@ -23138,109 +23378,109 @@
 
19952
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
19953
 vshl_n_s8 (int8x8_t __a, const int __b)
 
19954
 {
 
19955
-  return (int8x8_t) __builtin_aarch64_sshl_nv8qi (__a, __b);
 
19956
+  return (int8x8_t) __builtin_aarch64_ashlv8qi (__a, __b);
 
19957
 }
 
19958
 
 
19959
 __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
19960
 vshl_n_s16 (int16x4_t __a, const int __b)
 
19961
 {
 
19962
-  return (int16x4_t) __builtin_aarch64_sshl_nv4hi (__a, __b);
 
19963
+  return (int16x4_t) __builtin_aarch64_ashlv4hi (__a, __b);
 
19964
 }
 
19965
 
 
19966
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
19967
 vshl_n_s32 (int32x2_t __a, const int __b)
 
19968
 {
 
19969
-  return (int32x2_t) __builtin_aarch64_sshl_nv2si (__a, __b);
 
19970
+  return (int32x2_t) __builtin_aarch64_ashlv2si (__a, __b);
 
19971
 }
 
19972
 
 
19973
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
19974
 vshl_n_s64 (int64x1_t __a, const int __b)
 
19975
 {
 
19976
-  return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b);
 
19977
+  return (int64x1_t) __builtin_aarch64_ashldi (__a, __b);
 
19978
 }
 
19979
 
 
19980
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
19981
 vshl_n_u8 (uint8x8_t __a, const int __b)
 
19982
 {
 
19983
-  return (uint8x8_t) __builtin_aarch64_ushl_nv8qi ((int8x8_t) __a, __b);
 
19984
+  return (uint8x8_t) __builtin_aarch64_ashlv8qi ((int8x8_t) __a, __b);
 
19985
 }
 
19986
 
 
19987
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
19988
 vshl_n_u16 (uint16x4_t __a, const int __b)
 
19989
 {
 
19990
-  return (uint16x4_t) __builtin_aarch64_ushl_nv4hi ((int16x4_t) __a, __b);
 
19991
+  return (uint16x4_t) __builtin_aarch64_ashlv4hi ((int16x4_t) __a, __b);
 
19992
 }
 
19993
 
 
19994
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
19995
 vshl_n_u32 (uint32x2_t __a, const int __b)
 
19996
 {
 
19997
-  return (uint32x2_t) __builtin_aarch64_ushl_nv2si ((int32x2_t) __a, __b);
 
19998
+  return (uint32x2_t) __builtin_aarch64_ashlv2si ((int32x2_t) __a, __b);
 
19999
 }
 
20000
 
 
20001
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20002
 vshl_n_u64 (uint64x1_t __a, const int __b)
 
20003
 {
 
20004
-  return (uint64x1_t) __builtin_aarch64_ushl_ndi ((int64x1_t) __a, __b);
 
20005
+  return (uint64x1_t) __builtin_aarch64_ashldi ((int64x1_t) __a, __b);
 
20006
 }
 
20007
 
 
20008
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
20009
 vshlq_n_s8 (int8x16_t __a, const int __b)
 
20010
 {
 
20011
-  return (int8x16_t) __builtin_aarch64_sshl_nv16qi (__a, __b);
 
20012
+  return (int8x16_t) __builtin_aarch64_ashlv16qi (__a, __b);
 
20013
 }
 
20014
 
 
20015
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
20016
 vshlq_n_s16 (int16x8_t __a, const int __b)
 
20017
 {
 
20018
-  return (int16x8_t) __builtin_aarch64_sshl_nv8hi (__a, __b);
 
20019
+  return (int16x8_t) __builtin_aarch64_ashlv8hi (__a, __b);
 
20020
 }
 
20021
 
 
20022
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
20023
 vshlq_n_s32 (int32x4_t __a, const int __b)
 
20024
 {
 
20025
-  return (int32x4_t) __builtin_aarch64_sshl_nv4si (__a, __b);
 
20026
+  return (int32x4_t) __builtin_aarch64_ashlv4si (__a, __b);
 
20027
 }
 
20028
 
 
20029
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
20030
 vshlq_n_s64 (int64x2_t __a, const int __b)
 
20031
 {
 
20032
-  return (int64x2_t) __builtin_aarch64_sshl_nv2di (__a, __b);
 
20033
+  return (int64x2_t) __builtin_aarch64_ashlv2di (__a, __b);
 
20034
 }
 
20035
 
 
20036
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
20037
 vshlq_n_u8 (uint8x16_t __a, const int __b)
 
20038
 {
 
20039
-  return (uint8x16_t) __builtin_aarch64_ushl_nv16qi ((int8x16_t) __a, __b);
 
20040
+  return (uint8x16_t) __builtin_aarch64_ashlv16qi ((int8x16_t) __a, __b);
 
20041
 }
 
20042
 
 
20043
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
20044
 vshlq_n_u16 (uint16x8_t __a, const int __b)
 
20045
 {
 
20046
-  return (uint16x8_t) __builtin_aarch64_ushl_nv8hi ((int16x8_t) __a, __b);
 
20047
+  return (uint16x8_t) __builtin_aarch64_ashlv8hi ((int16x8_t) __a, __b);
 
20048
 }
 
20049
 
 
20050
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
20051
 vshlq_n_u32 (uint32x4_t __a, const int __b)
 
20052
 {
 
20053
-  return (uint32x4_t) __builtin_aarch64_ushl_nv4si ((int32x4_t) __a, __b);
 
20054
+  return (uint32x4_t) __builtin_aarch64_ashlv4si ((int32x4_t) __a, __b);
 
20055
 }
 
20056
 
 
20057
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
20058
 vshlq_n_u64 (uint64x2_t __a, const int __b)
 
20059
 {
 
20060
-  return (uint64x2_t) __builtin_aarch64_ushl_nv2di ((int64x2_t) __a, __b);
 
20061
+  return (uint64x2_t) __builtin_aarch64_ashlv2di ((int64x2_t) __a, __b);
 
20062
 }
 
20063
 
 
20064
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
20065
 vshld_n_s64 (int64x1_t __a, const int __b)
 
20066
 {
 
20067
-  return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b);
 
20068
+  return (int64x1_t) __builtin_aarch64_ashldi (__a, __b);
 
20069
 }
 
20070
 
 
20071
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20072
 vshld_n_u64 (uint64x1_t __a, const int __b)
 
20073
 {
 
20074
-  return (uint64x1_t) __builtin_aarch64_ushl_ndi (__a, __b);
 
20075
+  return (uint64x1_t) __builtin_aarch64_ashldi (__a, __b);
 
20076
 }
 
20077
 
 
20078
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
20079
@@ -23428,109 +23668,109 @@
 
20080
 __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
 
20081
 vshr_n_s8 (int8x8_t __a, const int __b)
 
20082
 {
 
20083
-  return (int8x8_t) __builtin_aarch64_sshr_nv8qi (__a, __b);
 
20084
+  return (int8x8_t) __builtin_aarch64_ashrv8qi (__a, __b);
 
20085
 }
 
20086
 
 
20087
 __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
 
20088
 vshr_n_s16 (int16x4_t __a, const int __b)
 
20089
 {
 
20090
-  return (int16x4_t) __builtin_aarch64_sshr_nv4hi (__a, __b);
 
20091
+  return (int16x4_t) __builtin_aarch64_ashrv4hi (__a, __b);
 
20092
 }
 
20093
 
 
20094
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
20095
 vshr_n_s32 (int32x2_t __a, const int __b)
 
20096
 {
 
20097
-  return (int32x2_t) __builtin_aarch64_sshr_nv2si (__a, __b);
 
20098
+  return (int32x2_t) __builtin_aarch64_ashrv2si (__a, __b);
 
20099
 }
 
20100
 
 
20101
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
20102
 vshr_n_s64 (int64x1_t __a, const int __b)
 
20103
 {
 
20104
-  return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b);
 
20105
+  return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b);
 
20106
 }
 
20107
 
 
20108
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
20109
 vshr_n_u8 (uint8x8_t __a, const int __b)
 
20110
 {
 
20111
-  return (uint8x8_t) __builtin_aarch64_ushr_nv8qi ((int8x8_t) __a, __b);
 
20112
+  return (uint8x8_t) __builtin_aarch64_lshrv8qi ((int8x8_t) __a, __b);
 
20113
 }
 
20114
 
 
20115
 __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
 
20116
 vshr_n_u16 (uint16x4_t __a, const int __b)
 
20117
 {
 
20118
-  return (uint16x4_t) __builtin_aarch64_ushr_nv4hi ((int16x4_t) __a, __b);
 
20119
+  return (uint16x4_t) __builtin_aarch64_lshrv4hi ((int16x4_t) __a, __b);
 
20120
 }
 
20121
 
 
20122
 __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
 
20123
 vshr_n_u32 (uint32x2_t __a, const int __b)
 
20124
 {
 
20125
-  return (uint32x2_t) __builtin_aarch64_ushr_nv2si ((int32x2_t) __a, __b);
 
20126
+  return (uint32x2_t) __builtin_aarch64_lshrv2si ((int32x2_t) __a, __b);
 
20127
 }
 
20128
 
 
20129
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20130
 vshr_n_u64 (uint64x1_t __a, const int __b)
 
20131
 {
 
20132
-  return (uint64x1_t) __builtin_aarch64_ushr_ndi ((int64x1_t) __a, __b);
 
20133
+  return (uint64x1_t) __builtin_aarch64_lshrdi ((int64x1_t) __a, __b);
 
20134
 }
 
20135
 
 
20136
 __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
 
20137
 vshrq_n_s8 (int8x16_t __a, const int __b)
 
20138
 {
 
20139
-  return (int8x16_t) __builtin_aarch64_sshr_nv16qi (__a, __b);
 
20140
+  return (int8x16_t) __builtin_aarch64_ashrv16qi (__a, __b);
 
20141
 }
 
20142
 
 
20143
 __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
 
20144
 vshrq_n_s16 (int16x8_t __a, const int __b)
 
20145
 {
 
20146
-  return (int16x8_t) __builtin_aarch64_sshr_nv8hi (__a, __b);
 
20147
+  return (int16x8_t) __builtin_aarch64_ashrv8hi (__a, __b);
 
20148
 }
 
20149
 
 
20150
 __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
 
20151
 vshrq_n_s32 (int32x4_t __a, const int __b)
 
20152
 {
 
20153
-  return (int32x4_t) __builtin_aarch64_sshr_nv4si (__a, __b);
 
20154
+  return (int32x4_t) __builtin_aarch64_ashrv4si (__a, __b);
 
20155
 }
 
20156
 
 
20157
 __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
 
20158
 vshrq_n_s64 (int64x2_t __a, const int __b)
 
20159
 {
 
20160
-  return (int64x2_t) __builtin_aarch64_sshr_nv2di (__a, __b);
 
20161
+  return (int64x2_t) __builtin_aarch64_ashrv2di (__a, __b);
 
20162
 }
 
20163
 
 
20164
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
20165
 vshrq_n_u8 (uint8x16_t __a, const int __b)
 
20166
 {
 
20167
-  return (uint8x16_t) __builtin_aarch64_ushr_nv16qi ((int8x16_t) __a, __b);
 
20168
+  return (uint8x16_t) __builtin_aarch64_lshrv16qi ((int8x16_t) __a, __b);
 
20169
 }
 
20170
 
 
20171
 __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
 
20172
 vshrq_n_u16 (uint16x8_t __a, const int __b)
 
20173
 {
 
20174
-  return (uint16x8_t) __builtin_aarch64_ushr_nv8hi ((int16x8_t) __a, __b);
 
20175
+  return (uint16x8_t) __builtin_aarch64_lshrv8hi ((int16x8_t) __a, __b);
 
20176
 }
 
20177
 
 
20178
 __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
 
20179
 vshrq_n_u32 (uint32x4_t __a, const int __b)
 
20180
 {
 
20181
-  return (uint32x4_t) __builtin_aarch64_ushr_nv4si ((int32x4_t) __a, __b);
 
20182
+  return (uint32x4_t) __builtin_aarch64_lshrv4si ((int32x4_t) __a, __b);
 
20183
 }
 
20184
 
 
20185
 __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
 
20186
 vshrq_n_u64 (uint64x2_t __a, const int __b)
 
20187
 {
 
20188
-  return (uint64x2_t) __builtin_aarch64_ushr_nv2di ((int64x2_t) __a, __b);
 
20189
+  return (uint64x2_t) __builtin_aarch64_lshrv2di ((int64x2_t) __a, __b);
 
20190
 }
 
20191
 
 
20192
 __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
 
20193
 vshrd_n_s64 (int64x1_t __a, const int __b)
 
20194
 {
 
20195
-  return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b);
 
20196
+  return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b);
 
20197
 }
 
20198
 
 
20199
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20200
 vshrd_n_u64 (uint64x1_t __a, const int __b)
 
20201
 {
 
20202
-  return (uint64x1_t) __builtin_aarch64_ushr_ndi (__a, __b);
 
20203
+  return (uint64x1_t) __builtin_aarch64_lshrdi (__a, __b);
 
20204
 }
 
20205
 
 
20206
 /* vsli */
 
20207
@@ -24153,8 +24393,8 @@
 
20208
 {
 
20209
   __builtin_aarch64_simd_oi __o;
 
20210
   int64x2x2_t temp;
 
20211
-  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0)));
 
20212
-  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0)));
 
20213
+  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20214
+  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20215
   __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[0], 0);
 
20216
   __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[1], 1);
 
20217
   __builtin_aarch64_st2di ((__builtin_aarch64_simd_di *) __a, __o);
 
20218
@@ -24165,8 +24405,8 @@
 
20219
 {
 
20220
   __builtin_aarch64_simd_oi __o;
 
20221
   uint64x2x2_t temp;
 
20222
-  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0)));
 
20223
-  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0)));
 
20224
+  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20225
+  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20226
   __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[0], 0);
 
20227
   __o = __builtin_aarch64_set_qregoiv2di (__o, (int64x2_t) temp.val[1], 1);
 
20228
   __builtin_aarch64_st2di ((__builtin_aarch64_simd_di *) __a, __o);
 
20229
@@ -24177,8 +24417,8 @@
 
20230
 {
 
20231
   __builtin_aarch64_simd_oi __o;
 
20232
   float64x2x2_t temp;
 
20233
-  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0)));
 
20234
-  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0)));
 
20235
+  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20236
+  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20237
   __o = __builtin_aarch64_set_qregoiv2df (__o, (float64x2_t) temp.val[0], 0);
 
20238
   __o = __builtin_aarch64_set_qregoiv2df (__o, (float64x2_t) temp.val[1], 1);
 
20239
   __builtin_aarch64_st2df ((__builtin_aarch64_simd_df *) __a, __o);
 
20240
@@ -24189,8 +24429,8 @@
 
20241
 {
 
20242
   __builtin_aarch64_simd_oi __o;
 
20243
   int8x16x2_t temp;
 
20244
-  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0)));
 
20245
-  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0)));
 
20246
+  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20247
+  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20248
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20249
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20250
   __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o);
 
20251
@@ -24201,8 +24441,8 @@
 
20252
 {
 
20253
   __builtin_aarch64_simd_oi __o;
 
20254
   poly8x16x2_t temp;
 
20255
-  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0)));
 
20256
-  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0)));
 
20257
+  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20258
+  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20259
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20260
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20261
   __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o);
 
20262
@@ -24213,8 +24453,8 @@
 
20263
 {
 
20264
   __builtin_aarch64_simd_oi __o;
 
20265
   int16x8x2_t temp;
 
20266
-  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0)));
 
20267
-  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0)));
 
20268
+  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20269
+  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20270
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20271
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20272
   __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o);
 
20273
@@ -24225,8 +24465,8 @@
 
20274
 {
 
20275
   __builtin_aarch64_simd_oi __o;
 
20276
   poly16x8x2_t temp;
 
20277
-  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0)));
 
20278
-  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0)));
 
20279
+  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20280
+  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20281
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20282
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20283
   __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o);
 
20284
@@ -24237,8 +24477,8 @@
 
20285
 {
 
20286
   __builtin_aarch64_simd_oi __o;
 
20287
   int32x4x2_t temp;
 
20288
-  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0)));
 
20289
-  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0)));
 
20290
+  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20291
+  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20292
   __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[0], 0);
 
20293
   __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[1], 1);
 
20294
   __builtin_aarch64_st2v2si ((__builtin_aarch64_simd_si *) __a, __o);
 
20295
@@ -24249,8 +24489,8 @@
 
20296
 {
 
20297
   __builtin_aarch64_simd_oi __o;
 
20298
   uint8x16x2_t temp;
 
20299
-  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0)));
 
20300
-  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0)));
 
20301
+  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20302
+  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20303
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20304
   __o = __builtin_aarch64_set_qregoiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20305
   __builtin_aarch64_st2v8qi ((__builtin_aarch64_simd_qi *) __a, __o);
 
20306
@@ -24261,8 +24501,8 @@
 
20307
 {
 
20308
   __builtin_aarch64_simd_oi __o;
 
20309
   uint16x8x2_t temp;
 
20310
-  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0)));
 
20311
-  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0)));
 
20312
+  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20313
+  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20314
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20315
   __o = __builtin_aarch64_set_qregoiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20316
   __builtin_aarch64_st2v4hi ((__builtin_aarch64_simd_hi *) __a, __o);
 
20317
@@ -24273,8 +24513,8 @@
 
20318
 {
 
20319
   __builtin_aarch64_simd_oi __o;
 
20320
   uint32x4x2_t temp;
 
20321
-  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0)));
 
20322
-  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0)));
 
20323
+  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20324
+  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20325
   __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[0], 0);
 
20326
   __o = __builtin_aarch64_set_qregoiv4si (__o, (int32x4_t) temp.val[1], 1);
 
20327
   __builtin_aarch64_st2v2si ((__builtin_aarch64_simd_si *) __a, __o);
 
20328
@@ -24285,8 +24525,8 @@
 
20329
 {
 
20330
   __builtin_aarch64_simd_oi __o;
 
20331
   float32x4x2_t temp;
 
20332
-  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0)));
 
20333
-  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0)));
 
20334
+  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20335
+  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20336
   __o = __builtin_aarch64_set_qregoiv4sf (__o, (float32x4_t) temp.val[0], 0);
 
20337
   __o = __builtin_aarch64_set_qregoiv4sf (__o, (float32x4_t) temp.val[1], 1);
 
20338
   __builtin_aarch64_st2v2sf ((__builtin_aarch64_simd_sf *) __a, __o);
 
20339
@@ -24405,9 +24645,9 @@
 
20340
 {
 
20341
   __builtin_aarch64_simd_ci __o;
 
20342
   int64x2x3_t temp;
 
20343
-  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0)));
 
20344
-  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0)));
 
20345
-  temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (INT64_C (0)));
 
20346
+  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20347
+  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20348
+  temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20349
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[0], 0);
 
20350
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[1], 1);
 
20351
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[2], 2);
 
20352
@@ -24419,9 +24659,9 @@
 
20353
 {
 
20354
   __builtin_aarch64_simd_ci __o;
 
20355
   uint64x2x3_t temp;
 
20356
-  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0)));
 
20357
-  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0)));
 
20358
-  temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (UINT64_C (0)));
 
20359
+  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20360
+  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20361
+  temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20362
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[0], 0);
 
20363
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[1], 1);
 
20364
   __o = __builtin_aarch64_set_qregciv2di (__o, (int64x2_t) temp.val[2], 2);
 
20365
@@ -24433,9 +24673,9 @@
 
20366
 {
 
20367
   __builtin_aarch64_simd_ci __o;
 
20368
   float64x2x3_t temp;
 
20369
-  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0)));
 
20370
-  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0)));
 
20371
-  temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (UINT64_C (0)));
 
20372
+  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20373
+  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20374
+  temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20375
   __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[0], 0);
 
20376
   __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[1], 1);
 
20377
   __o = __builtin_aarch64_set_qregciv2df (__o, (float64x2_t) temp.val[2], 2);
 
20378
@@ -24447,9 +24687,9 @@
 
20379
 {
 
20380
   __builtin_aarch64_simd_ci __o;
 
20381
   int8x16x3_t temp;
 
20382
-  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0)));
 
20383
-  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0)));
 
20384
-  temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (INT64_C (0)));
 
20385
+  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20386
+  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20387
+  temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20388
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20389
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20390
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20391
@@ -24461,9 +24701,9 @@
 
20392
 {
 
20393
   __builtin_aarch64_simd_ci __o;
 
20394
   poly8x16x3_t temp;
 
20395
-  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0)));
 
20396
-  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0)));
 
20397
-  temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (UINT64_C (0)));
 
20398
+  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20399
+  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20400
+  temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20401
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20402
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20403
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20404
@@ -24475,9 +24715,9 @@
 
20405
 {
 
20406
   __builtin_aarch64_simd_ci __o;
 
20407
   int16x8x3_t temp;
 
20408
-  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0)));
 
20409
-  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0)));
 
20410
-  temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (INT64_C (0)));
 
20411
+  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20412
+  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20413
+  temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20414
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20415
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20416
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20417
@@ -24489,9 +24729,9 @@
 
20418
 {
 
20419
   __builtin_aarch64_simd_ci __o;
 
20420
   poly16x8x3_t temp;
 
20421
-  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0)));
 
20422
-  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0)));
 
20423
-  temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (UINT64_C (0)));
 
20424
+  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20425
+  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20426
+  temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20427
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20428
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20429
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20430
@@ -24503,9 +24743,9 @@
 
20431
 {
 
20432
   __builtin_aarch64_simd_ci __o;
 
20433
   int32x4x3_t temp;
 
20434
-  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0)));
 
20435
-  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0)));
 
20436
-  temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (INT64_C (0)));
 
20437
+  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20438
+  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20439
+  temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20440
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[0], 0);
 
20441
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[1], 1);
 
20442
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[2], 2);
 
20443
@@ -24517,9 +24757,9 @@
 
20444
 {
 
20445
   __builtin_aarch64_simd_ci __o;
 
20446
   uint8x16x3_t temp;
 
20447
-  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0)));
 
20448
-  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0)));
 
20449
-  temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (UINT64_C (0)));
 
20450
+  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20451
+  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20452
+  temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20453
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20454
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20455
   __o = __builtin_aarch64_set_qregciv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20456
@@ -24531,9 +24771,9 @@
 
20457
 {
 
20458
   __builtin_aarch64_simd_ci __o;
 
20459
   uint16x8x3_t temp;
 
20460
-  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0)));
 
20461
-  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0)));
 
20462
-  temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (UINT64_C (0)));
 
20463
+  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20464
+  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20465
+  temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20466
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20467
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20468
   __o = __builtin_aarch64_set_qregciv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20469
@@ -24545,9 +24785,9 @@
 
20470
 {
 
20471
   __builtin_aarch64_simd_ci __o;
 
20472
   uint32x4x3_t temp;
 
20473
-  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0)));
 
20474
-  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0)));
 
20475
-  temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (UINT64_C (0)));
 
20476
+  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20477
+  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20478
+  temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20479
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[0], 0);
 
20480
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[1], 1);
 
20481
   __o = __builtin_aarch64_set_qregciv4si (__o, (int32x4_t) temp.val[2], 2);
 
20482
@@ -24559,9 +24799,9 @@
 
20483
 {
 
20484
   __builtin_aarch64_simd_ci __o;
 
20485
   float32x4x3_t temp;
 
20486
-  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0)));
 
20487
-  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0)));
 
20488
-  temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (UINT64_C (0)));
 
20489
+  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20490
+  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20491
+  temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20492
   __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[0], 0);
 
20493
   __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[1], 1);
 
20494
   __o = __builtin_aarch64_set_qregciv4sf (__o, (float32x4_t) temp.val[2], 2);
 
20495
@@ -24693,10 +24933,10 @@
 
20496
 {
 
20497
   __builtin_aarch64_simd_xi __o;
 
20498
   int64x2x4_t temp;
 
20499
-  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (INT64_C (0)));
 
20500
-  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (INT64_C (0)));
 
20501
-  temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (INT64_C (0)));
 
20502
-  temp.val[3] = vcombine_s64 (val.val[3], vcreate_s64 (INT64_C (0)));
 
20503
+  temp.val[0] = vcombine_s64 (val.val[0], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20504
+  temp.val[1] = vcombine_s64 (val.val[1], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20505
+  temp.val[2] = vcombine_s64 (val.val[2], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20506
+  temp.val[3] = vcombine_s64 (val.val[3], vcreate_s64 (__AARCH64_INT64_C (0)));
 
20507
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[0], 0);
 
20508
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[1], 1);
 
20509
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[2], 2);
 
20510
@@ -24709,10 +24949,10 @@
 
20511
 {
 
20512
   __builtin_aarch64_simd_xi __o;
 
20513
   uint64x2x4_t temp;
 
20514
-  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (UINT64_C (0)));
 
20515
-  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (UINT64_C (0)));
 
20516
-  temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (UINT64_C (0)));
 
20517
-  temp.val[3] = vcombine_u64 (val.val[3], vcreate_u64 (UINT64_C (0)));
 
20518
+  temp.val[0] = vcombine_u64 (val.val[0], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20519
+  temp.val[1] = vcombine_u64 (val.val[1], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20520
+  temp.val[2] = vcombine_u64 (val.val[2], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20521
+  temp.val[3] = vcombine_u64 (val.val[3], vcreate_u64 (__AARCH64_UINT64_C (0)));
 
20522
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[0], 0);
 
20523
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[1], 1);
 
20524
   __o = __builtin_aarch64_set_qregxiv2di (__o, (int64x2_t) temp.val[2], 2);
 
20525
@@ -24725,10 +24965,10 @@
 
20526
 {
 
20527
   __builtin_aarch64_simd_xi __o;
 
20528
   float64x2x4_t temp;
 
20529
-  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (UINT64_C (0)));
 
20530
-  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (UINT64_C (0)));
 
20531
-  temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (UINT64_C (0)));
 
20532
-  temp.val[3] = vcombine_f64 (val.val[3], vcreate_f64 (UINT64_C (0)));
 
20533
+  temp.val[0] = vcombine_f64 (val.val[0], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20534
+  temp.val[1] = vcombine_f64 (val.val[1], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20535
+  temp.val[2] = vcombine_f64 (val.val[2], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20536
+  temp.val[3] = vcombine_f64 (val.val[3], vcreate_f64 (__AARCH64_UINT64_C (0)));
 
20537
   __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[0], 0);
 
20538
   __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[1], 1);
 
20539
   __o = __builtin_aarch64_set_qregxiv2df (__o, (float64x2_t) temp.val[2], 2);
 
20540
@@ -24741,10 +24981,10 @@
 
20541
 {
 
20542
   __builtin_aarch64_simd_xi __o;
 
20543
   int8x16x4_t temp;
 
20544
-  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (INT64_C (0)));
 
20545
-  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (INT64_C (0)));
 
20546
-  temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (INT64_C (0)));
 
20547
-  temp.val[3] = vcombine_s8 (val.val[3], vcreate_s8 (INT64_C (0)));
 
20548
+  temp.val[0] = vcombine_s8 (val.val[0], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20549
+  temp.val[1] = vcombine_s8 (val.val[1], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20550
+  temp.val[2] = vcombine_s8 (val.val[2], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20551
+  temp.val[3] = vcombine_s8 (val.val[3], vcreate_s8 (__AARCH64_INT64_C (0)));
 
20552
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20553
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20554
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20555
@@ -24757,10 +24997,10 @@
 
20556
 {
 
20557
   __builtin_aarch64_simd_xi __o;
 
20558
   poly8x16x4_t temp;
 
20559
-  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (UINT64_C (0)));
 
20560
-  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (UINT64_C (0)));
 
20561
-  temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (UINT64_C (0)));
 
20562
-  temp.val[3] = vcombine_p8 (val.val[3], vcreate_p8 (UINT64_C (0)));
 
20563
+  temp.val[0] = vcombine_p8 (val.val[0], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20564
+  temp.val[1] = vcombine_p8 (val.val[1], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20565
+  temp.val[2] = vcombine_p8 (val.val[2], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20566
+  temp.val[3] = vcombine_p8 (val.val[3], vcreate_p8 (__AARCH64_UINT64_C (0)));
 
20567
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20568
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20569
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20570
@@ -24773,10 +25013,10 @@
 
20571
 {
 
20572
   __builtin_aarch64_simd_xi __o;
 
20573
   int16x8x4_t temp;
 
20574
-  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (INT64_C (0)));
 
20575
-  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (INT64_C (0)));
 
20576
-  temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (INT64_C (0)));
 
20577
-  temp.val[3] = vcombine_s16 (val.val[3], vcreate_s16 (INT64_C (0)));
 
20578
+  temp.val[0] = vcombine_s16 (val.val[0], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20579
+  temp.val[1] = vcombine_s16 (val.val[1], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20580
+  temp.val[2] = vcombine_s16 (val.val[2], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20581
+  temp.val[3] = vcombine_s16 (val.val[3], vcreate_s16 (__AARCH64_INT64_C (0)));
 
20582
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20583
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20584
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20585
@@ -24789,10 +25029,10 @@
 
20586
 {
 
20587
   __builtin_aarch64_simd_xi __o;
 
20588
   poly16x8x4_t temp;
 
20589
-  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (UINT64_C (0)));
 
20590
-  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (UINT64_C (0)));
 
20591
-  temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (UINT64_C (0)));
 
20592
-  temp.val[3] = vcombine_p16 (val.val[3], vcreate_p16 (UINT64_C (0)));
 
20593
+  temp.val[0] = vcombine_p16 (val.val[0], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20594
+  temp.val[1] = vcombine_p16 (val.val[1], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20595
+  temp.val[2] = vcombine_p16 (val.val[2], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20596
+  temp.val[3] = vcombine_p16 (val.val[3], vcreate_p16 (__AARCH64_UINT64_C (0)));
 
20597
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20598
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20599
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20600
@@ -24805,10 +25045,10 @@
 
20601
 {
 
20602
   __builtin_aarch64_simd_xi __o;
 
20603
   int32x4x4_t temp;
 
20604
-  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (INT64_C (0)));
 
20605
-  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (INT64_C (0)));
 
20606
-  temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (INT64_C (0)));
 
20607
-  temp.val[3] = vcombine_s32 (val.val[3], vcreate_s32 (INT64_C (0)));
 
20608
+  temp.val[0] = vcombine_s32 (val.val[0], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20609
+  temp.val[1] = vcombine_s32 (val.val[1], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20610
+  temp.val[2] = vcombine_s32 (val.val[2], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20611
+  temp.val[3] = vcombine_s32 (val.val[3], vcreate_s32 (__AARCH64_INT64_C (0)));
 
20612
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[0], 0);
 
20613
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[1], 1);
 
20614
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[2], 2);
 
20615
@@ -24821,10 +25061,10 @@
 
20616
 {
 
20617
   __builtin_aarch64_simd_xi __o;
 
20618
   uint8x16x4_t temp;
 
20619
-  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (UINT64_C (0)));
 
20620
-  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (UINT64_C (0)));
 
20621
-  temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (UINT64_C (0)));
 
20622
-  temp.val[3] = vcombine_u8 (val.val[3], vcreate_u8 (UINT64_C (0)));
 
20623
+  temp.val[0] = vcombine_u8 (val.val[0], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20624
+  temp.val[1] = vcombine_u8 (val.val[1], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20625
+  temp.val[2] = vcombine_u8 (val.val[2], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20626
+  temp.val[3] = vcombine_u8 (val.val[3], vcreate_u8 (__AARCH64_UINT64_C (0)));
 
20627
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[0], 0);
 
20628
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[1], 1);
 
20629
   __o = __builtin_aarch64_set_qregxiv16qi (__o, (int8x16_t) temp.val[2], 2);
 
20630
@@ -24837,10 +25077,10 @@
 
20631
 {
 
20632
   __builtin_aarch64_simd_xi __o;
 
20633
   uint16x8x4_t temp;
 
20634
-  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (UINT64_C (0)));
 
20635
-  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (UINT64_C (0)));
 
20636
-  temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (UINT64_C (0)));
 
20637
-  temp.val[3] = vcombine_u16 (val.val[3], vcreate_u16 (UINT64_C (0)));
 
20638
+  temp.val[0] = vcombine_u16 (val.val[0], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20639
+  temp.val[1] = vcombine_u16 (val.val[1], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20640
+  temp.val[2] = vcombine_u16 (val.val[2], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20641
+  temp.val[3] = vcombine_u16 (val.val[3], vcreate_u16 (__AARCH64_UINT64_C (0)));
 
20642
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[0], 0);
 
20643
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[1], 1);
 
20644
   __o = __builtin_aarch64_set_qregxiv8hi (__o, (int16x8_t) temp.val[2], 2);
 
20645
@@ -24853,10 +25093,10 @@
 
20646
 {
 
20647
   __builtin_aarch64_simd_xi __o;
 
20648
   uint32x4x4_t temp;
 
20649
-  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (UINT64_C (0)));
 
20650
-  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (UINT64_C (0)));
 
20651
-  temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (UINT64_C (0)));
 
20652
-  temp.val[3] = vcombine_u32 (val.val[3], vcreate_u32 (UINT64_C (0)));
 
20653
+  temp.val[0] = vcombine_u32 (val.val[0], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20654
+  temp.val[1] = vcombine_u32 (val.val[1], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20655
+  temp.val[2] = vcombine_u32 (val.val[2], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20656
+  temp.val[3] = vcombine_u32 (val.val[3], vcreate_u32 (__AARCH64_UINT64_C (0)));
 
20657
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[0], 0);
 
20658
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[1], 1);
 
20659
   __o = __builtin_aarch64_set_qregxiv4si (__o, (int32x4_t) temp.val[2], 2);
 
20660
@@ -24869,10 +25109,10 @@
 
20661
 {
 
20662
   __builtin_aarch64_simd_xi __o;
 
20663
   float32x4x4_t temp;
 
20664
-  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (UINT64_C (0)));
 
20665
-  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (UINT64_C (0)));
 
20666
-  temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (UINT64_C (0)));
 
20667
-  temp.val[3] = vcombine_f32 (val.val[3], vcreate_f32 (UINT64_C (0)));
 
20668
+  temp.val[0] = vcombine_f32 (val.val[0], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20669
+  temp.val[1] = vcombine_f32 (val.val[1], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20670
+  temp.val[2] = vcombine_f32 (val.val[2], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20671
+  temp.val[3] = vcombine_f32 (val.val[3], vcreate_f32 (__AARCH64_UINT64_C (0)));
 
20672
   __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[0], 0);
 
20673
   __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[1], 1);
 
20674
   __o = __builtin_aarch64_set_qregxiv4sf (__o, (float32x4_t) temp.val[2], 2);
 
20675
@@ -25159,7 +25399,7 @@
 
20676
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20677
 vtst_s64 (int64x1_t __a, int64x1_t __b)
 
20678
 {
 
20679
-  return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b);
 
20680
+  return (__a & __b) ? -1ll : 0ll;
 
20681
 }
 
20682
 
 
20683
 __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
 
20684
@@ -25186,8 +25426,7 @@
 
20685
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20686
 vtst_u64 (uint64x1_t __a, uint64x1_t __b)
 
20687
 {
 
20688
-  return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a,
 
20689
-                                               (int64x1_t) __b);
 
20690
+  return (__a & __b) ? -1ll : 0ll;
 
20691
 }
 
20692
 
 
20693
 __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
 
20694
@@ -25245,14 +25484,13 @@
 
20695
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20696
 vtstd_s64 (int64x1_t __a, int64x1_t __b)
 
20697
 {
 
20698
-  return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b);
 
20699
+  return (__a & __b) ? -1ll : 0ll;
 
20700
 }
 
20701
 
 
20702
 __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
 
20703
 vtstd_u64 (uint64x1_t __a, uint64x1_t __b)
 
20704
 {
 
20705
-  return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a,
 
20706
-                                               (int64x1_t) __b);
 
20707
+  return (__a & __b) ? -1ll : 0ll;
 
20708
 }
 
20709
 
 
20710
 /* vuqadd */
 
20711
@@ -25371,4 +25609,31 @@
 
20712
 
 
20713
 /* End of optimal implementations in approved order.  */
 
20714
 
 
20715
+#undef __aarch64_vget_lane_any
 
20716
+#undef __aarch64_vget_lane_f32
 
20717
+#undef __aarch64_vget_lane_f64
 
20718
+#undef __aarch64_vget_lane_p8
 
20719
+#undef __aarch64_vget_lane_p16
 
20720
+#undef __aarch64_vget_lane_s8
 
20721
+#undef __aarch64_vget_lane_s16
 
20722
+#undef __aarch64_vget_lane_s32
 
20723
+#undef __aarch64_vget_lane_s64
 
20724
+#undef __aarch64_vget_lane_u8
 
20725
+#undef __aarch64_vget_lane_u16
 
20726
+#undef __aarch64_vget_lane_u32
 
20727
+#undef __aarch64_vget_lane_u64
 
20728
+
 
20729
+#undef __aarch64_vgetq_lane_f32
 
20730
+#undef __aarch64_vgetq_lane_f64
 
20731
+#undef __aarch64_vgetq_lane_p8
 
20732
+#undef __aarch64_vgetq_lane_p16
 
20733
+#undef __aarch64_vgetq_lane_s8
 
20734
+#undef __aarch64_vgetq_lane_s16
 
20735
+#undef __aarch64_vgetq_lane_s32
 
20736
+#undef __aarch64_vgetq_lane_s64
 
20737
+#undef __aarch64_vgetq_lane_u8
 
20738
+#undef __aarch64_vgetq_lane_u16
 
20739
+#undef __aarch64_vgetq_lane_u32
 
20740
+#undef __aarch64_vgetq_lane_u64
 
20741
+
 
20742
 #endif
 
20743
--- a/src/gcc/config/aarch64/aarch64.md
 
20744
+++ b/src/gcc/config/aarch64/aarch64.md
 
20745
@@ -68,9 +68,13 @@
 
20746
 (define_c_enum "unspec" [
 
20747
     UNSPEC_CASESI
 
20748
     UNSPEC_CLS
 
20749
+    UNSPEC_FRECPE
 
20750
+    UNSPEC_FRECPS
 
20751
+    UNSPEC_FRECPX
 
20752
     UNSPEC_FRINTA
 
20753
     UNSPEC_FRINTI
 
20754
     UNSPEC_FRINTM
 
20755
+    UNSPEC_FRINTN
 
20756
     UNSPEC_FRINTP
 
20757
     UNSPEC_FRINTX
 
20758
     UNSPEC_FRINTZ
 
20759
@@ -230,6 +234,9 @@
 
20760
    fmovf2i,\
 
20761
    fmovi2f,\
 
20762
    fmul,\
 
20763
+   frecpe,\
 
20764
+   frecps,\
 
20765
+   frecpx,\
 
20766
    frint,\
 
20767
    fsqrt,\
 
20768
    load_acq,\
 
20769
@@ -763,19 +770,41 @@
 
20770
 )
 
20771
 
 
20772
 (define_insn "*mov<mode>_aarch64"
 
20773
-  [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r,r,m,  r,*w")
 
20774
-        (match_operand:SHORT 1 "general_operand"      " r,M,m,rZ,*w,r"))]
 
20775
+  [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r,   *w,r,*w, m, m, r,*w,*w")
 
20776
+        (match_operand:SHORT 1 "general_operand"      " r,M,D<hq>,m, m,rZ,*w,*w, r,*w"))]
 
20777
   "(register_operand (operands[0], <MODE>mode)
 
20778
     || aarch64_reg_or_zero (operands[1], <MODE>mode))"
 
20779
-  "@
 
20780
-   mov\\t%w0, %w1
 
20781
-   mov\\t%w0, %1
 
20782
-   ldr<size>\\t%w0, %1
 
20783
-   str<size>\\t%w1, %0
 
20784
-   umov\\t%w0, %1.<v>[0]
 
20785
-   dup\\t%0.<Vallxd>, %w1"
 
20786
-  [(set_attr "v8type" "move,alu,load1,store1,*,*")
 
20787
-   (set_attr "simd_type" "*,*,*,*,simd_movgp,simd_dupgp")
 
20788
+{
 
20789
+   switch (which_alternative)
 
20790
+     {
 
20791
+     case 0:
 
20792
+       return "mov\t%w0, %w1";
 
20793
+     case 1:
 
20794
+       return "mov\t%w0, %1";
 
20795
+     case 2:
 
20796
+       return aarch64_output_scalar_simd_mov_immediate (operands[1],
 
20797
+                                                       <MODE>mode);
 
20798
+     case 3:
 
20799
+       return "ldr<size>\t%w0, %1";
 
20800
+     case 4:
 
20801
+       return "ldr\t%<size>0, %1";
 
20802
+     case 5:
 
20803
+       return "str<size>\t%w1, %0";
 
20804
+     case 6:
 
20805
+       return "str\t%<size>1, %0";
 
20806
+     case 7:
 
20807
+       return "umov\t%w0, %1.<v>[0]";
 
20808
+     case 8:
 
20809
+       return "dup\t%0.<Vallxd>, %w1";
 
20810
+     case 9:
 
20811
+       return "dup\t%0, %1.<v>[0]";
 
20812
+     default:
 
20813
+       gcc_unreachable ();
 
20814
+     }
 
20815
+}
 
20816
+  [(set_attr "v8type" "move,alu,alu,load1,load1,store1,store1,*,*,*")
 
20817
+   (set_attr "simd_type" "*,*,simd_move_imm,*,*,*,*,simd_movgp,simd_dupgp,simd_dup")
 
20818
+   (set_attr "simd" "*,*,yes,*,*,*,*,yes,yes,yes")
 
20819
    (set_attr "mode" "<MODE>")
 
20820
    (set_attr "simd_mode" "<MODE>")]
 
20821
 )
 
20822
@@ -797,26 +826,28 @@
 
20823
 )
 
20824
 
 
20825
 (define_insn "*movsi_aarch64"
 
20826
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,m, *w, r,*w")
 
20827
-       (match_operand:SI 1 "aarch64_mov_operand"     " r,M,m,rZ,rZ,*w,*w"))]
 
20828
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,r,*w,m,  m,*w, r,*w")
 
20829
+       (match_operand:SI 1 "aarch64_mov_operand"  " r,M,m, m,rZ,*w,rZ,*w,*w"))]
 
20830
   "(register_operand (operands[0], SImode)
 
20831
     || aarch64_reg_or_zero (operands[1], SImode))"
 
20832
   "@
 
20833
    mov\\t%w0, %w1
 
20834
    mov\\t%w0, %1
 
20835
    ldr\\t%w0, %1
 
20836
+   ldr\\t%s0, %1
 
20837
    str\\t%w1, %0
 
20838
+   str\\t%s1, %0
 
20839
    fmov\\t%s0, %w1
 
20840
    fmov\\t%w0, %s1
 
20841
    fmov\\t%s0, %s1"
 
20842
-  [(set_attr "v8type" "move,alu,load1,store1,fmov,fmov,fmov")
 
20843
+  [(set_attr "v8type" "move,alu,load1,load1,store1,store1,fmov,fmov,fmov")
 
20844
    (set_attr "mode" "SI")
 
20845
-   (set_attr "fp" "*,*,*,*,yes,yes,yes")]
 
20846
+   (set_attr "fp" "*,*,*,yes,*,yes,yes,yes,yes")]
 
20847
 )
 
20848
 
 
20849
 (define_insn "*movdi_aarch64"
 
20850
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,m, r,  r,  *w, r,*w,w")
 
20851
-       (match_operand:DI 1 "aarch64_mov_operand"  " r,r,k,N,m,rZ,Usa,Ush,rZ,*w,*w,Dd"))]
 
20852
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,*w,m,  m,r,r,  *w, r,*w,w")
 
20853
+       (match_operand:DI 1 "aarch64_mov_operand"  " r,r,k,N,m, m,rZ,*w,S,Ush,rZ,*w,*w,Dd"))]
 
20854
   "(register_operand (operands[0], DImode)
 
20855
     || aarch64_reg_or_zero (operands[1], DImode))"
 
20856
   "@
 
20857
@@ -825,17 +856,19 @@
 
20858
    mov\\t%x0, %1
 
20859
    mov\\t%x0, %1
 
20860
    ldr\\t%x0, %1
 
20861
+   ldr\\t%d0, %1
 
20862
    str\\t%x1, %0
 
20863
+   str\\t%d1, %0
 
20864
    adr\\t%x0, %a1
 
20865
    adrp\\t%x0, %A1
 
20866
    fmov\\t%d0, %x1
 
20867
    fmov\\t%x0, %d1
 
20868
    fmov\\t%d0, %d1
 
20869
    movi\\t%d0, %1"
 
20870
-  [(set_attr "v8type" "move,move,move,alu,load1,store1,adr,adr,fmov,fmov,fmov,fmov")
 
20871
+  [(set_attr "v8type" "move,move,move,alu,load1,load1,store1,store1,adr,adr,fmov,fmov,fmov,fmov")
 
20872
    (set_attr "mode" "DI")
 
20873
-   (set_attr "fp" "*,*,*,*,*,*,*,*,yes,yes,yes,*")
 
20874
-   (set_attr "simd" "*,*,*,*,*,*,*,*,*,*,*,yes")]
 
20875
+   (set_attr "fp" "*,*,*,*,*,yes,*,yes,*,*,yes,yes,yes,*")
 
20876
+   (set_attr "simd" "*,*,*,*,*,*,*,*,*,*,*,*,*,yes")]
 
20877
 )
 
20878
 
 
20879
 (define_insn "insv_imm<mode>"
 
20880
@@ -843,9 +876,8 @@
 
20881
                          (const_int 16)
 
20882
                          (match_operand:GPI 1 "const_int_operand" "n"))
 
20883
        (match_operand:GPI 2 "const_int_operand" "n"))]
 
20884
-  "INTVAL (operands[1]) < GET_MODE_BITSIZE (<MODE>mode)
 
20885
-   && INTVAL (operands[1]) % 16 == 0
 
20886
-   && UINTVAL (operands[2]) <= 0xffff"
 
20887
+  "UINTVAL (operands[1]) < GET_MODE_BITSIZE (<MODE>mode)
 
20888
+   && UINTVAL (operands[1]) % 16 == 0"
 
20889
   "movk\\t%<w>0, %X2, lsl %1"
 
20890
   [(set_attr "v8type" "movk")
 
20891
    (set_attr "mode" "<MODE>")]
 
20892
@@ -982,9 +1014,9 @@
 
20893
     || register_operand (operands[1], TFmode))"
 
20894
   "@
 
20895
    orr\\t%0.16b, %1.16b, %1.16b
 
20896
-   mov\\t%0, %1\;mov\\t%H0, %H1
 
20897
-   fmov\\t%d0, %Q1\;fmov\\t%0.d[1], %R1
 
20898
-   fmov\\t%Q0, %d1\;fmov\\t%R0, %1.d[1]
 
20899
+   #
 
20900
+   #
 
20901
+   #
 
20902
    movi\\t%0.2d, #0
 
20903
    fmov\\t%s0, wzr
 
20904
    ldr\\t%q0, %1
 
20905
@@ -998,6 +1030,17 @@
 
20906
    (set_attr "simd" "yes,*,*,*,yes,*,*,*,*,*")]
 
20907
 )
 
20908
 
 
20909
+(define_split
 
20910
+   [(set (match_operand:TF 0 "register_operand" "")
 
20911
+        (match_operand:TF 1 "aarch64_reg_or_imm" ""))]
 
20912
+  "reload_completed && aarch64_split_128bit_move_p (operands[0], operands[1])"
 
20913
+  [(const_int 0)]
 
20914
+  {
 
20915
+    aarch64_split_128bit_move (operands[0], operands[1]);
 
20916
+    DONE;
 
20917
+  }
 
20918
+)
 
20919
+
 
20920
 ;; Operands 1 and 3 are tied together by the final condition; so we allow
 
20921
 ;; fairly lax checking on the second memory operation.
 
20922
 (define_insn "load_pair<mode>"
 
20923
@@ -1150,13 +1193,14 @@
 
20924
 )
 
20925
 
 
20926
 (define_insn "*zero_extend<SHORT:mode><GPI:mode>2_aarch64"
 
20927
-  [(set (match_operand:GPI 0 "register_operand" "=r,r")
 
20928
-        (zero_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m")))]
 
20929
+  [(set (match_operand:GPI 0 "register_operand" "=r,r,*w")
 
20930
+        (zero_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m,m")))]
 
20931
   ""
 
20932
   "@
 
20933
    uxt<SHORT:size>\t%<GPI:w>0, %w1
 
20934
-   ldr<SHORT:size>\t%w0, %1"
 
20935
-  [(set_attr "v8type" "extend,load1")
 
20936
+   ldr<SHORT:size>\t%w0, %1
 
20937
+   ldr\t%<SHORT:size>0, %1"
 
20938
+  [(set_attr "v8type" "extend,load1,load1")
 
20939
    (set_attr "mode" "<GPI:MODE>")]
 
20940
 )
 
20941
 
 
20942
@@ -1287,6 +1331,112 @@
 
20943
    (set_attr "mode" "SI")]
 
20944
 )
 
20945
 
 
20946
+(define_insn "*adds_mul_imm_<mode>"
 
20947
+  [(set (reg:CC_NZ CC_REGNUM)
 
20948
+       (compare:CC_NZ
 
20949
+        (plus:GPI (mult:GPI
 
20950
+                   (match_operand:GPI 1 "register_operand" "r")
 
20951
+                   (match_operand:QI 2 "aarch64_pwr_2_<mode>" "n"))
 
20952
+                  (match_operand:GPI 3 "register_operand" "rk"))
 
20953
+        (const_int 0)))
 
20954
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
20955
+       (plus:GPI (mult:GPI (match_dup 1) (match_dup 2))
 
20956
+                 (match_dup 3)))]
 
20957
+  ""
 
20958
+  "adds\\t%<w>0, %<w>3, %<w>1, lsl %p2"
 
20959
+  [(set_attr "v8type" "alus_shift")
 
20960
+   (set_attr "mode" "<MODE>")]
 
20961
+)
 
20962
+
 
20963
+(define_insn "*subs_mul_imm_<mode>"
 
20964
+  [(set (reg:CC_NZ CC_REGNUM)
 
20965
+       (compare:CC_NZ
 
20966
+        (minus:GPI (match_operand:GPI 1 "register_operand" "rk")
 
20967
+                   (mult:GPI
 
20968
+                    (match_operand:GPI 2 "register_operand" "r")
 
20969
+                    (match_operand:QI 3 "aarch64_pwr_2_<mode>" "n")))
 
20970
+        (const_int 0)))
 
20971
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
20972
+       (minus:GPI (match_dup 1)
 
20973
+                  (mult:GPI (match_dup 2) (match_dup 3))))]
 
20974
+  ""
 
20975
+  "subs\\t%<w>0, %<w>1, %<w>2, lsl %p3"
 
20976
+  [(set_attr "v8type" "alus_shift")
 
20977
+   (set_attr "mode" "<MODE>")]
 
20978
+)
 
20979
+
 
20980
+(define_insn "*adds_<optab><ALLX:mode>_<GPI:mode>"
 
20981
+  [(set (reg:CC_NZ CC_REGNUM)
 
20982
+       (compare:CC_NZ
 
20983
+        (plus:GPI
 
20984
+         (ANY_EXTEND:GPI (match_operand:ALLX 1 "register_operand" "r"))
 
20985
+         (match_operand:GPI 2 "register_operand" "r"))
 
20986
+       (const_int 0)))
 
20987
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
20988
+       (plus:GPI (ANY_EXTEND:GPI (match_dup 1)) (match_dup 2)))]
 
20989
+  ""
 
20990
+  "adds\\t%<GPI:w>0, %<GPI:w>2, %<GPI:w>1, <su>xt<ALLX:size>"
 
20991
+  [(set_attr "v8type" "alus_ext")
 
20992
+   (set_attr "mode" "<GPI:MODE>")]
 
20993
+)
 
20994
+
 
20995
+(define_insn "*subs_<optab><ALLX:mode>_<GPI:mode>"
 
20996
+  [(set (reg:CC_NZ CC_REGNUM)
 
20997
+       (compare:CC_NZ
 
20998
+        (minus:GPI (match_operand:GPI 1 "register_operand" "r")
 
20999
+                   (ANY_EXTEND:GPI
 
21000
+                    (match_operand:ALLX 2 "register_operand" "r")))
 
21001
+       (const_int 0)))
 
21002
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21003
+       (minus:GPI (match_dup 1) (ANY_EXTEND:GPI (match_dup 2))))]
 
21004
+  ""
 
21005
+  "subs\\t%<GPI:w>0, %<GPI:w>1, %<GPI:w>2, <su>xt<ALLX:size>"
 
21006
+  [(set_attr "v8type" "alus_ext")
 
21007
+   (set_attr "mode" "<GPI:MODE>")]
 
21008
+)
 
21009
+
 
21010
+(define_insn "*adds_<optab><mode>_multp2"
 
21011
+  [(set (reg:CC_NZ CC_REGNUM)
 
21012
+       (compare:CC_NZ
 
21013
+        (plus:GPI (ANY_EXTRACT:GPI
 
21014
+                   (mult:GPI (match_operand:GPI 1 "register_operand" "r")
 
21015
+                             (match_operand 2 "aarch64_pwr_imm3" "Up3"))
 
21016
+                   (match_operand 3 "const_int_operand" "n")
 
21017
+                   (const_int 0))
 
21018
+                  (match_operand:GPI 4 "register_operand" "r"))
 
21019
+       (const_int 0)))
 
21020
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21021
+       (plus:GPI (ANY_EXTRACT:GPI (mult:GPI (match_dup 1) (match_dup 2))
 
21022
+                                  (match_dup 3)
 
21023
+                                  (const_int 0))
 
21024
+                 (match_dup 4)))]
 
21025
+  "aarch64_is_extend_from_extract (<MODE>mode, operands[2], operands[3])"
 
21026
+  "adds\\t%<w>0, %<w>4, %<w>1, <su>xt%e3 %p2"
 
21027
+  [(set_attr "v8type" "alus_ext")
 
21028
+   (set_attr "mode" "<MODE>")]
 
21029
+)
 
21030
+
 
21031
+(define_insn "*subs_<optab><mode>_multp2"
 
21032
+  [(set (reg:CC_NZ CC_REGNUM)
 
21033
+       (compare:CC_NZ
 
21034
+        (minus:GPI (match_operand:GPI 4 "register_operand" "r")
 
21035
+                   (ANY_EXTRACT:GPI
 
21036
+                    (mult:GPI (match_operand:GPI 1 "register_operand" "r")
 
21037
+                              (match_operand 2 "aarch64_pwr_imm3" "Up3"))
 
21038
+                    (match_operand 3 "const_int_operand" "n")
 
21039
+                    (const_int 0)))
 
21040
+       (const_int 0)))
 
21041
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21042
+       (minus:GPI (match_dup 4) (ANY_EXTRACT:GPI
 
21043
+                                 (mult:GPI (match_dup 1) (match_dup 2))
 
21044
+                                 (match_dup 3)
 
21045
+                                 (const_int 0))))]
 
21046
+  "aarch64_is_extend_from_extract (<MODE>mode, operands[2], operands[3])"
 
21047
+  "subs\\t%<w>0, %<w>4, %<w>1, <su>xt%e3 %p2"
 
21048
+  [(set_attr "v8type" "alus_ext")
 
21049
+   (set_attr "mode" "<MODE>")]
 
21050
+)
 
21051
+
 
21052
 (define_insn "*add<mode>3nr_compare0"
 
21053
   [(set (reg:CC_NZ CC_REGNUM)
 
21054
        (compare:CC_NZ
 
21055
@@ -1302,12 +1452,12 @@
 
21056
 )
 
21057
 
 
21058
 (define_insn "*compare_neg<mode>"
 
21059
-  [(set (reg:CC CC_REGNUM)
 
21060
-       (compare:CC
 
21061
-        (match_operand:GPI 0 "register_operand" "r")
 
21062
-        (neg:GPI (match_operand:GPI 1 "register_operand" "r"))))]
 
21063
+  [(set (reg:CC_SWP CC_REGNUM)
 
21064
+       (compare:CC_SWP
 
21065
+        (neg:GPI (match_operand:GPI 0 "register_operand" "r"))
 
21066
+        (match_operand:GPI 1 "register_operand" "r")))]
 
21067
   ""
 
21068
-  "cmn\\t%<w>0, %<w>1"
 
21069
+  "cmn\\t%<w>1, %<w>0"
 
21070
   [(set_attr "v8type" "alus")
 
21071
    (set_attr "mode" "<MODE>")]
 
21072
 )
 
21073
@@ -1791,6 +1941,34 @@
 
21074
    (set_attr "mode" "SI")]
 
21075
 )
 
21076
 
 
21077
+(define_insn "*sub<mode>3_carryin"
 
21078
+  [(set
 
21079
+    (match_operand:GPI 0 "register_operand" "=r")
 
21080
+    (minus:GPI (minus:GPI
 
21081
+               (match_operand:GPI 1 "register_operand" "r")
 
21082
+               (ltu:GPI (reg:CC CC_REGNUM) (const_int 0)))
 
21083
+              (match_operand:GPI 2 "register_operand" "r")))]
 
21084
+   ""
 
21085
+   "sbc\\t%<w>0, %<w>1, %<w>2"
 
21086
+  [(set_attr "v8type" "adc")
 
21087
+   (set_attr "mode" "<MODE>")]
 
21088
+)
 
21089
+
 
21090
+;; zero_extend version of the above
 
21091
+(define_insn "*subsi3_carryin_uxtw"
 
21092
+  [(set
 
21093
+    (match_operand:DI 0 "register_operand" "=r")
 
21094
+    (zero_extend:DI
 
21095
+     (minus:SI (minus:SI
 
21096
+               (match_operand:SI 1 "register_operand" "r")
 
21097
+               (ltu:SI (reg:CC CC_REGNUM) (const_int 0)))
 
21098
+              (match_operand:SI 2 "register_operand" "r"))))]
 
21099
+   ""
 
21100
+   "sbc\\t%w0, %w1, %w2"
 
21101
+  [(set_attr "v8type" "adc")
 
21102
+   (set_attr "mode" "SI")]
 
21103
+)
 
21104
+
 
21105
 (define_insn "*sub_uxt<mode>_multp2"
 
21106
   [(set (match_operand:GPI 0 "register_operand" "=rk")
 
21107
        (minus:GPI (match_operand:GPI 4 "register_operand" "r")
 
21108
@@ -1825,6 +2003,38 @@
 
21109
    (set_attr "mode" "SI")]
 
21110
 )
 
21111
 
 
21112
+(define_insn_and_split "absdi2"
 
21113
+  [(set (match_operand:DI 0 "register_operand" "=r,w")
 
21114
+       (abs:DI (match_operand:DI 1 "register_operand" "r,w")))
 
21115
+   (clobber (match_scratch:DI 2 "=&r,X"))]
 
21116
+  ""
 
21117
+  "@
 
21118
+   #
 
21119
+   abs\\t%d0, %d1"
 
21120
+  "reload_completed
 
21121
+   && GP_REGNUM_P (REGNO (operands[0]))
 
21122
+   && GP_REGNUM_P (REGNO (operands[1]))"
 
21123
+  [(const_int 0)]
 
21124
+  {
 
21125
+    emit_insn (gen_rtx_SET (VOIDmode, operands[2],
 
21126
+                           gen_rtx_XOR (DImode,
 
21127
+                                        gen_rtx_ASHIFTRT (DImode,
 
21128
+                                                          operands[1],
 
21129
+                                                          GEN_INT (63)),
 
21130
+                                        operands[1])));
 
21131
+    emit_insn (gen_rtx_SET (VOIDmode,
 
21132
+                           operands[0],
 
21133
+                           gen_rtx_MINUS (DImode,
 
21134
+                                          operands[2],
 
21135
+                                          gen_rtx_ASHIFTRT (DImode,
 
21136
+                                                            operands[1],
 
21137
+                                                            GEN_INT (63)))));
 
21138
+    DONE;
 
21139
+  }
 
21140
+  [(set_attr "v8type" "alu")
 
21141
+   (set_attr "mode" "DI")]
 
21142
+)
 
21143
+
 
21144
 (define_insn "neg<mode>2"
 
21145
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21146
        (neg:GPI (match_operand:GPI 1 "register_operand" "r")))]
 
21147
@@ -1844,6 +2054,27 @@
 
21148
    (set_attr "mode" "SI")]
 
21149
 )
 
21150
 
 
21151
+(define_insn "*ngc<mode>"
 
21152
+  [(set (match_operand:GPI 0 "register_operand" "=r")
 
21153
+       (minus:GPI (neg:GPI (ltu:GPI (reg:CC CC_REGNUM) (const_int 0)))
 
21154
+                  (match_operand:GPI 1 "register_operand" "r")))]
 
21155
+  ""
 
21156
+  "ngc\\t%<w>0, %<w>1"
 
21157
+  [(set_attr "v8type" "adc")
 
21158
+   (set_attr "mode" "<MODE>")]
 
21159
+)
 
21160
+
 
21161
+(define_insn "*ngcsi_uxtw"
 
21162
+  [(set (match_operand:DI 0 "register_operand" "=r")
 
21163
+       (zero_extend:DI
 
21164
+        (minus:SI (neg:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0)))
 
21165
+                  (match_operand:SI 1 "register_operand" "r"))))]
 
21166
+  ""
 
21167
+  "ngc\\t%w0, %w1"
 
21168
+  [(set_attr "v8type" "adc")
 
21169
+   (set_attr "mode" "SI")]
 
21170
+)
 
21171
+
 
21172
 (define_insn "*neg<mode>2_compare0"
 
21173
   [(set (reg:CC_NZ CC_REGNUM)
 
21174
        (compare:CC_NZ (neg:GPI (match_operand:GPI 1 "register_operand" "r"))
 
21175
@@ -1869,6 +2100,21 @@
 
21176
    (set_attr "mode" "SI")]
 
21177
 )
 
21178
 
 
21179
+(define_insn "*neg_<shift><mode>3_compare0"
 
21180
+  [(set (reg:CC_NZ CC_REGNUM)
 
21181
+       (compare:CC_NZ
 
21182
+        (neg:GPI (ASHIFT:GPI
 
21183
+                  (match_operand:GPI 1 "register_operand" "r")
 
21184
+                  (match_operand:QI 2 "aarch64_shift_imm_<mode>" "n")))
 
21185
+        (const_int 0)))
 
21186
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21187
+       (neg:GPI (ASHIFT:GPI (match_dup 1) (match_dup 2))))]
 
21188
+  ""
 
21189
+  "negs\\t%<w>0, %<w>1, <shift> %2"
 
21190
+  [(set_attr "v8type" "alus_shift")
 
21191
+   (set_attr "mode" "<MODE>")]
 
21192
+)
 
21193
+
 
21194
 (define_insn "*neg_<shift>_<mode>2"
 
21195
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21196
        (neg:GPI (ASHIFT:GPI
 
21197
@@ -2158,6 +2404,18 @@
 
21198
    (set_attr "mode" "<GPI:MODE>")]
 
21199
 )
 
21200
 
 
21201
+(define_insn "*cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>"
 
21202
+  [(set (reg:CC_SWP CC_REGNUM)
 
21203
+       (compare:CC_SWP (ashift:GPI
 
21204
+                        (ANY_EXTEND:GPI
 
21205
+                         (match_operand:ALLX 0 "register_operand" "r"))
 
21206
+                        (match_operand 1 "aarch64_imm3" "Ui3"))
 
21207
+       (match_operand:GPI 2 "register_operand" "r")))]
 
21208
+  ""
 
21209
+  "cmp\\t%<GPI:w>2, %<GPI:w>0, <su>xt<ALLX:size> %1"
 
21210
+  [(set_attr "v8type" "alus_ext")
 
21211
+   (set_attr "mode" "<GPI:MODE>")]
 
21212
+)
 
21213
 
 
21214
 ;; -------------------------------------------------------------------
 
21215
 ;; Store-flag and conditional select insns
 
21216
@@ -2211,7 +2469,7 @@
 
21217
    (set_attr "mode" "SI")]
 
21218
 )
 
21219
 
 
21220
-(define_insn "*cstore<mode>_neg"
 
21221
+(define_insn "cstore<mode>_neg"
 
21222
   [(set (match_operand:ALLI 0 "register_operand" "=r")
 
21223
        (neg:ALLI (match_operator:ALLI 1 "aarch64_comparison_operator"
 
21224
                  [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
21225
@@ -2434,6 +2692,69 @@
 
21226
   [(set_attr "v8type" "logic,logic_imm")
 
21227
    (set_attr "mode" "SI")])
 
21228
 
 
21229
+(define_insn "*and<mode>3_compare0"
 
21230
+  [(set (reg:CC_NZ CC_REGNUM)
 
21231
+       (compare:CC_NZ
 
21232
+        (and:GPI (match_operand:GPI 1 "register_operand" "%r,r")
 
21233
+                 (match_operand:GPI 2 "aarch64_logical_operand" "r,<lconst>"))
 
21234
+        (const_int 0)))
 
21235
+   (set (match_operand:GPI 0 "register_operand" "=r,r")
 
21236
+       (and:GPI (match_dup 1) (match_dup 2)))]
 
21237
+  ""
 
21238
+  "ands\\t%<w>0, %<w>1, %<w>2"
 
21239
+  [(set_attr "v8type" "logics,logics_imm")
 
21240
+   (set_attr "mode" "<MODE>")]
 
21241
+)
 
21242
+
 
21243
+;; zero_extend version of above
 
21244
+(define_insn "*andsi3_compare0_uxtw"
 
21245
+  [(set (reg:CC_NZ CC_REGNUM)
 
21246
+       (compare:CC_NZ
 
21247
+        (and:SI (match_operand:SI 1 "register_operand" "%r,r")
 
21248
+                (match_operand:SI 2 "aarch64_logical_operand" "r,K"))
 
21249
+        (const_int 0)))
 
21250
+   (set (match_operand:DI 0 "register_operand" "=r,r")
 
21251
+       (zero_extend:DI (and:SI (match_dup 1) (match_dup 2))))]
 
21252
+  ""
 
21253
+  "ands\\t%w0, %w1, %w2"
 
21254
+  [(set_attr "v8type" "logics,logics_imm")
 
21255
+   (set_attr "mode" "SI")]
 
21256
+)
 
21257
+
 
21258
+(define_insn "*and_<SHIFT:optab><mode>3_compare0"
 
21259
+  [(set (reg:CC_NZ CC_REGNUM)
 
21260
+       (compare:CC_NZ
 
21261
+        (and:GPI (SHIFT:GPI
 
21262
+                  (match_operand:GPI 1 "register_operand" "r")
 
21263
+                  (match_operand:QI 2 "aarch64_shift_imm_<mode>" "n"))
 
21264
+                 (match_operand:GPI 3 "register_operand" "r"))
 
21265
+        (const_int 0)))
 
21266
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21267
+       (and:GPI (SHIFT:GPI (match_dup 1) (match_dup 2)) (match_dup 3)))]
 
21268
+  ""
 
21269
+  "ands\\t%<w>0, %<w>3, %<w>1, <SHIFT:shift> %2"
 
21270
+  [(set_attr "v8type" "logics_shift")
 
21271
+   (set_attr "mode" "<MODE>")]
 
21272
+)
 
21273
+
 
21274
+;; zero_extend version of above
 
21275
+(define_insn "*and_<SHIFT:optab>si3_compare0_uxtw"
 
21276
+  [(set (reg:CC_NZ CC_REGNUM)
 
21277
+       (compare:CC_NZ
 
21278
+        (and:SI (SHIFT:SI
 
21279
+                 (match_operand:SI 1 "register_operand" "r")
 
21280
+                 (match_operand:QI 2 "aarch64_shift_imm_si" "n"))
 
21281
+                (match_operand:SI 3 "register_operand" "r"))
 
21282
+        (const_int 0)))
 
21283
+   (set (match_operand:DI 0 "register_operand" "=r")
 
21284
+       (zero_extend:DI (and:SI (SHIFT:SI (match_dup 1) (match_dup 2))
 
21285
+                               (match_dup 3))))]
 
21286
+  ""
 
21287
+  "ands\\t%w0, %w3, %w1, <SHIFT:shift> %2"
 
21288
+  [(set_attr "v8type" "logics_shift")
 
21289
+   (set_attr "mode" "SI")]
 
21290
+)
 
21291
+
 
21292
 (define_insn "*<LOGICAL:optab>_<SHIFT:optab><mode>3"
 
21293
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21294
        (LOGICAL:GPI (SHIFT:GPI
 
21295
@@ -2485,6 +2806,35 @@
 
21296
   [(set_attr "v8type" "logic")
 
21297
    (set_attr "mode" "<MODE>")])
 
21298
 
 
21299
+(define_insn "*and_one_cmpl<mode>3_compare0"
 
21300
+  [(set (reg:CC_NZ CC_REGNUM)
 
21301
+       (compare:CC_NZ
 
21302
+        (and:GPI (not:GPI
 
21303
+                  (match_operand:GPI 1 "register_operand" "r"))
 
21304
+                 (match_operand:GPI 2 "register_operand" "r"))
 
21305
+        (const_int 0)))
 
21306
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21307
+       (and:GPI (not:GPI (match_dup 1)) (match_dup 2)))]
 
21308
+  ""
 
21309
+  "bics\\t%<w>0, %<w>2, %<w>1"
 
21310
+  [(set_attr "v8type" "logics")
 
21311
+   (set_attr "mode" "<MODE>")])
 
21312
+
 
21313
+;; zero_extend version of above
 
21314
+(define_insn "*and_one_cmplsi3_compare0_uxtw"
 
21315
+  [(set (reg:CC_NZ CC_REGNUM)
 
21316
+       (compare:CC_NZ
 
21317
+        (and:SI (not:SI
 
21318
+                 (match_operand:SI 1 "register_operand" "r"))
 
21319
+                (match_operand:SI 2 "register_operand" "r"))
 
21320
+        (const_int 0)))
 
21321
+   (set (match_operand:DI 0 "register_operand" "=r")
 
21322
+       (zero_extend:DI (and:SI (not:SI (match_dup 1)) (match_dup 2))))]
 
21323
+  ""
 
21324
+  "bics\\t%w0, %w2, %w1"
 
21325
+  [(set_attr "v8type" "logics")
 
21326
+   (set_attr "mode" "SI")])
 
21327
+
 
21328
 (define_insn "*<LOGICAL:optab>_one_cmpl_<SHIFT:optab><mode>3"
 
21329
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21330
        (LOGICAL:GPI (not:GPI
 
21331
@@ -2497,6 +2847,43 @@
 
21332
   [(set_attr "v8type" "logic_shift")
 
21333
    (set_attr "mode" "<MODE>")])
 
21334
 
 
21335
+(define_insn "*and_one_cmpl_<SHIFT:optab><mode>3_compare0"
 
21336
+  [(set (reg:CC_NZ CC_REGNUM)
 
21337
+       (compare:CC_NZ
 
21338
+        (and:GPI (not:GPI
 
21339
+                  (SHIFT:GPI
 
21340
+                   (match_operand:GPI 1 "register_operand" "r")
 
21341
+                   (match_operand:QI 2 "aarch64_shift_imm_<mode>" "n")))
 
21342
+                 (match_operand:GPI 3 "register_operand" "r"))
 
21343
+        (const_int 0)))
 
21344
+   (set (match_operand:GPI 0 "register_operand" "=r")
 
21345
+       (and:GPI (not:GPI
 
21346
+                 (SHIFT:GPI
 
21347
+                  (match_dup 1) (match_dup 2))) (match_dup 3)))]
 
21348
+  ""
 
21349
+  "bics\\t%<w>0, %<w>3, %<w>1, <SHIFT:shift> %2"
 
21350
+  [(set_attr "v8type" "logics_shift")
 
21351
+   (set_attr "mode" "<MODE>")])
 
21352
+
 
21353
+;; zero_extend version of above
 
21354
+(define_insn "*and_one_cmpl_<SHIFT:optab>si3_compare0_uxtw"
 
21355
+  [(set (reg:CC_NZ CC_REGNUM)
 
21356
+       (compare:CC_NZ
 
21357
+        (and:SI (not:SI
 
21358
+                 (SHIFT:SI
 
21359
+                  (match_operand:SI 1 "register_operand" "r")
 
21360
+                  (match_operand:QI 2 "aarch64_shift_imm_si" "n")))
 
21361
+                (match_operand:SI 3 "register_operand" "r"))
 
21362
+        (const_int 0)))
 
21363
+   (set (match_operand:DI 0 "register_operand" "=r")
 
21364
+       (zero_extend:DI (and:SI
 
21365
+                        (not:SI
 
21366
+                         (SHIFT:SI (match_dup 1) (match_dup 2))) (match_dup 3))))]
 
21367
+  ""
 
21368
+  "bics\\t%w0, %w3, %w1, <SHIFT:shift> %2"
 
21369
+  [(set_attr "v8type" "logics_shift")
 
21370
+   (set_attr "mode" "SI")])
 
21371
+
 
21372
 (define_insn "clz<mode>2"
 
21373
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21374
        (clz:GPI (match_operand:GPI 1 "register_operand" "r")))]
 
21375
@@ -2704,6 +3091,62 @@
 
21376
    (set_attr "mode" "<MODE>")]
 
21377
 )
 
21378
 
 
21379
+(define_insn "*extr<mode>5_insn"
 
21380
+  [(set (match_operand:GPI 0 "register_operand" "=r")
 
21381
+       (ior:GPI (ashift:GPI (match_operand:GPI 1 "register_operand" "r")
 
21382
+                            (match_operand 3 "const_int_operand" "n"))
 
21383
+                (lshiftrt:GPI (match_operand:GPI 2 "register_operand" "r")
 
21384
+                              (match_operand 4 "const_int_operand" "n"))))]
 
21385
+  "UINTVAL (operands[3]) < GET_MODE_BITSIZE (<MODE>mode) &&
 
21386
+   (UINTVAL (operands[3]) + UINTVAL (operands[4]) == GET_MODE_BITSIZE (<MODE>mode))"
 
21387
+  "extr\\t%<w>0, %<w>1, %<w>2, %4"
 
21388
+  [(set_attr "v8type" "shift")
 
21389
+   (set_attr "mode" "<MODE>")]
 
21390
+)
 
21391
+
 
21392
+;; zero_extend version of the above
 
21393
+(define_insn "*extrsi5_insn_uxtw"
 
21394
+  [(set (match_operand:DI 0 "register_operand" "=r")
 
21395
+       (zero_extend:DI
 
21396
+        (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
 
21397
+                           (match_operand 3 "const_int_operand" "n"))
 
21398
+                (lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
 
21399
+                             (match_operand 4 "const_int_operand" "n")))))]
 
21400
+  "UINTVAL (operands[3]) < 32 &&
 
21401
+   (UINTVAL (operands[3]) + UINTVAL (operands[4]) == 32)"
 
21402
+  "extr\\t%w0, %w1, %w2, %4"
 
21403
+  [(set_attr "v8type" "shift")
 
21404
+   (set_attr "mode" "SI")]
 
21405
+)
 
21406
+
 
21407
+(define_insn "*ror<mode>3_insn"
 
21408
+  [(set (match_operand:GPI 0 "register_operand" "=r")
 
21409
+       (rotate:GPI (match_operand:GPI 1 "register_operand" "r")
 
21410
+                   (match_operand 2 "const_int_operand" "n")))]
 
21411
+  "UINTVAL (operands[2]) < GET_MODE_BITSIZE (<MODE>mode)"
 
21412
+{
 
21413
+  operands[3] = GEN_INT (<sizen> - UINTVAL (operands[2]));
 
21414
+  return "ror\\t%<w>0, %<w>1, %3";
 
21415
+}
 
21416
+  [(set_attr "v8type" "shift")
 
21417
+   (set_attr "mode" "<MODE>")]
 
21418
+)
 
21419
+
 
21420
+;; zero_extend version of the above
 
21421
+(define_insn "*rorsi3_insn_uxtw"
 
21422
+  [(set (match_operand:DI 0 "register_operand" "=r")
 
21423
+       (zero_extend:DI
 
21424
+        (rotate:SI (match_operand:SI 1 "register_operand" "r")
 
21425
+                   (match_operand 2 "const_int_operand" "n"))))]
 
21426
+  "UINTVAL (operands[2]) < 32"
 
21427
+{
 
21428
+  operands[3] = GEN_INT (32 - UINTVAL (operands[2]));
 
21429
+  return "ror\\t%w0, %w1, %3";
 
21430
+}
 
21431
+  [(set_attr "v8type" "shift")
 
21432
+   (set_attr "mode" "SI")]
 
21433
+)
 
21434
+
 
21435
 (define_insn "*<ANY_EXTEND:optab><GPI:mode>_ashl<SHORT:mode>"
 
21436
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21437
        (ANY_EXTEND:GPI
 
21438
@@ -2770,6 +3213,65 @@
 
21439
    (set_attr "mode" "<MODE>")]
 
21440
 )
 
21441
 
 
21442
+;; Bitfield Insert (insv)
 
21443
+(define_expand "insv<mode>"
 
21444
+  [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand")
 
21445
+                         (match_operand 1 "const_int_operand")
 
21446
+                         (match_operand 2 "const_int_operand"))
 
21447
+       (match_operand:GPI 3 "general_operand"))]
 
21448
+  ""
 
21449
+{
 
21450
+  unsigned HOST_WIDE_INT width = UINTVAL (operands[1]);
 
21451
+  unsigned HOST_WIDE_INT pos = UINTVAL (operands[2]);
 
21452
+  rtx value = operands[3];
 
21453
+
 
21454
+  if (width == 0 || (pos + width) > GET_MODE_BITSIZE (<MODE>mode))
 
21455
+    FAIL;
 
21456
+
 
21457
+  if (CONST_INT_P (value))
 
21458
+    {
 
21459
+      unsigned HOST_WIDE_INT mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
 
21460
+
 
21461
+      /* Prefer AND/OR for inserting all zeros or all ones.  */
 
21462
+      if ((UINTVAL (value) & mask) == 0
 
21463
+          || (UINTVAL (value) & mask) == mask)
 
21464
+       FAIL;
 
21465
+
 
21466
+      /* 16-bit aligned 16-bit wide insert is handled by insv_imm.  */
 
21467
+      if (width == 16 && (pos % 16) == 0)
 
21468
+       DONE;
 
21469
+    }
 
21470
+  operands[3] = force_reg (<MODE>mode, value);
 
21471
+})
 
21472
+
 
21473
+(define_insn "*insv_reg<mode>"
 
21474
+  [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand" "+r")
 
21475
+                         (match_operand 1 "const_int_operand" "n")
 
21476
+                         (match_operand 2 "const_int_operand" "n"))
 
21477
+       (match_operand:GPI 3 "register_operand" "r"))]
 
21478
+  "!(UINTVAL (operands[1]) == 0
 
21479
+     || (UINTVAL (operands[2]) + UINTVAL (operands[1])
 
21480
+        > GET_MODE_BITSIZE (<MODE>mode)))"
 
21481
+  "bfi\\t%<w>0, %<w>3, %2, %1"
 
21482
+  [(set_attr "v8type" "bfm")
 
21483
+   (set_attr "mode" "<MODE>")]
 
21484
+)
 
21485
+
 
21486
+(define_insn "*extr_insv_lower_reg<mode>"
 
21487
+  [(set (zero_extract:GPI (match_operand:GPI 0 "register_operand" "+r")
 
21488
+                         (match_operand 1 "const_int_operand" "n")
 
21489
+                         (const_int 0))
 
21490
+       (zero_extract:GPI (match_operand:GPI 2 "register_operand" "+r")
 
21491
+                         (match_dup 1)
 
21492
+                         (match_operand 3 "const_int_operand" "n")))]
 
21493
+  "!(UINTVAL (operands[1]) == 0
 
21494
+     || (UINTVAL (operands[3]) + UINTVAL (operands[1])
 
21495
+        > GET_MODE_BITSIZE (<MODE>mode)))"
 
21496
+  "bfxil\\t%<w>0, %<w>2, %3, %1"
 
21497
+  [(set_attr "v8type" "bfm")
 
21498
+   (set_attr "mode" "<MODE>")]
 
21499
+)
 
21500
+
 
21501
 (define_insn "*<optab><ALLX:mode>_shft_<GPI:mode>"
 
21502
   [(set (match_operand:GPI 0 "register_operand" "=r")
 
21503
        (ashift:GPI (ANY_EXTEND:GPI
 
21504
@@ -3090,6 +3592,27 @@
 
21505
    (set_attr "mode" "<MODE>")]
 
21506
 )
 
21507
 
 
21508
+(define_insn "aarch64_frecp<FRECP:frecp_suffix><mode>"
 
21509
+  [(set (match_operand:GPF 0 "register_operand" "=w")
 
21510
+       (unspec:GPF [(match_operand:GPF 1 "register_operand" "w")]
 
21511
+                   FRECP))]
 
21512
+  "TARGET_FLOAT"
 
21513
+  "frecp<FRECP:frecp_suffix>\\t%<s>0, %<s>1"
 
21514
+  [(set_attr "v8type" "frecp<FRECP:frecp_suffix>")
 
21515
+   (set_attr "mode" "<MODE>")]
 
21516
+)
 
21517
+
 
21518
+(define_insn "aarch64_frecps<mode>"
 
21519
+  [(set (match_operand:GPF 0 "register_operand" "=w")
 
21520
+       (unspec:GPF [(match_operand:GPF 1 "register_operand" "w")
 
21521
+                    (match_operand:GPF 2 "register_operand" "w")]
 
21522
+                   UNSPEC_FRECPS))]
 
21523
+  "TARGET_FLOAT"
 
21524
+  "frecps\\t%<s>0, %<s>1, %<s>2"
 
21525
+  [(set_attr "v8type" "frecps")
 
21526
+   (set_attr "mode" "<MODE>")]
 
21527
+)
 
21528
+
 
21529
 ;; -------------------------------------------------------------------
 
21530
 ;; Reload support
 
21531
 ;; -------------------------------------------------------------------
 
21532
@@ -3146,9 +3669,9 @@
 
21533
 ;; after or during reload as we don't want these patterns to start
 
21534
 ;; kicking in during the combiner.
 
21535
  
 
21536
-(define_insn "aarch64_movdi_tilow"
 
21537
+(define_insn "aarch64_movdi_<mode>low"
 
21538
   [(set (match_operand:DI 0 "register_operand" "=r")
 
21539
-        (truncate:DI (match_operand:TI 1 "register_operand" "w")))]
 
21540
+        (truncate:DI (match_operand:TX 1 "register_operand" "w")))]
 
21541
   "reload_completed || reload_in_progress"
 
21542
   "fmov\\t%x0, %d1"
 
21543
   [(set_attr "v8type" "fmovf2i")
 
21544
@@ -3156,10 +3679,10 @@
 
21545
    (set_attr "length" "4")
 
21546
   ])
 
21547
 
 
21548
-(define_insn "aarch64_movdi_tihigh"
 
21549
+(define_insn "aarch64_movdi_<mode>high"
 
21550
   [(set (match_operand:DI 0 "register_operand" "=r")
 
21551
         (truncate:DI
 
21552
-         (lshiftrt:TI (match_operand:TI 1 "register_operand" "w")
 
21553
+         (lshiftrt:TX (match_operand:TX 1 "register_operand" "w")
 
21554
                       (const_int 64))))]
 
21555
   "reload_completed || reload_in_progress"
 
21556
   "fmov\\t%x0, %1.d[1]"
 
21557
@@ -3168,24 +3691,22 @@
 
21558
    (set_attr "length" "4")
 
21559
   ])
 
21560
 
 
21561
-(define_insn "aarch64_movtihigh_di"
 
21562
-  [(set (zero_extract:TI (match_operand:TI 0 "register_operand" "+w")
 
21563
+(define_insn "aarch64_mov<mode>high_di"
 
21564
+  [(set (zero_extract:TX (match_operand:TX 0 "register_operand" "+w")
 
21565
                          (const_int 64) (const_int 64))
 
21566
-        (zero_extend:TI (match_operand:DI 1 "register_operand" "r")))]
 
21567
+        (zero_extend:TX (match_operand:DI 1 "register_operand" "r")))]
 
21568
   "reload_completed || reload_in_progress"
 
21569
   "fmov\\t%0.d[1], %x1"
 
21570
-
 
21571
   [(set_attr "v8type" "fmovi2f")
 
21572
    (set_attr "mode"   "DI")
 
21573
    (set_attr "length" "4")
 
21574
   ])
 
21575
 
 
21576
-(define_insn "aarch64_movtilow_di"
 
21577
-  [(set (match_operand:TI 0 "register_operand" "=w")
 
21578
-        (zero_extend:TI (match_operand:DI 1 "register_operand" "r")))]
 
21579
+(define_insn "aarch64_mov<mode>low_di"
 
21580
+  [(set (match_operand:TX 0 "register_operand" "=w")
 
21581
+        (zero_extend:TX (match_operand:DI 1 "register_operand" "r")))]
 
21582
   "reload_completed || reload_in_progress"
 
21583
   "fmov\\t%d0, %x1"
 
21584
-
 
21585
   [(set_attr "v8type" "fmovi2f")
 
21586
    (set_attr "mode"   "DI")
 
21587
    (set_attr "length" "4")
 
21588
@@ -3197,7 +3718,6 @@
 
21589
          (truncate:DI (match_operand:TI 1 "register_operand" "w"))))]
 
21590
   "reload_completed || reload_in_progress"
 
21591
   "fmov\\t%d0, %d1"
 
21592
-
 
21593
   [(set_attr "v8type" "fmovi2f")
 
21594
    (set_attr "mode"   "DI")
 
21595
    (set_attr "length" "4")
 
21596
--- a/src/gcc/config/aarch64/aarch64-option-extensions.def
 
21597
+++ b/src/gcc/config/aarch64/aarch64-option-extensions.def
 
21598
@@ -35,3 +35,4 @@
 
21599
 AARCH64_OPT_EXTENSION("fp",    AARCH64_FL_FP,  AARCH64_FL_FPSIMD | AARCH64_FL_CRYPTO)
 
21600
 AARCH64_OPT_EXTENSION("simd",  AARCH64_FL_FPSIMD,      AARCH64_FL_SIMD | AARCH64_FL_CRYPTO)
 
21601
 AARCH64_OPT_EXTENSION("crypto",        AARCH64_FL_CRYPTO | AARCH64_FL_FPSIMD,  AARCH64_FL_CRYPTO)
 
21602
+AARCH64_OPT_EXTENSION("crc",   AARCH64_FL_CRC, AARCH64_FL_CRC)
 
21603
--- a/src/gcc/config/aarch64/aarch64-builtins.c
 
21604
+++ b/src/gcc/config/aarch64/aarch64-builtins.c
 
21605
@@ -30,6 +30,7 @@
 
21606
 #include "langhooks.h"
 
21607
 #include "diagnostic-core.h"
 
21608
 #include "optabs.h"
 
21609
+#include "gimple.h"
 
21610
 
 
21611
 enum aarch64_simd_builtin_type_mode
 
21612
 {
 
21613
@@ -50,6 +51,7 @@
 
21614
   T_OI,
 
21615
   T_XI,
 
21616
   T_SI,
 
21617
+  T_SF,
 
21618
   T_HI,
 
21619
   T_QI,
 
21620
   T_MAX
 
21621
@@ -72,6 +74,7 @@
 
21622
 #define oi_UP   T_OI
 
21623
 #define xi_UP   T_XI
 
21624
 #define si_UP    T_SI
 
21625
+#define sf_UP    T_SF
 
21626
 #define hi_UP    T_HI
 
21627
 #define qi_UP    T_QI
 
21628
 
 
21629
@@ -128,123 +131,136 @@
 
21630
   unsigned int fcode;
 
21631
 } aarch64_simd_builtin_datum;
 
21632
 
 
21633
-#define CF(N, X) CODE_FOR_aarch64_##N##X
 
21634
+#define CF0(N, X) CODE_FOR_aarch64_##N##X
 
21635
+#define CF1(N, X) CODE_FOR_##N##X##1
 
21636
+#define CF2(N, X) CODE_FOR_##N##X##2
 
21637
+#define CF3(N, X) CODE_FOR_##N##X##3
 
21638
+#define CF4(N, X) CODE_FOR_##N##X##4
 
21639
+#define CF10(N, X) CODE_FOR_##N##X
 
21640
 
 
21641
-#define VAR1(T, N, A) \
 
21642
-  {#N, AARCH64_SIMD_##T, UP (A), CF (N, A), 0},
 
21643
-#define VAR2(T, N, A, B) \
 
21644
-  VAR1 (T, N, A) \
 
21645
-  VAR1 (T, N, B)
 
21646
-#define VAR3(T, N, A, B, C) \
 
21647
-  VAR2 (T, N, A, B) \
 
21648
-  VAR1 (T, N, C)
 
21649
-#define VAR4(T, N, A, B, C, D) \
 
21650
-  VAR3 (T, N, A, B, C) \
 
21651
-  VAR1 (T, N, D)
 
21652
-#define VAR5(T, N, A, B, C, D, E) \
 
21653
-  VAR4 (T, N, A, B, C, D) \
 
21654
-  VAR1 (T, N, E)
 
21655
-#define VAR6(T, N, A, B, C, D, E, F) \
 
21656
-  VAR5 (T, N, A, B, C, D, E) \
 
21657
-  VAR1 (T, N, F)
 
21658
-#define VAR7(T, N, A, B, C, D, E, F, G) \
 
21659
-  VAR6 (T, N, A, B, C, D, E, F) \
 
21660
-  VAR1 (T, N, G)
 
21661
-#define VAR8(T, N, A, B, C, D, E, F, G, H) \
 
21662
-  VAR7 (T, N, A, B, C, D, E, F, G) \
 
21663
-  VAR1 (T, N, H)
 
21664
-#define VAR9(T, N, A, B, C, D, E, F, G, H, I) \
 
21665
-  VAR8 (T, N, A, B, C, D, E, F, G, H) \
 
21666
-  VAR1 (T, N, I)
 
21667
-#define VAR10(T, N, A, B, C, D, E, F, G, H, I, J) \
 
21668
-  VAR9 (T, N, A, B, C, D, E, F, G, H, I) \
 
21669
-  VAR1 (T, N, J)
 
21670
-#define VAR11(T, N, A, B, C, D, E, F, G, H, I, J, K) \
 
21671
-  VAR10 (T, N, A, B, C, D, E, F, G, H, I, J) \
 
21672
-  VAR1 (T, N, K)
 
21673
-#define VAR12(T, N, A, B, C, D, E, F, G, H, I, J, K, L) \
 
21674
-  VAR11 (T, N, A, B, C, D, E, F, G, H, I, J, K) \
 
21675
-  VAR1 (T, N, L)
 
21676
+#define VAR1(T, N, MAP, A) \
 
21677
+  {#N, AARCH64_SIMD_##T, UP (A), CF##MAP (N, A), 0},
 
21678
+#define VAR2(T, N, MAP, A, B) \
 
21679
+  VAR1 (T, N, MAP, A) \
 
21680
+  VAR1 (T, N, MAP, B)
 
21681
+#define VAR3(T, N, MAP, A, B, C) \
 
21682
+  VAR2 (T, N, MAP, A, B) \
 
21683
+  VAR1 (T, N, MAP, C)
 
21684
+#define VAR4(T, N, MAP, A, B, C, D) \
 
21685
+  VAR3 (T, N, MAP, A, B, C) \
 
21686
+  VAR1 (T, N, MAP, D)
 
21687
+#define VAR5(T, N, MAP, A, B, C, D, E) \
 
21688
+  VAR4 (T, N, MAP, A, B, C, D) \
 
21689
+  VAR1 (T, N, MAP, E)
 
21690
+#define VAR6(T, N, MAP, A, B, C, D, E, F) \
 
21691
+  VAR5 (T, N, MAP, A, B, C, D, E) \
 
21692
+  VAR1 (T, N, MAP, F)
 
21693
+#define VAR7(T, N, MAP, A, B, C, D, E, F, G) \
 
21694
+  VAR6 (T, N, MAP, A, B, C, D, E, F) \
 
21695
+  VAR1 (T, N, MAP, G)
 
21696
+#define VAR8(T, N, MAP, A, B, C, D, E, F, G, H) \
 
21697
+  VAR7 (T, N, MAP, A, B, C, D, E, F, G) \
 
21698
+  VAR1 (T, N, MAP, H)
 
21699
+#define VAR9(T, N, MAP, A, B, C, D, E, F, G, H, I) \
 
21700
+  VAR8 (T, N, MAP, A, B, C, D, E, F, G, H) \
 
21701
+  VAR1 (T, N, MAP, I)
 
21702
+#define VAR10(T, N, MAP, A, B, C, D, E, F, G, H, I, J) \
 
21703
+  VAR9 (T, N, MAP, A, B, C, D, E, F, G, H, I) \
 
21704
+  VAR1 (T, N, MAP, J)
 
21705
+#define VAR11(T, N, MAP, A, B, C, D, E, F, G, H, I, J, K) \
 
21706
+  VAR10 (T, N, MAP, A, B, C, D, E, F, G, H, I, J) \
 
21707
+  VAR1 (T, N, MAP, K)
 
21708
+#define VAR12(T, N, MAP, A, B, C, D, E, F, G, H, I, J, K, L) \
 
21709
+  VAR11 (T, N, MAP, A, B, C, D, E, F, G, H, I, J, K) \
 
21710
+  VAR1 (T, N, MAP, L)
 
21711
 
 
21712
 /* BUILTIN_<ITERATOR> macros should expand to cover the same range of
 
21713
    modes as is given for each define_mode_iterator in
 
21714
    config/aarch64/iterators.md.  */
 
21715
 
 
21716
-#define BUILTIN_DX(T, N) \
 
21717
-  VAR2 (T, N, di, df)
 
21718
-#define BUILTIN_SDQ_I(T, N) \
 
21719
-  VAR4 (T, N, qi, hi, si, di)
 
21720
-#define BUILTIN_SD_HSI(T, N) \
 
21721
-  VAR2 (T, N, hi, si)
 
21722
-#define BUILTIN_V2F(T, N) \
 
21723
-  VAR2 (T, N, v2sf, v2df)
 
21724
-#define BUILTIN_VALL(T, N) \
 
21725
-  VAR10 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, v2sf, v4sf, v2df)
 
21726
-#define BUILTIN_VB(T, N) \
 
21727
-  VAR2 (T, N, v8qi, v16qi)
 
21728
-#define BUILTIN_VD(T, N) \
 
21729
-  VAR4 (T, N, v8qi, v4hi, v2si, v2sf)
 
21730
-#define BUILTIN_VDC(T, N) \
 
21731
-  VAR6 (T, N, v8qi, v4hi, v2si, v2sf, di, df)
 
21732
-#define BUILTIN_VDIC(T, N) \
 
21733
-  VAR3 (T, N, v8qi, v4hi, v2si)
 
21734
-#define BUILTIN_VDN(T, N) \
 
21735
-  VAR3 (T, N, v4hi, v2si, di)
 
21736
-#define BUILTIN_VDQ(T, N) \
 
21737
-  VAR7 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di)
 
21738
-#define BUILTIN_VDQF(T, N) \
 
21739
-  VAR3 (T, N, v2sf, v4sf, v2df)
 
21740
-#define BUILTIN_VDQHS(T, N) \
 
21741
-  VAR4 (T, N, v4hi, v8hi, v2si, v4si)
 
21742
-#define BUILTIN_VDQIF(T, N) \
 
21743
-  VAR9 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2sf, v4sf, v2df)
 
21744
-#define BUILTIN_VDQM(T, N) \
 
21745
-  VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21746
-#define BUILTIN_VDQV(T, N) \
 
21747
-  VAR5 (T, N, v8qi, v16qi, v4hi, v8hi, v4si)
 
21748
-#define BUILTIN_VDQ_BHSI(T, N) \
 
21749
-  VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21750
-#define BUILTIN_VDQ_I(T, N) \
 
21751
-  VAR7 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di)
 
21752
-#define BUILTIN_VDW(T, N) \
 
21753
-  VAR3 (T, N, v8qi, v4hi, v2si)
 
21754
-#define BUILTIN_VD_BHSI(T, N) \
 
21755
-  VAR3 (T, N, v8qi, v4hi, v2si)
 
21756
-#define BUILTIN_VD_HSI(T, N) \
 
21757
-  VAR2 (T, N, v4hi, v2si)
 
21758
-#define BUILTIN_VD_RE(T, N) \
 
21759
-  VAR6 (T, N, v8qi, v4hi, v2si, v2sf, di, df)
 
21760
-#define BUILTIN_VQ(T, N) \
 
21761
-  VAR6 (T, N, v16qi, v8hi, v4si, v2di, v4sf, v2df)
 
21762
-#define BUILTIN_VQN(T, N) \
 
21763
-  VAR3 (T, N, v8hi, v4si, v2di)
 
21764
-#define BUILTIN_VQW(T, N) \
 
21765
-  VAR3 (T, N, v16qi, v8hi, v4si)
 
21766
-#define BUILTIN_VQ_HSI(T, N) \
 
21767
-  VAR2 (T, N, v8hi, v4si)
 
21768
-#define BUILTIN_VQ_S(T, N) \
 
21769
-  VAR6 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21770
-#define BUILTIN_VSDQ_HSI(T, N) \
 
21771
-  VAR6 (T, N, v4hi, v8hi, v2si, v4si, hi, si)
 
21772
-#define BUILTIN_VSDQ_I(T, N) \
 
21773
-  VAR11 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si, di)
 
21774
-#define BUILTIN_VSDQ_I_BHSI(T, N) \
 
21775
-  VAR10 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si)
 
21776
-#define BUILTIN_VSDQ_I_DI(T, N) \
 
21777
-  VAR8 (T, N, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, di)
 
21778
-#define BUILTIN_VSD_HSI(T, N) \
 
21779
-  VAR4 (T, N, v4hi, v2si, hi, si)
 
21780
-#define BUILTIN_VSQN_HSDI(T, N) \
 
21781
-  VAR6 (T, N, v8hi, v4si, v2di, hi, si, di)
 
21782
-#define BUILTIN_VSTRUCT(T, N) \
 
21783
-  VAR3 (T, N, oi, ci, xi)
 
21784
+#define BUILTIN_DX(T, N, MAP) \
 
21785
+  VAR2 (T, N, MAP, di, df)
 
21786
+#define BUILTIN_GPF(T, N, MAP) \
 
21787
+  VAR2 (T, N, MAP, sf, df)
 
21788
+#define BUILTIN_SDQ_I(T, N, MAP) \
 
21789
+  VAR4 (T, N, MAP, qi, hi, si, di)
 
21790
+#define BUILTIN_SD_HSI(T, N, MAP) \
 
21791
+  VAR2 (T, N, MAP, hi, si)
 
21792
+#define BUILTIN_V2F(T, N, MAP) \
 
21793
+  VAR2 (T, N, MAP, v2sf, v2df)
 
21794
+#define BUILTIN_VALL(T, N, MAP) \
 
21795
+  VAR10 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, \
 
21796
+        v4si, v2di, v2sf, v4sf, v2df)
 
21797
+#define BUILTIN_VALLDI(T, N, MAP) \
 
21798
+  VAR11 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, \
 
21799
+        v4si, v2di, v2sf, v4sf, v2df, di)
 
21800
+#define BUILTIN_VB(T, N, MAP) \
 
21801
+  VAR2 (T, N, MAP, v8qi, v16qi)
 
21802
+#define BUILTIN_VD(T, N, MAP) \
 
21803
+  VAR4 (T, N, MAP, v8qi, v4hi, v2si, v2sf)
 
21804
+#define BUILTIN_VDC(T, N, MAP) \
 
21805
+  VAR6 (T, N, MAP, v8qi, v4hi, v2si, v2sf, di, df)
 
21806
+#define BUILTIN_VDIC(T, N, MAP) \
 
21807
+  VAR3 (T, N, MAP, v8qi, v4hi, v2si)
 
21808
+#define BUILTIN_VDN(T, N, MAP) \
 
21809
+  VAR3 (T, N, MAP, v4hi, v2si, di)
 
21810
+#define BUILTIN_VDQ(T, N, MAP) \
 
21811
+  VAR7 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di)
 
21812
+#define BUILTIN_VDQF(T, N, MAP) \
 
21813
+  VAR3 (T, N, MAP, v2sf, v4sf, v2df)
 
21814
+#define BUILTIN_VDQH(T, N, MAP) \
 
21815
+  VAR2 (T, N, MAP, v4hi, v8hi)
 
21816
+#define BUILTIN_VDQHS(T, N, MAP) \
 
21817
+  VAR4 (T, N, MAP, v4hi, v8hi, v2si, v4si)
 
21818
+#define BUILTIN_VDQIF(T, N, MAP) \
 
21819
+  VAR9 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2sf, v4sf, v2df)
 
21820
+#define BUILTIN_VDQM(T, N, MAP) \
 
21821
+  VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21822
+#define BUILTIN_VDQV(T, N, MAP) \
 
21823
+  VAR5 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v4si)
 
21824
+#define BUILTIN_VDQ_BHSI(T, N, MAP) \
 
21825
+  VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21826
+#define BUILTIN_VDQ_I(T, N, MAP) \
 
21827
+  VAR7 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di)
 
21828
+#define BUILTIN_VDW(T, N, MAP) \
 
21829
+  VAR3 (T, N, MAP, v8qi, v4hi, v2si)
 
21830
+#define BUILTIN_VD_BHSI(T, N, MAP) \
 
21831
+  VAR3 (T, N, MAP, v8qi, v4hi, v2si)
 
21832
+#define BUILTIN_VD_HSI(T, N, MAP) \
 
21833
+  VAR2 (T, N, MAP, v4hi, v2si)
 
21834
+#define BUILTIN_VD_RE(T, N, MAP) \
 
21835
+  VAR6 (T, N, MAP, v8qi, v4hi, v2si, v2sf, di, df)
 
21836
+#define BUILTIN_VQ(T, N, MAP) \
 
21837
+  VAR6 (T, N, MAP, v16qi, v8hi, v4si, v2di, v4sf, v2df)
 
21838
+#define BUILTIN_VQN(T, N, MAP) \
 
21839
+  VAR3 (T, N, MAP, v8hi, v4si, v2di)
 
21840
+#define BUILTIN_VQW(T, N, MAP) \
 
21841
+  VAR3 (T, N, MAP, v16qi, v8hi, v4si)
 
21842
+#define BUILTIN_VQ_HSI(T, N, MAP) \
 
21843
+  VAR2 (T, N, MAP, v8hi, v4si)
 
21844
+#define BUILTIN_VQ_S(T, N, MAP) \
 
21845
+  VAR6 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si)
 
21846
+#define BUILTIN_VSDQ_HSI(T, N, MAP) \
 
21847
+  VAR6 (T, N, MAP, v4hi, v8hi, v2si, v4si, hi, si)
 
21848
+#define BUILTIN_VSDQ_I(T, N, MAP) \
 
21849
+  VAR11 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si, di)
 
21850
+#define BUILTIN_VSDQ_I_BHSI(T, N, MAP) \
 
21851
+  VAR10 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, qi, hi, si)
 
21852
+#define BUILTIN_VSDQ_I_DI(T, N, MAP) \
 
21853
+  VAR8 (T, N, MAP, v8qi, v16qi, v4hi, v8hi, v2si, v4si, v2di, di)
 
21854
+#define BUILTIN_VSD_HSI(T, N, MAP) \
 
21855
+  VAR4 (T, N, MAP, v4hi, v2si, hi, si)
 
21856
+#define BUILTIN_VSQN_HSDI(T, N, MAP) \
 
21857
+  VAR6 (T, N, MAP, v8hi, v4si, v2di, hi, si, di)
 
21858
+#define BUILTIN_VSTRUCT(T, N, MAP) \
 
21859
+  VAR3 (T, N, MAP, oi, ci, xi)
 
21860
 
 
21861
 static aarch64_simd_builtin_datum aarch64_simd_builtin_data[] = {
 
21862
 #include "aarch64-simd-builtins.def"
 
21863
 };
 
21864
 
 
21865
 #undef VAR1
 
21866
-#define VAR1(T, N, A) \
 
21867
+#define VAR1(T, N, MAP, A) \
 
21868
   AARCH64_SIMD_BUILTIN_##N##A,
 
21869
 
 
21870
 enum aarch64_builtins
 
21871
@@ -257,53 +273,6 @@
 
21872
   AARCH64_BUILTIN_MAX
 
21873
 };
 
21874
 
 
21875
-#undef BUILTIN_DX
 
21876
-#undef BUILTIN_SDQ_I
 
21877
-#undef BUILTIN_SD_HSI
 
21878
-#undef BUILTIN_V2F
 
21879
-#undef BUILTIN_VALL
 
21880
-#undef BUILTIN_VB
 
21881
-#undef BUILTIN_VD
 
21882
-#undef BUILTIN_VDC
 
21883
-#undef BUILTIN_VDIC
 
21884
-#undef BUILTIN_VDN
 
21885
-#undef BUILTIN_VDQ
 
21886
-#undef BUILTIN_VDQF
 
21887
-#undef BUILTIN_VDQHS
 
21888
-#undef BUILTIN_VDQIF
 
21889
-#undef BUILTIN_VDQM
 
21890
-#undef BUILTIN_VDQV
 
21891
-#undef BUILTIN_VDQ_BHSI
 
21892
-#undef BUILTIN_VDQ_I
 
21893
-#undef BUILTIN_VDW
 
21894
-#undef BUILTIN_VD_BHSI
 
21895
-#undef BUILTIN_VD_HSI
 
21896
-#undef BUILTIN_VD_RE
 
21897
-#undef BUILTIN_VQ
 
21898
-#undef BUILTIN_VQN
 
21899
-#undef BUILTIN_VQW
 
21900
-#undef BUILTIN_VQ_HSI
 
21901
-#undef BUILTIN_VQ_S
 
21902
-#undef BUILTIN_VSDQ_HSI
 
21903
-#undef BUILTIN_VSDQ_I
 
21904
-#undef BUILTIN_VSDQ_I_BHSI
 
21905
-#undef BUILTIN_VSDQ_I_DI
 
21906
-#undef BUILTIN_VSD_HSI
 
21907
-#undef BUILTIN_VSQN_HSDI
 
21908
-#undef BUILTIN_VSTRUCT
 
21909
-#undef CF
 
21910
-#undef VAR1
 
21911
-#undef VAR2
 
21912
-#undef VAR3
 
21913
-#undef VAR4
 
21914
-#undef VAR5
 
21915
-#undef VAR6
 
21916
-#undef VAR7
 
21917
-#undef VAR8
 
21918
-#undef VAR9
 
21919
-#undef VAR10
 
21920
-#undef VAR11
 
21921
-
 
21922
 static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX];
 
21923
 
 
21924
 #define NUM_DREG_TYPES 6
 
21925
@@ -609,7 +578,7 @@
 
21926
       {
 
21927
        "v8qi", "v4hi", "v2si", "v2sf", "di", "df",
 
21928
        "v16qi", "v8hi", "v4si", "v4sf", "v2di", "v2df",
 
21929
-       "ti", "ei", "oi", "xi", "si", "hi", "qi"
 
21930
+       "ti", "ei", "oi", "xi", "si", "sf", "hi", "qi"
 
21931
       };
 
21932
       char namebuf[60];
 
21933
       tree ftype = NULL;
 
21934
@@ -1259,30 +1228,82 @@
 
21935
    && in_mode == N##Fmode && in_n == C)
 
21936
        case BUILT_IN_FLOOR:
 
21937
        case BUILT_IN_FLOORF:
 
21938
-         return AARCH64_FIND_FRINT_VARIANT (frintm);
 
21939
+         return AARCH64_FIND_FRINT_VARIANT (floor);
 
21940
        case BUILT_IN_CEIL:
 
21941
        case BUILT_IN_CEILF:
 
21942
-         return AARCH64_FIND_FRINT_VARIANT (frintp);
 
21943
+         return AARCH64_FIND_FRINT_VARIANT (ceil);
 
21944
        case BUILT_IN_TRUNC:
 
21945
        case BUILT_IN_TRUNCF:
 
21946
-         return AARCH64_FIND_FRINT_VARIANT (frintz);
 
21947
+         return AARCH64_FIND_FRINT_VARIANT (btrunc);
 
21948
        case BUILT_IN_ROUND:
 
21949
        case BUILT_IN_ROUNDF:
 
21950
-         return AARCH64_FIND_FRINT_VARIANT (frinta);
 
21951
+         return AARCH64_FIND_FRINT_VARIANT (round);
 
21952
        case BUILT_IN_NEARBYINT:
 
21953
        case BUILT_IN_NEARBYINTF:
 
21954
-         return AARCH64_FIND_FRINT_VARIANT (frinti);
 
21955
+         return AARCH64_FIND_FRINT_VARIANT (nearbyint);
 
21956
        case BUILT_IN_SQRT:
 
21957
        case BUILT_IN_SQRTF:
 
21958
          return AARCH64_FIND_FRINT_VARIANT (sqrt);
 
21959
 #undef AARCH64_CHECK_BUILTIN_MODE
 
21960
 #define AARCH64_CHECK_BUILTIN_MODE(C, N) \
 
21961
+  (out_mode == SImode && out_n == C \
 
21962
+   && in_mode == N##Imode && in_n == C)
 
21963
+        case BUILT_IN_CLZ:
 
21964
+          {
 
21965
+            if (AARCH64_CHECK_BUILTIN_MODE (4, S))
 
21966
+              return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_clzv4si];
 
21967
+            return NULL_TREE;
 
21968
+          }
 
21969
+#undef AARCH64_CHECK_BUILTIN_MODE
 
21970
+#define AARCH64_CHECK_BUILTIN_MODE(C, N) \
 
21971
   (out_mode == N##Imode && out_n == C \
 
21972
    && in_mode == N##Fmode && in_n == C)
 
21973
        case BUILT_IN_LFLOOR:
 
21974
-         return AARCH64_FIND_FRINT_VARIANT (fcvtms);
 
21975
+       case BUILT_IN_IFLOORF:
 
21976
+         {
 
21977
+           tree new_tree = NULL_TREE;
 
21978
+           if (AARCH64_CHECK_BUILTIN_MODE (2, D))
 
21979
+             new_tree =
 
21980
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv2dfv2di];
 
21981
+           else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
 
21982
+             new_tree =
 
21983
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv4sfv4si];
 
21984
+           else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
 
21985
+             new_tree =
 
21986
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv2sfv2si];
 
21987
+           return new_tree;
 
21988
+         }
 
21989
        case BUILT_IN_LCEIL:
 
21990
-         return AARCH64_FIND_FRINT_VARIANT (fcvtps);
 
21991
+       case BUILT_IN_ICEILF:
 
21992
+         {
 
21993
+           tree new_tree = NULL_TREE;
 
21994
+           if (AARCH64_CHECK_BUILTIN_MODE (2, D))
 
21995
+             new_tree =
 
21996
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv2dfv2di];
 
21997
+           else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
 
21998
+             new_tree =
 
21999
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv4sfv4si];
 
22000
+           else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
 
22001
+             new_tree =
 
22002
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv2sfv2si];
 
22003
+           return new_tree;
 
22004
+         }
 
22005
+       case BUILT_IN_LROUND:
 
22006
+       case BUILT_IN_IROUNDF:
 
22007
+         {
 
22008
+           tree new_tree = NULL_TREE;
 
22009
+           if (AARCH64_CHECK_BUILTIN_MODE (2, D))
 
22010
+             new_tree =
 
22011
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2dfv2di];
 
22012
+           else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
 
22013
+             new_tree =
 
22014
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv4sfv4si];
 
22015
+           else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
 
22016
+             new_tree =
 
22017
+               aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2sfv2si];
 
22018
+           return new_tree;
 
22019
+         }
 
22020
+
 
22021
        default:
 
22022
          return NULL_TREE;
 
22023
       }
 
22024
@@ -1290,5 +1311,160 @@
 
22025
 
 
22026
   return NULL_TREE;
 
22027
 }
 
22028
+
 
22029
+#undef VAR1
 
22030
+#define VAR1(T, N, MAP, A) \
 
22031
+  case AARCH64_SIMD_BUILTIN_##N##A:
 
22032
+
 
22033
+tree
 
22034
+aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args,
 
22035
+                     bool ignore ATTRIBUTE_UNUSED)
 
22036
+{
 
22037
+  int fcode = DECL_FUNCTION_CODE (fndecl);
 
22038
+  tree type = TREE_TYPE (TREE_TYPE (fndecl));
 
22039
+
 
22040
+  switch (fcode)
 
22041
+    {
 
22042
+      BUILTIN_VALLDI (UNOP, abs, 2)
 
22043
+       return fold_build1 (ABS_EXPR, type, args[0]);
 
22044
+       break;
 
22045
+      BUILTIN_VALLDI (BINOP, cmge, 0)
 
22046
+       return fold_build2 (GE_EXPR, type, args[0], args[1]);
 
22047
+       break;
 
22048
+      BUILTIN_VALLDI (BINOP, cmgt, 0)
 
22049
+       return fold_build2 (GT_EXPR, type, args[0], args[1]);
 
22050
+       break;
 
22051
+      BUILTIN_VALLDI (BINOP, cmeq, 0)
 
22052
+       return fold_build2 (EQ_EXPR, type, args[0], args[1]);
 
22053
+       break;
 
22054
+      BUILTIN_VSDQ_I_DI (BINOP, cmtst, 0)
 
22055
+       {
 
22056
+         tree and_node = fold_build2 (BIT_AND_EXPR, type, args[0], args[1]);
 
22057
+         tree vec_zero_node = build_zero_cst (type);
 
22058
+         return fold_build2 (NE_EXPR, type, and_node, vec_zero_node);
 
22059
+         break;
 
22060
+       }
 
22061
+      VAR1 (UNOP, floatv2si, 2, v2sf)
 
22062
+      VAR1 (UNOP, floatv4si, 2, v4sf)
 
22063
+      VAR1 (UNOP, floatv2di, 2, v2df)
 
22064
+       return fold_build1 (FLOAT_EXPR, type, args[0]);
 
22065
+      default:
 
22066
+       break;
 
22067
+    }
 
22068
+
 
22069
+  return NULL_TREE;
 
22070
+}
 
22071
+
 
22072
+bool
 
22073
+aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi)
 
22074
+{
 
22075
+  bool changed = false;
 
22076
+  gimple stmt = gsi_stmt (*gsi);
 
22077
+  tree call = gimple_call_fn (stmt);
 
22078
+  tree fndecl;
 
22079
+  gimple new_stmt = NULL;
 
22080
+  if (call)
 
22081
+    {
 
22082
+      fndecl = gimple_call_fndecl (stmt);
 
22083
+      if (fndecl)
 
22084
+       {
 
22085
+         int fcode = DECL_FUNCTION_CODE (fndecl);
 
22086
+         int nargs = gimple_call_num_args (stmt);
 
22087
+         tree *args = (nargs > 0
 
22088
+                       ? gimple_call_arg_ptr (stmt, 0)
 
22089
+                       : &error_mark_node);
 
22090
+
 
22091
+         switch (fcode)
 
22092
+           {
 
22093
+             BUILTIN_VALL (UNOP, reduc_splus_, 10)
 
22094
+               new_stmt = gimple_build_assign_with_ops (
 
22095
+                                               REDUC_PLUS_EXPR,
 
22096
+                                               gimple_call_lhs (stmt),
 
22097
+                                               args[0],
 
22098
+                                               NULL_TREE);
 
22099
+               break;
 
22100
+             BUILTIN_VDQIF (UNOP, reduc_smax_, 10)
 
22101
+               new_stmt = gimple_build_assign_with_ops (
 
22102
+                                               REDUC_MAX_EXPR,
 
22103
+                                               gimple_call_lhs (stmt),
 
22104
+                                               args[0],
 
22105
+                                               NULL_TREE);
 
22106
+               break;
 
22107
+             BUILTIN_VDQIF (UNOP, reduc_smin_, 10)
 
22108
+               new_stmt = gimple_build_assign_with_ops (
 
22109
+                                               REDUC_MIN_EXPR,
 
22110
+                                               gimple_call_lhs (stmt),
 
22111
+                                               args[0],
 
22112
+                                               NULL_TREE);
 
22113
+               break;
 
22114
+
 
22115
+           default:
 
22116
+             break;
 
22117
+           }
 
22118
+       }
 
22119
+    }
 
22120
+
 
22121
+  if (new_stmt)
 
22122
+    {
 
22123
+      gsi_replace (gsi, new_stmt, true);
 
22124
+      changed = true;
 
22125
+    }
 
22126
+
 
22127
+  return changed;
 
22128
+}
 
22129
+
 
22130
 #undef AARCH64_CHECK_BUILTIN_MODE
 
22131
 #undef AARCH64_FIND_FRINT_VARIANT
 
22132
+#undef BUILTIN_DX
 
22133
+#undef BUILTIN_SDQ_I
 
22134
+#undef BUILTIN_SD_HSI
 
22135
+#undef BUILTIN_V2F
 
22136
+#undef BUILTIN_VALL
 
22137
+#undef BUILTIN_VB
 
22138
+#undef BUILTIN_VD
 
22139
+#undef BUILTIN_VDC
 
22140
+#undef BUILTIN_VDIC
 
22141
+#undef BUILTIN_VDN
 
22142
+#undef BUILTIN_VDQ
 
22143
+#undef BUILTIN_VDQF
 
22144
+#undef BUILTIN_VDQH
 
22145
+#undef BUILTIN_VDQHS
 
22146
+#undef BUILTIN_VDQIF
 
22147
+#undef BUILTIN_VDQM
 
22148
+#undef BUILTIN_VDQV
 
22149
+#undef BUILTIN_VDQ_BHSI
 
22150
+#undef BUILTIN_VDQ_I
 
22151
+#undef BUILTIN_VDW
 
22152
+#undef BUILTIN_VD_BHSI
 
22153
+#undef BUILTIN_VD_HSI
 
22154
+#undef BUILTIN_VD_RE
 
22155
+#undef BUILTIN_VQ
 
22156
+#undef BUILTIN_VQN
 
22157
+#undef BUILTIN_VQW
 
22158
+#undef BUILTIN_VQ_HSI
 
22159
+#undef BUILTIN_VQ_S
 
22160
+#undef BUILTIN_VSDQ_HSI
 
22161
+#undef BUILTIN_VSDQ_I
 
22162
+#undef BUILTIN_VSDQ_I_BHSI
 
22163
+#undef BUILTIN_VSDQ_I_DI
 
22164
+#undef BUILTIN_VSD_HSI
 
22165
+#undef BUILTIN_VSQN_HSDI
 
22166
+#undef BUILTIN_VSTRUCT
 
22167
+#undef CF0
 
22168
+#undef CF1
 
22169
+#undef CF2
 
22170
+#undef CF3
 
22171
+#undef CF4
 
22172
+#undef CF10
 
22173
+#undef VAR1
 
22174
+#undef VAR2
 
22175
+#undef VAR3
 
22176
+#undef VAR4
 
22177
+#undef VAR5
 
22178
+#undef VAR6
 
22179
+#undef VAR7
 
22180
+#undef VAR8
 
22181
+#undef VAR9
 
22182
+#undef VAR10
 
22183
+#undef VAR11
 
22184
+
 
22185
--- a/src/gcc/config/aarch64/aarch64-protos.h
 
22186
+++ b/src/gcc/config/aarch64/aarch64-protos.h
 
22187
@@ -68,6 +68,13 @@
 
22188
    Each of of these represents a thread-local symbol, and corresponds to the
 
22189
    thread local storage relocation operator for the symbol being referred to.
 
22190
 
 
22191
+   SYMBOL_TINY_ABSOLUTE
 
22192
+
 
22193
+   Generate symbol accesses as a PC relative address using a single
 
22194
+   instruction.  To compute the address of symbol foo, we generate:
 
22195
+
 
22196
+   ADR x0, foo
 
22197
+
 
22198
    SYMBOL_FORCE_TO_MEM : Global variables are addressed using
 
22199
    constant pool.  All variable addresses are spilled into constant
 
22200
    pools.  The constant pools themselves are addressed using PC
 
22201
@@ -81,6 +88,7 @@
 
22202
   SYMBOL_SMALL_TLSDESC,
 
22203
   SYMBOL_SMALL_GOTTPREL,
 
22204
   SYMBOL_SMALL_TPREL,
 
22205
+  SYMBOL_TINY_ABSOLUTE,
 
22206
   SYMBOL_FORCE_TO_MEM
 
22207
 };
 
22208
 
 
22209
@@ -126,35 +134,66 @@
 
22210
   const int FP2FP;
 
22211
 };
 
22212
 
 
22213
+/* Cost for vector insn classes.  */
 
22214
+struct cpu_vector_cost
 
22215
+{
 
22216
+  const int scalar_stmt_cost;           /* Cost of any scalar operation,
 
22217
+                                           excluding load and store.  */
 
22218
+  const int scalar_load_cost;           /* Cost of scalar load.  */
 
22219
+  const int scalar_store_cost;          /* Cost of scalar store.  */
 
22220
+  const int vec_stmt_cost;              /* Cost of any vector operation,
 
22221
+                                           excluding load, store,
 
22222
+                                           vector-to-scalar and
 
22223
+                                           scalar-to-vector operation.  */
 
22224
+  const int vec_to_scalar_cost;                 /* Cost of vec-to-scalar operation.  */
 
22225
+  const int scalar_to_vec_cost;                 /* Cost of scalar-to-vector
 
22226
+                                           operation.  */
 
22227
+  const int vec_align_load_cost;        /* Cost of aligned vector load.  */
 
22228
+  const int vec_unalign_load_cost;      /* Cost of unaligned vector load.  */
 
22229
+  const int vec_unalign_store_cost;     /* Cost of unaligned vector store.  */
 
22230
+  const int vec_store_cost;             /* Cost of vector store.  */
 
22231
+  const int cond_taken_branch_cost;     /* Cost of taken branch.  */
 
22232
+  const int cond_not_taken_branch_cost;  /* Cost of not taken branch.  */
 
22233
+};
 
22234
+
 
22235
 struct tune_params
 
22236
 {
 
22237
   const struct cpu_rtx_cost_table *const insn_extra_cost;
 
22238
   const struct cpu_addrcost_table *const addr_cost;
 
22239
   const struct cpu_regmove_cost *const regmove_cost;
 
22240
+  const struct cpu_vector_cost *const vec_costs;
 
22241
   const int memmov_cost;
 
22242
 };
 
22243
 
 
22244
 HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned);
 
22245
 bool aarch64_bitmask_imm (HOST_WIDE_INT val, enum machine_mode);
 
22246
+enum aarch64_symbol_type
 
22247
+aarch64_classify_symbolic_expression (rtx, enum aarch64_symbol_context);
 
22248
 bool aarch64_constant_address_p (rtx);
 
22249
 bool aarch64_float_const_zero_rtx_p (rtx);
 
22250
 bool aarch64_function_arg_regno_p (unsigned);
 
22251
 bool aarch64_gen_movmemqi (rtx *);
 
22252
+bool aarch64_gimple_fold_builtin (gimple_stmt_iterator *);
 
22253
 bool aarch64_is_extend_from_extract (enum machine_mode, rtx, rtx);
 
22254
 bool aarch64_is_long_call_p (rtx);
 
22255
 bool aarch64_label_mentioned_p (rtx);
 
22256
 bool aarch64_legitimate_pic_operand_p (rtx);
 
22257
 bool aarch64_move_imm (HOST_WIDE_INT, enum machine_mode);
 
22258
+bool aarch64_mov_operand_p (rtx, enum aarch64_symbol_context,
 
22259
+                           enum machine_mode);
 
22260
+char *aarch64_output_scalar_simd_mov_immediate (rtx, enum machine_mode);
 
22261
+char *aarch64_output_simd_mov_immediate (rtx, enum machine_mode, unsigned);
 
22262
 bool aarch64_pad_arg_upward (enum machine_mode, const_tree);
 
22263
 bool aarch64_pad_reg_upward (enum machine_mode, const_tree, bool);
 
22264
 bool aarch64_regno_ok_for_base_p (int, bool);
 
22265
 bool aarch64_regno_ok_for_index_p (int, bool);
 
22266
 bool aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode);
 
22267
 bool aarch64_simd_imm_zero_p (rtx, enum machine_mode);
 
22268
+bool aarch64_simd_scalar_immediate_valid_for_move (rtx, enum machine_mode);
 
22269
 bool aarch64_simd_shift_imm_p (rtx, enum machine_mode, bool);
 
22270
+bool aarch64_simd_valid_immediate (rtx, enum machine_mode, bool,
 
22271
+                                  struct simd_immediate_info *);
 
22272
 bool aarch64_symbolic_address_p (rtx);
 
22273
-bool aarch64_symbolic_constant_p (rtx, enum aarch64_symbol_context,
 
22274
-                                 enum aarch64_symbol_type *);
 
22275
 bool aarch64_uimm12_shift (HOST_WIDE_INT);
 
22276
 const char *aarch64_output_casesi (rtx *);
 
22277
 enum aarch64_symbol_type aarch64_classify_symbol (rtx,
 
22278
@@ -165,9 +204,6 @@
 
22279
 int aarch64_hard_regno_mode_ok (unsigned, enum machine_mode);
 
22280
 int aarch64_hard_regno_nregs (unsigned, enum machine_mode);
 
22281
 int aarch64_simd_attr_length_move (rtx);
 
22282
-int aarch64_simd_immediate_valid_for_move (rtx, enum machine_mode, rtx *,
 
22283
-                                          int *, unsigned char *, int *,
 
22284
-                                          int *);
 
22285
 int aarch64_uxt_size (int, HOST_WIDE_INT);
 
22286
 rtx aarch64_final_eh_return_addr (void);
 
22287
 rtx aarch64_legitimize_reload_address (rtx *, enum machine_mode, int, int, int);
 
22288
@@ -177,6 +213,7 @@
 
22289
 bool aarch64_simd_mem_operand_p (rtx);
 
22290
 rtx aarch64_simd_vect_par_cnst_half (enum machine_mode, bool);
 
22291
 rtx aarch64_tls_get_addr (void);
 
22292
+tree aarch64_fold_builtin (tree, int, tree *, bool);
 
22293
 unsigned aarch64_dbx_register_number (unsigned);
 
22294
 unsigned aarch64_trampoline_size (void);
 
22295
 void aarch64_asm_output_labelref (FILE *, const char *);
 
22296
@@ -216,6 +253,10 @@
 
22297
 
 
22298
 bool aarch64_split_128bit_move_p (rtx, rtx);
 
22299
 
 
22300
+void aarch64_split_simd_combine (rtx, rtx, rtx);
 
22301
+
 
22302
+void aarch64_split_simd_move (rtx, rtx);
 
22303
+
 
22304
 /* Check for a legitimate floating point constant for FMOV.  */
 
22305
 bool aarch64_float_const_representable_p (rtx);
 
22306
 
 
22307
@@ -249,6 +290,4 @@
 
22308
 extern void aarch64_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
 
22309
 extern bool
 
22310
 aarch64_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
 
22311
-
 
22312
-char* aarch64_output_simd_mov_immediate (rtx *, enum machine_mode, unsigned);
 
22313
 #endif /* GCC_AARCH64_PROTOS_H */
 
22314
--- a/src/gcc/config/aarch64/aarch64-simd-builtins.def
 
22315
+++ b/src/gcc/config/aarch64/aarch64-simd-builtins.def
 
22316
@@ -18,248 +18,344 @@
 
22317
    along with GCC; see the file COPYING3.  If not see
 
22318
    <http://www.gnu.org/licenses/>.  */
 
22319
 
 
22320
-/* In the list below, the BUILTIN_<ITERATOR> macros should
 
22321
-   correspond to the iterator used to construct the instruction's
 
22322
-   patterns in aarch64-simd.md.  A helpful idiom to follow when
 
22323
-   adding new builtins is to add a line for each pattern in the md
 
22324
-   file.  Thus, ADDP, which has one pattern defined for the VD_BHSI
 
22325
-   iterator, and one for DImode, has two entries below.  */
 
22326
+/* In the list below, the BUILTIN_<ITERATOR> macros expand to create
 
22327
+   builtins for each of the modes described by <ITERATOR>.  When adding
 
22328
+   new builtins to this list, a helpful idiom to follow is to add
 
22329
+   a line for each pattern in the md file.  Thus, ADDP, which has one
 
22330
+   pattern defined for the VD_BHSI iterator, and one for DImode, has two
 
22331
+   entries below.
 
22332
 
 
22333
-  BUILTIN_VD_RE (CREATE, create)
 
22334
-  BUILTIN_VQ_S (GETLANE, get_lane_signed)
 
22335
-  BUILTIN_VDQ (GETLANE, get_lane_unsigned)
 
22336
-  BUILTIN_VDQF (GETLANE, get_lane)
 
22337
-  VAR1 (GETLANE, get_lane, di)
 
22338
-  BUILTIN_VDC (COMBINE, combine)
 
22339
-  BUILTIN_VB (BINOP, pmul)
 
22340
-  BUILTIN_VDQF (UNOP, sqrt)
 
22341
-  BUILTIN_VD_BHSI (BINOP, addp)
 
22342
-  VAR1 (UNOP, addp, di)
 
22343
+   Parameter 1 is the 'type' of the intrinsic.  This is used to
 
22344
+   describe the type modifiers (for example; unsigned) applied to
 
22345
+   each of the parameters to the intrinsic function.
 
22346
 
 
22347
-  BUILTIN_VD_RE (REINTERP, reinterpretdi)
 
22348
-  BUILTIN_VDC (REINTERP, reinterpretv8qi)
 
22349
-  BUILTIN_VDC (REINTERP, reinterpretv4hi)
 
22350
-  BUILTIN_VDC (REINTERP, reinterpretv2si)
 
22351
-  BUILTIN_VDC (REINTERP, reinterpretv2sf)
 
22352
-  BUILTIN_VQ (REINTERP, reinterpretv16qi)
 
22353
-  BUILTIN_VQ (REINTERP, reinterpretv8hi)
 
22354
-  BUILTIN_VQ (REINTERP, reinterpretv4si)
 
22355
-  BUILTIN_VQ (REINTERP, reinterpretv4sf)
 
22356
-  BUILTIN_VQ (REINTERP, reinterpretv2di)
 
22357
-  BUILTIN_VQ (REINTERP, reinterpretv2df)
 
22358
+   Parameter 2 is the name of the intrinsic.  This is appended
 
22359
+   to `__builtin_aarch64_<name><mode>` to give the intrinsic name
 
22360
+   as exported to the front-ends.
 
22361
 
 
22362
-  BUILTIN_VDQ_I (BINOP, dup_lane)
 
22363
-  BUILTIN_SDQ_I (BINOP, dup_lane)
 
22364
+   Parameter 3 describes how to map from the name to the CODE_FOR_
 
22365
+   macro holding the RTL pattern for the intrinsic.  This mapping is:
 
22366
+   0 - CODE_FOR_aarch64_<name><mode>
 
22367
+   1-9 - CODE_FOR_<name><mode><1-9>
 
22368
+   10 - CODE_FOR_<name><mode>.  */
 
22369
+
 
22370
+  BUILTIN_VD_RE (CREATE, create, 0)
 
22371
+  BUILTIN_VDC (COMBINE, combine, 0)
 
22372
+  BUILTIN_VB (BINOP, pmul, 0)
 
22373
+  BUILTIN_VDQF (UNOP, sqrt, 2)
 
22374
+  BUILTIN_VD_BHSI (BINOP, addp, 0)
 
22375
+  VAR1 (UNOP, addp, 0, di)
 
22376
+  VAR1 (UNOP, clz, 2, v4si)
 
22377
+
 
22378
+  BUILTIN_VALL (GETLANE, get_lane, 0)
 
22379
+  VAR1 (GETLANE, get_lane, 0, di)
 
22380
+
 
22381
+  BUILTIN_VD_RE (REINTERP, reinterpretdi, 0)
 
22382
+  BUILTIN_VDC (REINTERP, reinterpretv8qi, 0)
 
22383
+  BUILTIN_VDC (REINTERP, reinterpretv4hi, 0)
 
22384
+  BUILTIN_VDC (REINTERP, reinterpretv2si, 0)
 
22385
+  BUILTIN_VDC (REINTERP, reinterpretv2sf, 0)
 
22386
+  BUILTIN_VQ (REINTERP, reinterpretv16qi, 0)
 
22387
+  BUILTIN_VQ (REINTERP, reinterpretv8hi, 0)
 
22388
+  BUILTIN_VQ (REINTERP, reinterpretv4si, 0)
 
22389
+  BUILTIN_VQ (REINTERP, reinterpretv4sf, 0)
 
22390
+  BUILTIN_VQ (REINTERP, reinterpretv2di, 0)
 
22391
+  BUILTIN_VQ (REINTERP, reinterpretv2df, 0)
 
22392
+
 
22393
+  BUILTIN_VDQ_I (BINOP, dup_lane, 0)
 
22394
   /* Implemented by aarch64_<sur>q<r>shl<mode>.  */
 
22395
-  BUILTIN_VSDQ_I (BINOP, sqshl)
 
22396
-  BUILTIN_VSDQ_I (BINOP, uqshl)
 
22397
-  BUILTIN_VSDQ_I (BINOP, sqrshl)
 
22398
-  BUILTIN_VSDQ_I (BINOP, uqrshl)
 
22399
+  BUILTIN_VSDQ_I (BINOP, sqshl, 0)
 
22400
+  BUILTIN_VSDQ_I (BINOP, uqshl, 0)
 
22401
+  BUILTIN_VSDQ_I (BINOP, sqrshl, 0)
 
22402
+  BUILTIN_VSDQ_I (BINOP, uqrshl, 0)
 
22403
   /* Implemented by aarch64_<su_optab><optab><mode>.  */
 
22404
-  BUILTIN_VSDQ_I (BINOP, sqadd)
 
22405
-  BUILTIN_VSDQ_I (BINOP, uqadd)
 
22406
-  BUILTIN_VSDQ_I (BINOP, sqsub)
 
22407
-  BUILTIN_VSDQ_I (BINOP, uqsub)
 
22408
+  BUILTIN_VSDQ_I (BINOP, sqadd, 0)
 
22409
+  BUILTIN_VSDQ_I (BINOP, uqadd, 0)
 
22410
+  BUILTIN_VSDQ_I (BINOP, sqsub, 0)
 
22411
+  BUILTIN_VSDQ_I (BINOP, uqsub, 0)
 
22412
   /* Implemented by aarch64_<sur>qadd<mode>.  */
 
22413
-  BUILTIN_VSDQ_I (BINOP, suqadd)
 
22414
-  BUILTIN_VSDQ_I (BINOP, usqadd)
 
22415
+  BUILTIN_VSDQ_I (BINOP, suqadd, 0)
 
22416
+  BUILTIN_VSDQ_I (BINOP, usqadd, 0)
 
22417
 
 
22418
   /* Implemented by aarch64_get_dreg<VSTRUCT:mode><VDC:mode>.  */
 
22419
-  BUILTIN_VDC (GETLANE, get_dregoi)
 
22420
-  BUILTIN_VDC (GETLANE, get_dregci)
 
22421
-  BUILTIN_VDC (GETLANE, get_dregxi)
 
22422
+  BUILTIN_VDC (GETLANE, get_dregoi, 0)
 
22423
+  BUILTIN_VDC (GETLANE, get_dregci, 0)
 
22424
+  BUILTIN_VDC (GETLANE, get_dregxi, 0)
 
22425
   /* Implemented by aarch64_get_qreg<VSTRUCT:mode><VQ:mode>.  */
 
22426
-  BUILTIN_VQ (GETLANE, get_qregoi)
 
22427
-  BUILTIN_VQ (GETLANE, get_qregci)
 
22428
-  BUILTIN_VQ (GETLANE, get_qregxi)
 
22429
+  BUILTIN_VQ (GETLANE, get_qregoi, 0)
 
22430
+  BUILTIN_VQ (GETLANE, get_qregci, 0)
 
22431
+  BUILTIN_VQ (GETLANE, get_qregxi, 0)
 
22432
   /* Implemented by aarch64_set_qreg<VSTRUCT:mode><VQ:mode>.  */
 
22433
-  BUILTIN_VQ (SETLANE, set_qregoi)
 
22434
-  BUILTIN_VQ (SETLANE, set_qregci)
 
22435
-  BUILTIN_VQ (SETLANE, set_qregxi)
 
22436
+  BUILTIN_VQ (SETLANE, set_qregoi, 0)
 
22437
+  BUILTIN_VQ (SETLANE, set_qregci, 0)
 
22438
+  BUILTIN_VQ (SETLANE, set_qregxi, 0)
 
22439
   /* Implemented by aarch64_ld<VSTRUCT:nregs><VDC:mode>.  */
 
22440
-  BUILTIN_VDC (LOADSTRUCT, ld2)
 
22441
-  BUILTIN_VDC (LOADSTRUCT, ld3)
 
22442
-  BUILTIN_VDC (LOADSTRUCT, ld4)
 
22443
+  BUILTIN_VDC (LOADSTRUCT, ld2, 0)
 
22444
+  BUILTIN_VDC (LOADSTRUCT, ld3, 0)
 
22445
+  BUILTIN_VDC (LOADSTRUCT, ld4, 0)
 
22446
   /* Implemented by aarch64_ld<VSTRUCT:nregs><VQ:mode>.  */
 
22447
-  BUILTIN_VQ (LOADSTRUCT, ld2)
 
22448
-  BUILTIN_VQ (LOADSTRUCT, ld3)
 
22449
-  BUILTIN_VQ (LOADSTRUCT, ld4)
 
22450
+  BUILTIN_VQ (LOADSTRUCT, ld2, 0)
 
22451
+  BUILTIN_VQ (LOADSTRUCT, ld3, 0)
 
22452
+  BUILTIN_VQ (LOADSTRUCT, ld4, 0)
 
22453
   /* Implemented by aarch64_st<VSTRUCT:nregs><VDC:mode>.  */
 
22454
-  BUILTIN_VDC (STORESTRUCT, st2)
 
22455
-  BUILTIN_VDC (STORESTRUCT, st3)
 
22456
-  BUILTIN_VDC (STORESTRUCT, st4)
 
22457
+  BUILTIN_VDC (STORESTRUCT, st2, 0)
 
22458
+  BUILTIN_VDC (STORESTRUCT, st3, 0)
 
22459
+  BUILTIN_VDC (STORESTRUCT, st4, 0)
 
22460
   /* Implemented by aarch64_st<VSTRUCT:nregs><VQ:mode>.  */
 
22461
-  BUILTIN_VQ (STORESTRUCT, st2)
 
22462
-  BUILTIN_VQ (STORESTRUCT, st3)
 
22463
-  BUILTIN_VQ (STORESTRUCT, st4)
 
22464
+  BUILTIN_VQ (STORESTRUCT, st2, 0)
 
22465
+  BUILTIN_VQ (STORESTRUCT, st3, 0)
 
22466
+  BUILTIN_VQ (STORESTRUCT, st4, 0)
 
22467
 
 
22468
-  BUILTIN_VQW (BINOP, saddl2)
 
22469
-  BUILTIN_VQW (BINOP, uaddl2)
 
22470
-  BUILTIN_VQW (BINOP, ssubl2)
 
22471
-  BUILTIN_VQW (BINOP, usubl2)
 
22472
-  BUILTIN_VQW (BINOP, saddw2)
 
22473
-  BUILTIN_VQW (BINOP, uaddw2)
 
22474
-  BUILTIN_VQW (BINOP, ssubw2)
 
22475
-  BUILTIN_VQW (BINOP, usubw2)
 
22476
+  BUILTIN_VQW (BINOP, saddl2, 0)
 
22477
+  BUILTIN_VQW (BINOP, uaddl2, 0)
 
22478
+  BUILTIN_VQW (BINOP, ssubl2, 0)
 
22479
+  BUILTIN_VQW (BINOP, usubl2, 0)
 
22480
+  BUILTIN_VQW (BINOP, saddw2, 0)
 
22481
+  BUILTIN_VQW (BINOP, uaddw2, 0)
 
22482
+  BUILTIN_VQW (BINOP, ssubw2, 0)
 
22483
+  BUILTIN_VQW (BINOP, usubw2, 0)
 
22484
   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>l<mode>.  */
 
22485
-  BUILTIN_VDW (BINOP, saddl)
 
22486
-  BUILTIN_VDW (BINOP, uaddl)
 
22487
-  BUILTIN_VDW (BINOP, ssubl)
 
22488
-  BUILTIN_VDW (BINOP, usubl)
 
22489
+  BUILTIN_VDW (BINOP, saddl, 0)
 
22490
+  BUILTIN_VDW (BINOP, uaddl, 0)
 
22491
+  BUILTIN_VDW (BINOP, ssubl, 0)
 
22492
+  BUILTIN_VDW (BINOP, usubl, 0)
 
22493
   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>w<mode>.  */
 
22494
-  BUILTIN_VDW (BINOP, saddw)
 
22495
-  BUILTIN_VDW (BINOP, uaddw)
 
22496
-  BUILTIN_VDW (BINOP, ssubw)
 
22497
-  BUILTIN_VDW (BINOP, usubw)
 
22498
+  BUILTIN_VDW (BINOP, saddw, 0)
 
22499
+  BUILTIN_VDW (BINOP, uaddw, 0)
 
22500
+  BUILTIN_VDW (BINOP, ssubw, 0)
 
22501
+  BUILTIN_VDW (BINOP, usubw, 0)
 
22502
   /* Implemented by aarch64_<sur>h<addsub><mode>.  */
 
22503
-  BUILTIN_VQ_S (BINOP, shadd)
 
22504
-  BUILTIN_VQ_S (BINOP, uhadd)
 
22505
-  BUILTIN_VQ_S (BINOP, srhadd)
 
22506
-  BUILTIN_VQ_S (BINOP, urhadd)
 
22507
+  BUILTIN_VQ_S (BINOP, shadd, 0)
 
22508
+  BUILTIN_VQ_S (BINOP, uhadd, 0)
 
22509
+  BUILTIN_VQ_S (BINOP, srhadd, 0)
 
22510
+  BUILTIN_VQ_S (BINOP, urhadd, 0)
 
22511
   /* Implemented by aarch64_<sur><addsub>hn<mode>.  */
 
22512
-  BUILTIN_VQN (BINOP, addhn)
 
22513
-  BUILTIN_VQN (BINOP, raddhn)
 
22514
+  BUILTIN_VQN (BINOP, addhn, 0)
 
22515
+  BUILTIN_VQN (BINOP, raddhn, 0)
 
22516
   /* Implemented by aarch64_<sur><addsub>hn2<mode>.  */
 
22517
-  BUILTIN_VQN (TERNOP, addhn2)
 
22518
-  BUILTIN_VQN (TERNOP, raddhn2)
 
22519
+  BUILTIN_VQN (TERNOP, addhn2, 0)
 
22520
+  BUILTIN_VQN (TERNOP, raddhn2, 0)
 
22521
 
 
22522
-  BUILTIN_VSQN_HSDI (UNOP, sqmovun)
 
22523
+  BUILTIN_VSQN_HSDI (UNOP, sqmovun, 0)
 
22524
   /* Implemented by aarch64_<sur>qmovn<mode>.  */
 
22525
-  BUILTIN_VSQN_HSDI (UNOP, sqmovn)
 
22526
-  BUILTIN_VSQN_HSDI (UNOP, uqmovn)
 
22527
+  BUILTIN_VSQN_HSDI (UNOP, sqmovn, 0)
 
22528
+  BUILTIN_VSQN_HSDI (UNOP, uqmovn, 0)
 
22529
   /* Implemented by aarch64_s<optab><mode>.  */
 
22530
-  BUILTIN_VSDQ_I_BHSI (UNOP, sqabs)
 
22531
-  BUILTIN_VSDQ_I_BHSI (UNOP, sqneg)
 
22532
+  BUILTIN_VSDQ_I_BHSI (UNOP, sqabs, 0)
 
22533
+  BUILTIN_VSDQ_I_BHSI (UNOP, sqneg, 0)
 
22534
 
 
22535
-  BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane)
 
22536
-  BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane)
 
22537
-  BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq)
 
22538
-  BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq)
 
22539
-  BUILTIN_VQ_HSI (TERNOP, sqdmlal2)
 
22540
-  BUILTIN_VQ_HSI (TERNOP, sqdmlsl2)
 
22541
-  BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane)
 
22542
-  BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane)
 
22543
-  BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq)
 
22544
-  BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq)
 
22545
-  BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n)
 
22546
-  BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n)
 
22547
+  BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane, 0)
 
22548
+  BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane, 0)
 
22549
+  BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq, 0)
 
22550
+  BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq, 0)
 
22551
+  BUILTIN_VQ_HSI (TERNOP, sqdmlal2, 0)
 
22552
+  BUILTIN_VQ_HSI (TERNOP, sqdmlsl2, 0)
 
22553
+  BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane, 0)
 
22554
+  BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane, 0)
 
22555
+  BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq, 0)
 
22556
+  BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq, 0)
 
22557
+  BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n, 0)
 
22558
+  BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n, 0)
 
22559
   /* Implemented by aarch64_sqdml<SBINQOPS:as>l<mode>.  */
 
22560
-  BUILTIN_VSD_HSI (TERNOP, sqdmlal)
 
22561
-  BUILTIN_VSD_HSI (TERNOP, sqdmlsl)
 
22562
+  BUILTIN_VSD_HSI (TERNOP, sqdmlal, 0)
 
22563
+  BUILTIN_VSD_HSI (TERNOP, sqdmlsl, 0)
 
22564
   /* Implemented by aarch64_sqdml<SBINQOPS:as>l_n<mode>.  */
 
22565
-  BUILTIN_VD_HSI (TERNOP, sqdmlal_n)
 
22566
-  BUILTIN_VD_HSI (TERNOP, sqdmlsl_n)
 
22567
+  BUILTIN_VD_HSI (TERNOP, sqdmlal_n, 0)
 
22568
+  BUILTIN_VD_HSI (TERNOP, sqdmlsl_n, 0)
 
22569
 
 
22570
-  BUILTIN_VSD_HSI (BINOP, sqdmull)
 
22571
-  BUILTIN_VSD_HSI (TERNOP, sqdmull_lane)
 
22572
-  BUILTIN_VD_HSI (TERNOP, sqdmull_laneq)
 
22573
-  BUILTIN_VD_HSI (BINOP, sqdmull_n)
 
22574
-  BUILTIN_VQ_HSI (BINOP, sqdmull2)
 
22575
-  BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane)
 
22576
-  BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq)
 
22577
-  BUILTIN_VQ_HSI (BINOP, sqdmull2_n)
 
22578
+  BUILTIN_VSD_HSI (BINOP, sqdmull, 0)
 
22579
+  BUILTIN_VSD_HSI (TERNOP, sqdmull_lane, 0)
 
22580
+  BUILTIN_VD_HSI (TERNOP, sqdmull_laneq, 0)
 
22581
+  BUILTIN_VD_HSI (BINOP, sqdmull_n, 0)
 
22582
+  BUILTIN_VQ_HSI (BINOP, sqdmull2, 0)
 
22583
+  BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane, 0)
 
22584
+  BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq, 0)
 
22585
+  BUILTIN_VQ_HSI (BINOP, sqdmull2_n, 0)
 
22586
   /* Implemented by aarch64_sq<r>dmulh<mode>.  */
 
22587
-  BUILTIN_VSDQ_HSI (BINOP, sqdmulh)
 
22588
-  BUILTIN_VSDQ_HSI (BINOP, sqrdmulh)
 
22589
+  BUILTIN_VSDQ_HSI (BINOP, sqdmulh, 0)
 
22590
+  BUILTIN_VSDQ_HSI (BINOP, sqrdmulh, 0)
 
22591
   /* Implemented by aarch64_sq<r>dmulh_lane<q><mode>.  */
 
22592
-  BUILTIN_VDQHS (TERNOP, sqdmulh_lane)
 
22593
-  BUILTIN_VDQHS (TERNOP, sqdmulh_laneq)
 
22594
-  BUILTIN_VDQHS (TERNOP, sqrdmulh_lane)
 
22595
-  BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq)
 
22596
-  BUILTIN_SD_HSI (TERNOP, sqdmulh_lane)
 
22597
-  BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane)
 
22598
+  BUILTIN_VDQHS (TERNOP, sqdmulh_lane, 0)
 
22599
+  BUILTIN_VDQHS (TERNOP, sqdmulh_laneq, 0)
 
22600
+  BUILTIN_VDQHS (TERNOP, sqrdmulh_lane, 0)
 
22601
+  BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq, 0)
 
22602
+  BUILTIN_SD_HSI (TERNOP, sqdmulh_lane, 0)
 
22603
+  BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane, 0)
 
22604
 
 
22605
-  BUILTIN_VSDQ_I_DI (BINOP, sshl_n)
 
22606
-  BUILTIN_VSDQ_I_DI (BINOP, ushl_n)
 
22607
+  BUILTIN_VSDQ_I_DI (BINOP, ashl, 3)
 
22608
   /* Implemented by aarch64_<sur>shl<mode>.  */
 
22609
-  BUILTIN_VSDQ_I_DI (BINOP, sshl)
 
22610
-  BUILTIN_VSDQ_I_DI (BINOP, ushl)
 
22611
-  BUILTIN_VSDQ_I_DI (BINOP, srshl)
 
22612
-  BUILTIN_VSDQ_I_DI (BINOP, urshl)
 
22613
+  BUILTIN_VSDQ_I_DI (BINOP, sshl, 0)
 
22614
+  BUILTIN_VSDQ_I_DI (BINOP, ushl, 0)
 
22615
+  BUILTIN_VSDQ_I_DI (BINOP, srshl, 0)
 
22616
+  BUILTIN_VSDQ_I_DI (BINOP, urshl, 0)
 
22617
 
 
22618
-  BUILTIN_VSDQ_I_DI (SHIFTIMM, sshr_n)
 
22619
-  BUILTIN_VSDQ_I_DI (SHIFTIMM, ushr_n)
 
22620
+  BUILTIN_VSDQ_I_DI (SHIFTIMM, ashr, 3)
 
22621
+  BUILTIN_VSDQ_I_DI (SHIFTIMM, lshr, 3)
 
22622
   /* Implemented by aarch64_<sur>shr_n<mode>.  */
 
22623
-  BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n)
 
22624
-  BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n)
 
22625
+  BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n, 0)
 
22626
+  BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n, 0)
 
22627
   /* Implemented by aarch64_<sur>sra_n<mode>.  */
 
22628
-  BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n)
 
22629
-  BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n)
 
22630
-  BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n)
 
22631
-  BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n)
 
22632
+  BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n, 0)
 
22633
+  BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n, 0)
 
22634
+  BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n, 0)
 
22635
+  BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n, 0)
 
22636
   /* Implemented by aarch64_<sur>shll_n<mode>.  */
 
22637
-  BUILTIN_VDW (SHIFTIMM, sshll_n)
 
22638
-  BUILTIN_VDW (SHIFTIMM, ushll_n)
 
22639
+  BUILTIN_VDW (SHIFTIMM, sshll_n, 0)
 
22640
+  BUILTIN_VDW (SHIFTIMM, ushll_n, 0)
 
22641
   /* Implemented by aarch64_<sur>shll2_n<mode>.  */
 
22642
-  BUILTIN_VQW (SHIFTIMM, sshll2_n)
 
22643
-  BUILTIN_VQW (SHIFTIMM, ushll2_n)
 
22644
+  BUILTIN_VQW (SHIFTIMM, sshll2_n, 0)
 
22645
+  BUILTIN_VQW (SHIFTIMM, ushll2_n, 0)
 
22646
   /* Implemented by aarch64_<sur>q<r>shr<u>n_n<mode>.  */
 
22647
-  BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n)
 
22648
-  BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n)
 
22649
-  BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n)
 
22650
-  BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n)
 
22651
-  BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n)
 
22652
-  BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n)
 
22653
+  BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n, 0)
 
22654
+  BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n, 0)
 
22655
+  BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n, 0)
 
22656
+  BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n, 0)
 
22657
+  BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n, 0)
 
22658
+  BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n, 0)
 
22659
   /* Implemented by aarch64_<sur>s<lr>i_n<mode>.  */
 
22660
-  BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n)
 
22661
-  BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n)
 
22662
-  BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n)
 
22663
-  BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n)
 
22664
+  BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n, 0)
 
22665
+  BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n, 0)
 
22666
+  BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n, 0)
 
22667
+  BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n, 0)
 
22668
   /* Implemented by aarch64_<sur>qshl<u>_n<mode>.  */
 
22669
-  BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n)
 
22670
-  BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n)
 
22671
-  BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n)
 
22672
+  BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n, 0)
 
22673
+  BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n, 0)
 
22674
+  BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n, 0)
 
22675
 
 
22676
   /* Implemented by aarch64_cm<cmp><mode>.  */
 
22677
-  BUILTIN_VSDQ_I_DI (BINOP, cmeq)
 
22678
-  BUILTIN_VSDQ_I_DI (BINOP, cmge)
 
22679
-  BUILTIN_VSDQ_I_DI (BINOP, cmgt)
 
22680
-  BUILTIN_VSDQ_I_DI (BINOP, cmle)
 
22681
-  BUILTIN_VSDQ_I_DI (BINOP, cmlt)
 
22682
+  BUILTIN_VALLDI (BINOP, cmeq, 0)
 
22683
+  BUILTIN_VALLDI (BINOP, cmge, 0)
 
22684
+  BUILTIN_VALLDI (BINOP, cmgt, 0)
 
22685
+  BUILTIN_VALLDI (BINOP, cmle, 0)
 
22686
+  BUILTIN_VALLDI (BINOP, cmlt, 0)
 
22687
   /* Implemented by aarch64_cm<cmp><mode>.  */
 
22688
-  BUILTIN_VSDQ_I_DI (BINOP, cmhs)
 
22689
-  BUILTIN_VSDQ_I_DI (BINOP, cmhi)
 
22690
-  BUILTIN_VSDQ_I_DI (BINOP, cmtst)
 
22691
+  BUILTIN_VSDQ_I_DI (BINOP, cmgeu, 0)
 
22692
+  BUILTIN_VSDQ_I_DI (BINOP, cmgtu, 0)
 
22693
+  BUILTIN_VSDQ_I_DI (BINOP, cmtst, 0)
 
22694
 
 
22695
-  /* Implemented by aarch64_<fmaxmin><mode>.  */
 
22696
-  BUILTIN_VDQF (BINOP, fmax)
 
22697
-  BUILTIN_VDQF (BINOP, fmin)
 
22698
-  /* Implemented by aarch64_<maxmin><mode>.  */
 
22699
-  BUILTIN_VDQ_BHSI (BINOP, smax)
 
22700
-  BUILTIN_VDQ_BHSI (BINOP, smin)
 
22701
-  BUILTIN_VDQ_BHSI (BINOP, umax)
 
22702
-  BUILTIN_VDQ_BHSI (BINOP, umin)
 
22703
+  /* Implemented by reduc_<sur>plus_<mode>.  */
 
22704
+  BUILTIN_VALL (UNOP, reduc_splus_, 10)
 
22705
+  BUILTIN_VDQ (UNOP, reduc_uplus_, 10)
 
22706
 
 
22707
-  /* Implemented by aarch64_frint<frint_suffix><mode>.  */
 
22708
-  BUILTIN_VDQF (UNOP, frintz)
 
22709
-  BUILTIN_VDQF (UNOP, frintp)
 
22710
-  BUILTIN_VDQF (UNOP, frintm)
 
22711
-  BUILTIN_VDQF (UNOP, frinti)
 
22712
-  BUILTIN_VDQF (UNOP, frintx)
 
22713
-  BUILTIN_VDQF (UNOP, frinta)
 
22714
+  /* Implemented by reduc_<maxmin_uns>_<mode>.  */
 
22715
+  BUILTIN_VDQIF (UNOP, reduc_smax_, 10)
 
22716
+  BUILTIN_VDQIF (UNOP, reduc_smin_, 10)
 
22717
+  BUILTIN_VDQ_BHSI (UNOP, reduc_umax_, 10)
 
22718
+  BUILTIN_VDQ_BHSI (UNOP, reduc_umin_, 10)
 
22719
+  BUILTIN_VDQF (UNOP, reduc_smax_nan_, 10)
 
22720
+  BUILTIN_VDQF (UNOP, reduc_smin_nan_, 10)
 
22721
 
 
22722
-  /* Implemented by aarch64_fcvt<frint_suffix><su><mode>.  */
 
22723
-  BUILTIN_VDQF (UNOP, fcvtzs)
 
22724
-  BUILTIN_VDQF (UNOP, fcvtzu)
 
22725
-  BUILTIN_VDQF (UNOP, fcvtas)
 
22726
-  BUILTIN_VDQF (UNOP, fcvtau)
 
22727
-  BUILTIN_VDQF (UNOP, fcvtps)
 
22728
-  BUILTIN_VDQF (UNOP, fcvtpu)
 
22729
-  BUILTIN_VDQF (UNOP, fcvtms)
 
22730
-  BUILTIN_VDQF (UNOP, fcvtmu)
 
22731
+  /* Implemented by <maxmin><mode>3.
 
22732
+     smax variants map to fmaxnm,
 
22733
+     smax_nan variants map to fmax.  */
 
22734
+  BUILTIN_VDQIF (BINOP, smax, 3)
 
22735
+  BUILTIN_VDQIF (BINOP, smin, 3)
 
22736
+  BUILTIN_VDQ_BHSI (BINOP, umax, 3)
 
22737
+  BUILTIN_VDQ_BHSI (BINOP, umin, 3)
 
22738
+  BUILTIN_VDQF (BINOP, smax_nan, 3)
 
22739
+  BUILTIN_VDQF (BINOP, smin_nan, 3)
 
22740
 
 
22741
+  /* Implemented by <frint_pattern><mode>2.  */
 
22742
+  BUILTIN_VDQF (UNOP, btrunc, 2)
 
22743
+  BUILTIN_VDQF (UNOP, ceil, 2)
 
22744
+  BUILTIN_VDQF (UNOP, floor, 2)
 
22745
+  BUILTIN_VDQF (UNOP, nearbyint, 2)
 
22746
+  BUILTIN_VDQF (UNOP, rint, 2)
 
22747
+  BUILTIN_VDQF (UNOP, round, 2)
 
22748
+  BUILTIN_VDQF (UNOP, frintn, 2)
 
22749
+
 
22750
+  /* Implemented by l<fcvt_pattern><su_optab><VQDF:mode><vcvt_target>2.  */
 
22751
+  VAR1 (UNOP, lbtruncv2sf, 2, v2si)
 
22752
+  VAR1 (UNOP, lbtruncv4sf, 2, v4si)
 
22753
+  VAR1 (UNOP, lbtruncv2df, 2, v2di)
 
22754
+
 
22755
+  VAR1 (UNOP, lbtruncuv2sf, 2, v2si)
 
22756
+  VAR1 (UNOP, lbtruncuv4sf, 2, v4si)
 
22757
+  VAR1 (UNOP, lbtruncuv2df, 2, v2di)
 
22758
+
 
22759
+  VAR1 (UNOP, lroundv2sf, 2, v2si)
 
22760
+  VAR1 (UNOP, lroundv4sf, 2, v4si)
 
22761
+  VAR1 (UNOP, lroundv2df, 2, v2di)
 
22762
+  /* Implemented by l<fcvt_pattern><su_optab><GPF:mode><GPI:mode>2.  */
 
22763
+  VAR1 (UNOP, lroundsf, 2, si)
 
22764
+  VAR1 (UNOP, lrounddf, 2, di)
 
22765
+
 
22766
+  VAR1 (UNOP, lrounduv2sf, 2, v2si)
 
22767
+  VAR1 (UNOP, lrounduv4sf, 2, v4si)
 
22768
+  VAR1 (UNOP, lrounduv2df, 2, v2di)
 
22769
+  VAR1 (UNOP, lroundusf, 2, si)
 
22770
+  VAR1 (UNOP, lroundudf, 2, di)
 
22771
+
 
22772
+  VAR1 (UNOP, lceilv2sf, 2, v2si)
 
22773
+  VAR1 (UNOP, lceilv4sf, 2, v4si)
 
22774
+  VAR1 (UNOP, lceilv2df, 2, v2di)
 
22775
+
 
22776
+  VAR1 (UNOP, lceiluv2sf, 2, v2si)
 
22777
+  VAR1 (UNOP, lceiluv4sf, 2, v4si)
 
22778
+  VAR1 (UNOP, lceiluv2df, 2, v2di)
 
22779
+  VAR1 (UNOP, lceilusf, 2, si)
 
22780
+  VAR1 (UNOP, lceiludf, 2, di)
 
22781
+
 
22782
+  VAR1 (UNOP, lfloorv2sf, 2, v2si)
 
22783
+  VAR1 (UNOP, lfloorv4sf, 2, v4si)
 
22784
+  VAR1 (UNOP, lfloorv2df, 2, v2di)
 
22785
+
 
22786
+  VAR1 (UNOP, lflooruv2sf, 2, v2si)
 
22787
+  VAR1 (UNOP, lflooruv4sf, 2, v4si)
 
22788
+  VAR1 (UNOP, lflooruv2df, 2, v2di)
 
22789
+  VAR1 (UNOP, lfloorusf, 2, si)
 
22790
+  VAR1 (UNOP, lfloorudf, 2, di)
 
22791
+
 
22792
+  VAR1 (UNOP, lfrintnv2sf, 2, v2si)
 
22793
+  VAR1 (UNOP, lfrintnv4sf, 2, v4si)
 
22794
+  VAR1 (UNOP, lfrintnv2df, 2, v2di)
 
22795
+  VAR1 (UNOP, lfrintnsf, 2, si)
 
22796
+  VAR1 (UNOP, lfrintndf, 2, di)
 
22797
+
 
22798
+  VAR1 (UNOP, lfrintnuv2sf, 2, v2si)
 
22799
+  VAR1 (UNOP, lfrintnuv4sf, 2, v4si)
 
22800
+  VAR1 (UNOP, lfrintnuv2df, 2, v2di)
 
22801
+  VAR1 (UNOP, lfrintnusf, 2, si)
 
22802
+  VAR1 (UNOP, lfrintnudf, 2, di)
 
22803
+
 
22804
+  /* Implemented by <optab><fcvt_target><VDQF:mode>2.  */
 
22805
+  VAR1 (UNOP, floatv2si, 2, v2sf)
 
22806
+  VAR1 (UNOP, floatv4si, 2, v4sf)
 
22807
+  VAR1 (UNOP, floatv2di, 2, v2df)
 
22808
+
 
22809
+  VAR1 (UNOP, floatunsv2si, 2, v2sf)
 
22810
+  VAR1 (UNOP, floatunsv4si, 2, v4sf)
 
22811
+  VAR1 (UNOP, floatunsv2di, 2, v2df)
 
22812
+
 
22813
   /* Implemented by
 
22814
      aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>.  */
 
22815
-  BUILTIN_VALL (BINOP, zip1)
 
22816
-  BUILTIN_VALL (BINOP, zip2)
 
22817
-  BUILTIN_VALL (BINOP, uzp1)
 
22818
-  BUILTIN_VALL (BINOP, uzp2)
 
22819
-  BUILTIN_VALL (BINOP, trn1)
 
22820
-  BUILTIN_VALL (BINOP, trn2)
 
22821
+  BUILTIN_VALL (BINOP, zip1, 0)
 
22822
+  BUILTIN_VALL (BINOP, zip2, 0)
 
22823
+  BUILTIN_VALL (BINOP, uzp1, 0)
 
22824
+  BUILTIN_VALL (BINOP, uzp2, 0)
 
22825
+  BUILTIN_VALL (BINOP, trn1, 0)
 
22826
+  BUILTIN_VALL (BINOP, trn2, 0)
 
22827
 
 
22828
+  /* Implemented by
 
22829
+     aarch64_frecp<FRECP:frecp_suffix><mode>.  */
 
22830
+  BUILTIN_GPF (UNOP, frecpe, 0)
 
22831
+  BUILTIN_GPF (BINOP, frecps, 0)
 
22832
+  BUILTIN_GPF (UNOP, frecpx, 0)
 
22833
+
 
22834
+  BUILTIN_VDQF (UNOP, frecpe, 0)
 
22835
+  BUILTIN_VDQF (BINOP, frecps, 0)
 
22836
+
 
22837
+  BUILTIN_VALLDI (UNOP, abs, 2)
 
22838
+
 
22839
+  VAR1 (UNOP, vec_unpacks_hi_, 10, v4sf)
 
22840
+  VAR1 (BINOP, float_truncate_hi_, 0, v4sf)
 
22841
+
 
22842
+  VAR1 (UNOP, float_extend_lo_, 0, v2df)
 
22843
+  VAR1 (UNOP, float_truncate_lo_, 0, v2sf)
 
22844
+
 
22845
   /* Implemented by aarch64_ld1<VALL:mode>.  */
 
22846
-  BUILTIN_VALL (LOAD1, ld1)
 
22847
+  BUILTIN_VALL (LOAD1, ld1, 0)
 
22848
 
 
22849
   /* Implemented by aarch64_st1<VALL:mode>.  */
 
22850
-  BUILTIN_VALL (STORE1, st1)
 
22851
+  BUILTIN_VALL (STORE1, st1, 0)
 
22852
 
 
22853
--- a/src/gcc/config/aarch64/constraints.md
 
22854
+++ b/src/gcc/config/aarch64/constraints.md
 
22855
@@ -75,11 +75,6 @@
 
22856
   "Integer constant zero."
 
22857
   (match_test "op == const0_rtx"))
 
22858
 
 
22859
-(define_constraint "Usa"
 
22860
-  "A constraint that matches an absolute symbolic address."
 
22861
-  (and (match_code "const,symbol_ref")
 
22862
-       (match_test "aarch64_symbolic_address_p (op)")))
 
22863
-
 
22864
 (define_constraint "Ush"
 
22865
   "A constraint that matches an absolute symbolic address high part."
 
22866
   (and (match_code "high")
 
22867
@@ -148,10 +143,25 @@
 
22868
   "@internal
 
22869
  A constraint that matches vector of immediates."
 
22870
  (and (match_code "const_vector")
 
22871
-      (match_test "aarch64_simd_immediate_valid_for_move (op, GET_MODE (op),
 
22872
-                                                         NULL, NULL, NULL,
 
22873
-                                                         NULL, NULL) != 0")))
 
22874
+      (match_test "aarch64_simd_valid_immediate (op, GET_MODE (op),
 
22875
+                                                false, NULL)")))
 
22876
 
 
22877
+(define_constraint "Dh"
 
22878
+  "@internal
 
22879
+ A constraint that matches an immediate operand valid for\
 
22880
+ AdvSIMD scalar move in HImode."
 
22881
+ (and (match_code "const_int")
 
22882
+      (match_test "aarch64_simd_scalar_immediate_valid_for_move (op,
 
22883
+                                                HImode)")))
 
22884
+
 
22885
+(define_constraint "Dq"
 
22886
+  "@internal
 
22887
+ A constraint that matches an immediate operand valid for\
 
22888
+ AdvSIMD scalar move in QImode."
 
22889
+ (and (match_code "const_int")
 
22890
+      (match_test "aarch64_simd_scalar_immediate_valid_for_move (op,
 
22891
+                                                QImode)")))
 
22892
+
 
22893
 (define_constraint "Dl"
 
22894
   "@internal
 
22895
  A constraint that matches vector of immediates for left shifts."
 
22896
--- a/src/gcc/config/aarch64/aarch64.c
 
22897
+++ b/src/gcc/config/aarch64/aarch64.c
 
22898
@@ -45,6 +45,8 @@
 
22899
 #include "gimple.h"
 
22900
 #include "optabs.h"
 
22901
 #include "dwarf2.h"
 
22902
+#include "cfgloop.h"
 
22903
+#include "tree-vectorizer.h"
 
22904
 
 
22905
 /* Classifies an address.
 
22906
 
 
22907
@@ -87,6 +89,15 @@
 
22908
   enum aarch64_symbol_type symbol_type;
 
22909
 };
 
22910
 
 
22911
+struct simd_immediate_info
 
22912
+{
 
22913
+  rtx value;
 
22914
+  int shift;
 
22915
+  int element_width;
 
22916
+  bool mvn;
 
22917
+  bool msl;
 
22918
+};
 
22919
+
 
22920
 /* The current code model.  */
 
22921
 enum aarch64_code_model aarch64_cmodel;
 
22922
 
 
22923
@@ -103,8 +114,6 @@
 
22924
 static void aarch64_elf_asm_constructor (rtx, int) ATTRIBUTE_UNUSED;
 
22925
 static void aarch64_elf_asm_destructor (rtx, int) ATTRIBUTE_UNUSED;
 
22926
 static void aarch64_override_options_after_change (void);
 
22927
-static int aarch64_simd_valid_immediate (rtx, enum machine_mode, int, rtx *,
 
22928
-                                        int *, unsigned char *, int *, int *);
 
22929
 static bool aarch64_vector_mode_supported_p (enum machine_mode);
 
22930
 static unsigned bit_count (unsigned HOST_WIDE_INT);
 
22931
 static bool aarch64_const_vec_all_same_int_p (rtx,
 
22932
@@ -178,14 +187,35 @@
 
22933
   NAMED_PARAM (FP2FP, 4)
 
22934
 };
 
22935
 
 
22936
+/* Generic costs for vector insn classes.  */
 
22937
 #if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007
 
22938
 __extension__
 
22939
 #endif
 
22940
+static const struct cpu_vector_cost generic_vector_cost =
 
22941
+{
 
22942
+  NAMED_PARAM (scalar_stmt_cost, 1),
 
22943
+  NAMED_PARAM (scalar_load_cost, 1),
 
22944
+  NAMED_PARAM (scalar_store_cost, 1),
 
22945
+  NAMED_PARAM (vec_stmt_cost, 1),
 
22946
+  NAMED_PARAM (vec_to_scalar_cost, 1),
 
22947
+  NAMED_PARAM (scalar_to_vec_cost, 1),
 
22948
+  NAMED_PARAM (vec_align_load_cost, 1),
 
22949
+  NAMED_PARAM (vec_unalign_load_cost, 1),
 
22950
+  NAMED_PARAM (vec_unalign_store_cost, 1),
 
22951
+  NAMED_PARAM (vec_store_cost, 1),
 
22952
+  NAMED_PARAM (cond_taken_branch_cost, 3),
 
22953
+  NAMED_PARAM (cond_not_taken_branch_cost, 1)
 
22954
+};
 
22955
+
 
22956
+#if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007
 
22957
+__extension__
 
22958
+#endif
 
22959
 static const struct tune_params generic_tunings =
 
22960
 {
 
22961
   &generic_rtx_cost_table,
 
22962
   &generic_addrcost_table,
 
22963
   &generic_regmove_cost,
 
22964
+  &generic_vector_cost,
 
22965
   NAMED_PARAM (memmov_cost, 4)
 
22966
 };
 
22967
 
 
22968
@@ -524,13 +554,15 @@
 
22969
        return;
 
22970
       }
 
22971
 
 
22972
+    case SYMBOL_TINY_ABSOLUTE:
 
22973
+      emit_insn (gen_rtx_SET (Pmode, dest, imm));
 
22974
+      return;
 
22975
+
 
22976
     case SYMBOL_SMALL_GOT:
 
22977
       {
 
22978
        rtx tmp_reg = dest;
 
22979
        if (can_create_pseudo_p ())
 
22980
-         {
 
22981
-           tmp_reg =  gen_reg_rtx (Pmode);
 
22982
-         }
 
22983
+         tmp_reg =  gen_reg_rtx (Pmode);
 
22984
        emit_move_insn (tmp_reg, gen_rtx_HIGH (Pmode, imm));
 
22985
        emit_insn (gen_ldr_got_small (dest, tmp_reg, imm));
 
22986
        return;
 
22987
@@ -604,49 +636,85 @@
 
22988
 {
 
22989
   rtx low_dst;
 
22990
 
 
22991
-  gcc_assert (GET_MODE (dst) == TImode);
 
22992
+  enum machine_mode src_mode = GET_MODE (src);
 
22993
+  enum machine_mode dst_mode = GET_MODE (dst);
 
22994
+  int src_regno = REGNO (src);
 
22995
+  int dst_regno = REGNO (dst);
 
22996
 
 
22997
+  gcc_assert (dst_mode == TImode || dst_mode == TFmode);
 
22998
+
 
22999
   if (REG_P (dst) && REG_P (src))
 
23000
     {
 
23001
-      int src_regno = REGNO (src);
 
23002
-      int dst_regno = REGNO (dst);
 
23003
+      gcc_assert (src_mode == TImode || src_mode == TFmode);
 
23004
 
 
23005
-      gcc_assert (GET_MODE (src) == TImode);
 
23006
-
 
23007
       /* Handle r -> w, w -> r.  */
 
23008
       if (FP_REGNUM_P (dst_regno) && GP_REGNUM_P (src_regno))
 
23009
        {
 
23010
-         emit_insn (gen_aarch64_movtilow_di (dst,
 
23011
-                                             gen_lowpart (word_mode, src)));
 
23012
-         emit_insn (gen_aarch64_movtihigh_di (dst,
 
23013
-                                              gen_highpart (word_mode, src)));
 
23014
-         return;
 
23015
+         switch (src_mode) {
 
23016
+         case TImode:
 
23017
+           emit_insn
 
23018
+             (gen_aarch64_movtilow_di (dst, gen_lowpart (word_mode, src)));
 
23019
+           emit_insn
 
23020
+             (gen_aarch64_movtihigh_di (dst, gen_highpart (word_mode, src)));
 
23021
+           return;
 
23022
+         case TFmode:
 
23023
+           emit_insn
 
23024
+             (gen_aarch64_movtflow_di (dst, gen_lowpart (word_mode, src)));
 
23025
+           emit_insn
 
23026
+             (gen_aarch64_movtfhigh_di (dst, gen_highpart (word_mode, src)));
 
23027
+           return;
 
23028
+         default:
 
23029
+           gcc_unreachable ();
 
23030
+         }
 
23031
        }
 
23032
       else if (GP_REGNUM_P (dst_regno) && FP_REGNUM_P (src_regno))
 
23033
        {
 
23034
-         emit_insn (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst),
 
23035
-                                             src));
 
23036
-         emit_insn (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst),
 
23037
-                                              src));
 
23038
-         return;
 
23039
+         switch (src_mode) {
 
23040
+         case TImode:
 
23041
+           emit_insn
 
23042
+             (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst), src));
 
23043
+           emit_insn
 
23044
+             (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst), src));
 
23045
+           return;
 
23046
+         case TFmode:
 
23047
+           emit_insn
 
23048
+             (gen_aarch64_movdi_tflow (gen_lowpart (word_mode, dst), src));
 
23049
+           emit_insn
 
23050
+             (gen_aarch64_movdi_tfhigh (gen_highpart (word_mode, dst), src));
 
23051
+           return;
 
23052
+         default:
 
23053
+           gcc_unreachable ();
 
23054
+         }
 
23055
        }
 
23056
       /* Fall through to r -> r cases.  */
 
23057
     }
 
23058
 
 
23059
-  low_dst = gen_lowpart (word_mode, dst);
 
23060
-  if (REG_P (low_dst)
 
23061
-      && reg_overlap_mentioned_p (low_dst, src))
 
23062
-    {
 
23063
-      aarch64_emit_move (gen_highpart (word_mode, dst),
 
23064
-                        gen_highpart_mode (word_mode, TImode, src));
 
23065
-      aarch64_emit_move (low_dst, gen_lowpart (word_mode, src));
 
23066
-    }
 
23067
-  else
 
23068
-    {
 
23069
-      aarch64_emit_move (low_dst, gen_lowpart (word_mode, src));
 
23070
-      aarch64_emit_move (gen_highpart (word_mode, dst),
 
23071
-                        gen_highpart_mode (word_mode, TImode, src));
 
23072
-    }
 
23073
+  switch (dst_mode) {
 
23074
+  case TImode:
 
23075
+    low_dst = gen_lowpart (word_mode, dst);
 
23076
+    if (REG_P (low_dst)
 
23077
+       && reg_overlap_mentioned_p (low_dst, src))
 
23078
+      {
 
23079
+       aarch64_emit_move (gen_highpart (word_mode, dst),
 
23080
+                          gen_highpart_mode (word_mode, TImode, src));
 
23081
+       aarch64_emit_move (low_dst, gen_lowpart (word_mode, src));
 
23082
+      }
 
23083
+    else
 
23084
+      {
 
23085
+       aarch64_emit_move (low_dst, gen_lowpart (word_mode, src));
 
23086
+       aarch64_emit_move (gen_highpart (word_mode, dst),
 
23087
+                          gen_highpart_mode (word_mode, TImode, src));
 
23088
+      }
 
23089
+    return;
 
23090
+  case TFmode:
 
23091
+    emit_move_insn (gen_rtx_REG (DFmode, dst_regno),
 
23092
+                   gen_rtx_REG (DFmode, src_regno));
 
23093
+    emit_move_insn (gen_rtx_REG (DFmode, dst_regno + 1),
 
23094
+                   gen_rtx_REG (DFmode, src_regno + 1));
 
23095
+    return;
 
23096
+  default:
 
23097
+    gcc_unreachable ();
 
23098
+  }
 
23099
 }
 
23100
 
 
23101
 bool
 
23102
@@ -656,11 +724,99 @@
 
23103
          || ! (FP_REGNUM_P (REGNO (dst)) && FP_REGNUM_P (REGNO (src))));
 
23104
 }
 
23105
 
 
23106
+/* Split a complex SIMD combine.  */
 
23107
+
 
23108
+void
 
23109
+aarch64_split_simd_combine (rtx dst, rtx src1, rtx src2)
 
23110
+{
 
23111
+  enum machine_mode src_mode = GET_MODE (src1);
 
23112
+  enum machine_mode dst_mode = GET_MODE (dst);
 
23113
+
 
23114
+  gcc_assert (VECTOR_MODE_P (dst_mode));
 
23115
+
 
23116
+  if (REG_P (dst) && REG_P (src1) && REG_P (src2))
 
23117
+    {
 
23118
+      rtx (*gen) (rtx, rtx, rtx);
 
23119
+
 
23120
+      switch (src_mode)
 
23121
+       {
 
23122
+       case V8QImode:
 
23123
+         gen = gen_aarch64_simd_combinev8qi;
 
23124
+         break;
 
23125
+       case V4HImode:
 
23126
+         gen = gen_aarch64_simd_combinev4hi;
 
23127
+         break;
 
23128
+       case V2SImode:
 
23129
+         gen = gen_aarch64_simd_combinev2si;
 
23130
+         break;
 
23131
+       case V2SFmode:
 
23132
+         gen = gen_aarch64_simd_combinev2sf;
 
23133
+         break;
 
23134
+       case DImode:
 
23135
+         gen = gen_aarch64_simd_combinedi;
 
23136
+         break;
 
23137
+       case DFmode:
 
23138
+         gen = gen_aarch64_simd_combinedf;
 
23139
+         break;
 
23140
+       default:
 
23141
+         gcc_unreachable ();
 
23142
+       }
 
23143
+
 
23144
+      emit_insn (gen (dst, src1, src2));
 
23145
+      return;
 
23146
+    }
 
23147
+}
 
23148
+
 
23149
+/* Split a complex SIMD move.  */
 
23150
+
 
23151
+void
 
23152
+aarch64_split_simd_move (rtx dst, rtx src)
 
23153
+{
 
23154
+  enum machine_mode src_mode = GET_MODE (src);
 
23155
+  enum machine_mode dst_mode = GET_MODE (dst);
 
23156
+
 
23157
+  gcc_assert (VECTOR_MODE_P (dst_mode));
 
23158
+
 
23159
+  if (REG_P (dst) && REG_P (src))
 
23160
+    {
 
23161
+      rtx (*gen) (rtx, rtx);
 
23162
+
 
23163
+      gcc_assert (VECTOR_MODE_P (src_mode));
 
23164
+
 
23165
+      switch (src_mode)
 
23166
+       {
 
23167
+       case V16QImode:
 
23168
+         gen = gen_aarch64_split_simd_movv16qi;
 
23169
+         break;
 
23170
+       case V8HImode:
 
23171
+         gen = gen_aarch64_split_simd_movv8hi;
 
23172
+         break;
 
23173
+       case V4SImode:
 
23174
+         gen = gen_aarch64_split_simd_movv4si;
 
23175
+         break;
 
23176
+       case V2DImode:
 
23177
+         gen = gen_aarch64_split_simd_movv2di;
 
23178
+         break;
 
23179
+       case V4SFmode:
 
23180
+         gen = gen_aarch64_split_simd_movv4sf;
 
23181
+         break;
 
23182
+       case V2DFmode:
 
23183
+         gen = gen_aarch64_split_simd_movv2df;
 
23184
+         break;
 
23185
+       default:
 
23186
+         gcc_unreachable ();
 
23187
+       }
 
23188
+
 
23189
+      emit_insn (gen (dst, src));
 
23190
+      return;
 
23191
+    }
 
23192
+}
 
23193
+
 
23194
 static rtx
 
23195
-aarch64_force_temporary (rtx x, rtx value)
 
23196
+aarch64_force_temporary (enum machine_mode mode, rtx x, rtx value)
 
23197
 {
 
23198
   if (can_create_pseudo_p ())
 
23199
-    return force_reg (Pmode, value);
 
23200
+    return force_reg (mode, value);
 
23201
   else
 
23202
     {
 
23203
       x = aarch64_emit_move (x, value);
 
23204
@@ -672,15 +828,16 @@
 
23205
 static rtx
 
23206
 aarch64_add_offset (enum machine_mode mode, rtx temp, rtx reg, HOST_WIDE_INT offset)
 
23207
 {
 
23208
-  if (!aarch64_plus_immediate (GEN_INT (offset), DImode))
 
23209
+  if (!aarch64_plus_immediate (GEN_INT (offset), mode))
 
23210
     {
 
23211
       rtx high;
 
23212
       /* Load the full offset into a register.  This
 
23213
          might be improvable in the future.  */
 
23214
       high = GEN_INT (offset);
 
23215
       offset = 0;
 
23216
-      high = aarch64_force_temporary (temp, high);
 
23217
-      reg = aarch64_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg));
 
23218
+      high = aarch64_force_temporary (mode, temp, high);
 
23219
+      reg = aarch64_force_temporary (mode, temp,
 
23220
+                                    gen_rtx_PLUS (mode, high, reg));
 
23221
     }
 
23222
   return plus_constant (mode, reg, offset);
 
23223
 }
 
23224
@@ -719,7 +876,7 @@
 
23225
              && targetm.cannot_force_const_mem (mode, imm))
 
23226
            {
 
23227
              gcc_assert(can_create_pseudo_p ());
 
23228
-             base = aarch64_force_temporary (dest, base);
 
23229
+             base = aarch64_force_temporary (mode, dest, base);
 
23230
              base = aarch64_add_offset (mode, NULL, base, INTVAL (offset));
 
23231
              aarch64_emit_move (dest, base);
 
23232
              return;
 
23233
@@ -736,7 +893,7 @@
 
23234
          if (offset != const0_rtx)
 
23235
            {
 
23236
              gcc_assert(can_create_pseudo_p ());
 
23237
-             base = aarch64_force_temporary (dest, base);
 
23238
+             base = aarch64_force_temporary (mode, dest, base);
 
23239
              base = aarch64_add_offset (mode, NULL, base, INTVAL (offset));
 
23240
              aarch64_emit_move (dest, base);
 
23241
              return;
 
23242
@@ -745,6 +902,7 @@
 
23243
 
 
23244
         case SYMBOL_SMALL_TPREL:
 
23245
        case SYMBOL_SMALL_ABSOLUTE:
 
23246
+       case SYMBOL_TINY_ABSOLUTE:
 
23247
          aarch64_load_symref_appropriately (dest, imm, sty);
 
23248
          return;
 
23249
 
 
23250
@@ -2553,12 +2711,14 @@
 
23251
 aarch64_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
 
23252
 {
 
23253
   rtx base, offset;
 
23254
+
 
23255
   if (GET_CODE (x) == HIGH)
 
23256
     return true;
 
23257
 
 
23258
   split_const (x, &base, &offset);
 
23259
   if (GET_CODE (base) == SYMBOL_REF || GET_CODE (base) == LABEL_REF)
 
23260
-    return (aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR) != SYMBOL_FORCE_TO_MEM);
 
23261
+    return (aarch64_classify_symbol (base, SYMBOL_CONTEXT_ADR)
 
23262
+           != SYMBOL_FORCE_TO_MEM);
 
23263
 
 
23264
   return aarch64_tls_referenced_p (x);
 
23265
 }
 
23266
@@ -2996,10 +3156,13 @@
 
23267
 
 
23268
 /* Classify the base of symbolic expression X, given that X appears in
 
23269
    context CONTEXT.  */
 
23270
-static enum aarch64_symbol_type
 
23271
-aarch64_classify_symbolic_expression (rtx x, enum aarch64_symbol_context context)
 
23272
+
 
23273
+enum aarch64_symbol_type
 
23274
+aarch64_classify_symbolic_expression (rtx x,
 
23275
+                                     enum aarch64_symbol_context context)
 
23276
 {
 
23277
   rtx offset;
 
23278
+
 
23279
   split_const (x, &x, &offset);
 
23280
   return aarch64_classify_symbol (x, context);
 
23281
 }
 
23282
@@ -3087,17 +3250,19 @@
 
23283
   if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode)
 
23284
       && y == const0_rtx
 
23285
       && (code == EQ || code == NE || code == LT || code == GE)
 
23286
-      && (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS || GET_CODE (x) == AND))
 
23287
+      && (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS || GET_CODE (x) == AND
 
23288
+         || GET_CODE (x) == NEG))
 
23289
     return CC_NZmode;
 
23290
 
 
23291
-  /* A compare with a shifted operand.  Because of canonicalization,
 
23292
+  /* A compare with a shifted or negated operand.  Because of canonicalization,
 
23293
      the comparison will have to be swapped when we emit the assembly
 
23294
      code.  */
 
23295
   if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode)
 
23296
       && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG)
 
23297
       && (GET_CODE (x) == ASHIFT || GET_CODE (x) == ASHIFTRT
 
23298
          || GET_CODE (x) == LSHIFTRT
 
23299
-         || GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND))
 
23300
+         || GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND
 
23301
+         || GET_CODE (x) == NEG))
 
23302
     return CC_SWPmode;
 
23303
 
 
23304
   /* A compare of a mode narrower than SI mode against zero can be done
 
23305
@@ -3282,26 +3447,6 @@
 
23306
       asm_fprintf (f, "%s", reg_names [REGNO (x) + 1]);
 
23307
       break;
 
23308
 
 
23309
-    case 'Q':
 
23310
-      /* Print the least significant register of a pair (TImode) of regs.  */
 
23311
-      if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1))
 
23312
-       {
 
23313
-         output_operand_lossage ("invalid operand for '%%%c'", code);
 
23314
-         return;
 
23315
-       }
 
23316
-      asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 1 : 0)]);
 
23317
-      break;
 
23318
-
 
23319
-    case 'R':
 
23320
-      /* Print the most significant register of a pair (TImode) of regs.  */
 
23321
-      if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1))
 
23322
-       {
 
23323
-         output_operand_lossage ("invalid operand for '%%%c'", code);
 
23324
-         return;
 
23325
-       }
 
23326
-      asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 0 : 1)]);
 
23327
-      break;
 
23328
-
 
23329
     case 'm':
 
23330
       /* Print a condition (eq, ne, etc).  */
 
23331
 
 
23332
@@ -3349,7 +3494,7 @@
 
23333
          output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code);
 
23334
          return;
 
23335
        }
 
23336
-      asm_fprintf (f, "%s%c%d", REGISTER_PREFIX, code, REGNO (x) - V0_REGNUM);
 
23337
+      asm_fprintf (f, "%c%d", code, REGNO (x) - V0_REGNUM);
 
23338
       break;
 
23339
 
 
23340
     case 'S':
 
23341
@@ -3362,18 +3507,17 @@
 
23342
          output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code);
 
23343
          return;
 
23344
        }
 
23345
-      asm_fprintf (f, "%sv%d", REGISTER_PREFIX,
 
23346
-                              REGNO (x) - V0_REGNUM + (code - 'S'));
 
23347
+      asm_fprintf (f, "v%d", REGNO (x) - V0_REGNUM + (code - 'S'));
 
23348
       break;
 
23349
 
 
23350
     case 'X':
 
23351
-      /* Print integer constant in hex.  */
 
23352
+      /* Print bottom 16 bits of integer constant in hex.  */
 
23353
       if (GET_CODE (x) != CONST_INT)
 
23354
        {
 
23355
          output_operand_lossage ("invalid operand for '%%%c'", code);
 
23356
          return;
 
23357
        }
 
23358
-      asm_fprintf (f, "0x%wx", UINTVAL (x));
 
23359
+      asm_fprintf (f, "0x%wx", UINTVAL (x) & 0xffff);
 
23360
       break;
 
23361
 
 
23362
     case 'w':
 
23363
@@ -3383,20 +3527,19 @@
 
23364
       if (x == const0_rtx
 
23365
          || (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x)))
 
23366
        {
 
23367
-         asm_fprintf (f, "%s%czr", REGISTER_PREFIX, code);
 
23368
+         asm_fprintf (f, "%czr", code);
 
23369
          break;
 
23370
        }
 
23371
 
 
23372
       if (REG_P (x) && GP_REGNUM_P (REGNO (x)))
 
23373
        {
 
23374
-         asm_fprintf (f, "%s%c%d", REGISTER_PREFIX, code,
 
23375
-                      REGNO (x) - R0_REGNUM);
 
23376
+         asm_fprintf (f, "%c%d", code, REGNO (x) - R0_REGNUM);
 
23377
          break;
 
23378
        }
 
23379
 
 
23380
       if (REG_P (x) && REGNO (x) == SP_REGNUM)
 
23381
        {
 
23382
-         asm_fprintf (f, "%s%ssp", REGISTER_PREFIX, code == 'w' ? "w" : "");
 
23383
+         asm_fprintf (f, "%ssp", code == 'w' ? "w" : "");
 
23384
          break;
 
23385
        }
 
23386
 
 
23387
@@ -3647,13 +3790,6 @@
 
23388
   output_addr_const (f, x);
 
23389
 }
 
23390
 
 
23391
-void
 
23392
-aarch64_function_profiler (FILE *f ATTRIBUTE_UNUSED,
 
23393
-                          int labelno ATTRIBUTE_UNUSED)
 
23394
-{
 
23395
-  sorry ("function profiling");
 
23396
-}
 
23397
-
 
23398
 bool
 
23399
 aarch64_label_mentioned_p (rtx x)
 
23400
 {
 
23401
@@ -4601,6 +4737,101 @@
 
23402
   return aarch64_tune_params->memmov_cost;
 
23403
 }
 
23404
 
 
23405
+/* Vectorizer cost model target hooks.  */
 
23406
+
 
23407
+/* Implement targetm.vectorize.builtin_vectorization_cost.  */
 
23408
+static int
 
23409
+aarch64_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
 
23410
+                                   tree vectype,
 
23411
+                                   int misalign ATTRIBUTE_UNUSED)
 
23412
+{
 
23413
+  unsigned elements;
 
23414
+
 
23415
+  switch (type_of_cost)
 
23416
+    {
 
23417
+      case scalar_stmt:
 
23418
+       return aarch64_tune_params->vec_costs->scalar_stmt_cost;
 
23419
+
 
23420
+      case scalar_load:
 
23421
+       return aarch64_tune_params->vec_costs->scalar_load_cost;
 
23422
+
 
23423
+      case scalar_store:
 
23424
+       return aarch64_tune_params->vec_costs->scalar_store_cost;
 
23425
+
 
23426
+      case vector_stmt:
 
23427
+       return aarch64_tune_params->vec_costs->vec_stmt_cost;
 
23428
+
 
23429
+      case vector_load:
 
23430
+       return aarch64_tune_params->vec_costs->vec_align_load_cost;
 
23431
+
 
23432
+      case vector_store:
 
23433
+       return aarch64_tune_params->vec_costs->vec_store_cost;
 
23434
+
 
23435
+      case vec_to_scalar:
 
23436
+       return aarch64_tune_params->vec_costs->vec_to_scalar_cost;
 
23437
+
 
23438
+      case scalar_to_vec:
 
23439
+       return aarch64_tune_params->vec_costs->scalar_to_vec_cost;
 
23440
+
 
23441
+      case unaligned_load:
 
23442
+       return aarch64_tune_params->vec_costs->vec_unalign_load_cost;
 
23443
+
 
23444
+      case unaligned_store:
 
23445
+       return aarch64_tune_params->vec_costs->vec_unalign_store_cost;
 
23446
+
 
23447
+      case cond_branch_taken:
 
23448
+       return aarch64_tune_params->vec_costs->cond_taken_branch_cost;
 
23449
+
 
23450
+      case cond_branch_not_taken:
 
23451
+       return aarch64_tune_params->vec_costs->cond_not_taken_branch_cost;
 
23452
+
 
23453
+      case vec_perm:
 
23454
+      case vec_promote_demote:
 
23455
+       return aarch64_tune_params->vec_costs->vec_stmt_cost;
 
23456
+
 
23457
+      case vec_construct:
 
23458
+        elements = TYPE_VECTOR_SUBPARTS (vectype);
 
23459
+       return elements / 2 + 1;
 
23460
+
 
23461
+      default:
 
23462
+       gcc_unreachable ();
 
23463
+    }
 
23464
+}
 
23465
+
 
23466
+/* Implement targetm.vectorize.add_stmt_cost.  */
 
23467
+static unsigned
 
23468
+aarch64_add_stmt_cost (void *data, int count, enum vect_cost_for_stmt kind,
 
23469
+                      struct _stmt_vec_info *stmt_info, int misalign,
 
23470
+                      enum vect_cost_model_location where)
 
23471
+{
 
23472
+  unsigned *cost = (unsigned *) data;
 
23473
+  unsigned retval = 0;
 
23474
+
 
23475
+  if (flag_vect_cost_model)
 
23476
+    {
 
23477
+      tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
 
23478
+      int stmt_cost =
 
23479
+           aarch64_builtin_vectorization_cost (kind, vectype, misalign);
 
23480
+
 
23481
+      /* Statements in an inner loop relative to the loop being
 
23482
+        vectorized are weighted more heavily.  The value here is
 
23483
+        a function (linear for now) of the loop nest level.  */
 
23484
+      if (where == vect_body && stmt_info && stmt_in_inner_loop_p (stmt_info))
 
23485
+       {
 
23486
+         loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (stmt_info);
 
23487
+         struct loop *loop =  LOOP_VINFO_LOOP (loop_info);
 
23488
+         unsigned nest_level = loop_depth (loop);
 
23489
+
 
23490
+         count *= nest_level;
 
23491
+       }
 
23492
+
 
23493
+      retval = (unsigned) (count * stmt_cost);
 
23494
+      cost[where] += retval;
 
23495
+    }
 
23496
+
 
23497
+  return retval;
 
23498
+}
 
23499
+
 
23500
 static void initialize_aarch64_code_model (void);
 
23501
 
 
23502
 /* Parse the architecture extension string.  */
 
23503
@@ -4956,6 +5187,7 @@
 
23504
 
 
23505
 /* Return the method that should be used to access SYMBOL_REF or
 
23506
    LABEL_REF X in context CONTEXT.  */
 
23507
+
 
23508
 enum aarch64_symbol_type
 
23509
 aarch64_classify_symbol (rtx x,
 
23510
                         enum aarch64_symbol_context context ATTRIBUTE_UNUSED)
 
23511
@@ -4969,6 +5201,8 @@
 
23512
 
 
23513
        case AARCH64_CMODEL_TINY_PIC:
 
23514
        case AARCH64_CMODEL_TINY:
 
23515
+         return SYMBOL_TINY_ABSOLUTE;
 
23516
+
 
23517
        case AARCH64_CMODEL_SMALL_PIC:
 
23518
        case AARCH64_CMODEL_SMALL:
 
23519
          return SYMBOL_SMALL_ABSOLUTE;
 
23520
@@ -4978,71 +5212,47 @@
 
23521
        }
 
23522
     }
 
23523
 
 
23524
-  gcc_assert (GET_CODE (x) == SYMBOL_REF);
 
23525
-
 
23526
-  switch (aarch64_cmodel)
 
23527
+  if (GET_CODE (x) == SYMBOL_REF)
 
23528
     {
 
23529
-    case AARCH64_CMODEL_LARGE:
 
23530
-      return SYMBOL_FORCE_TO_MEM;
 
23531
-
 
23532
-    case AARCH64_CMODEL_TINY:
 
23533
-    case AARCH64_CMODEL_SMALL:
 
23534
-
 
23535
-      /* This is needed to get DFmode, TImode constants to be loaded off
 
23536
-         the constant pool.  Is it necessary to dump TImode values into
 
23537
-         the constant pool.  We don't handle TImode constant loads properly
 
23538
-         yet and hence need to use the constant pool.  */
 
23539
-      if (CONSTANT_POOL_ADDRESS_P (x))
 
23540
+      if (aarch64_cmodel == AARCH64_CMODEL_LARGE
 
23541
+         || CONSTANT_POOL_ADDRESS_P (x))
 
23542
        return SYMBOL_FORCE_TO_MEM;
 
23543
 
 
23544
       if (aarch64_tls_symbol_p (x))
 
23545
        return aarch64_classify_tls_symbol (x);
 
23546
 
 
23547
-      if (SYMBOL_REF_WEAK (x))
 
23548
-       return SYMBOL_FORCE_TO_MEM;
 
23549
+      switch (aarch64_cmodel)
 
23550
+       {
 
23551
+       case AARCH64_CMODEL_TINY:
 
23552
+         if (SYMBOL_REF_WEAK (x))
 
23553
+           return SYMBOL_FORCE_TO_MEM;
 
23554
+         return SYMBOL_TINY_ABSOLUTE;
 
23555
 
 
23556
-      return SYMBOL_SMALL_ABSOLUTE;
 
23557
+       case AARCH64_CMODEL_SMALL:
 
23558
+         if (SYMBOL_REF_WEAK (x))
 
23559
+           return SYMBOL_FORCE_TO_MEM;
 
23560
+         return SYMBOL_SMALL_ABSOLUTE;
 
23561
 
 
23562
-    case AARCH64_CMODEL_TINY_PIC:
 
23563
-    case AARCH64_CMODEL_SMALL_PIC:
 
23564
+       case AARCH64_CMODEL_TINY_PIC:
 
23565
+         if (!aarch64_symbol_binds_local_p (x))
 
23566
+           return SYMBOL_SMALL_GOT;
 
23567
+         return SYMBOL_TINY_ABSOLUTE;
 
23568
 
 
23569
-      if (CONSTANT_POOL_ADDRESS_P (x))
 
23570
-       return SYMBOL_FORCE_TO_MEM;
 
23571
+       case AARCH64_CMODEL_SMALL_PIC:
 
23572
+         if (!aarch64_symbol_binds_local_p (x))
 
23573
+           return SYMBOL_SMALL_GOT;
 
23574
+         return SYMBOL_SMALL_ABSOLUTE;
 
23575
 
 
23576
-      if (aarch64_tls_symbol_p (x))
 
23577
-       return aarch64_classify_tls_symbol (x);
 
23578
+       default:
 
23579
+         gcc_unreachable ();
 
23580
+       }
 
23581
+    }
 
23582
 
 
23583
-      if (!aarch64_symbol_binds_local_p (x))
 
23584
-       return SYMBOL_SMALL_GOT;
 
23585
-
 
23586
-      return SYMBOL_SMALL_ABSOLUTE;
 
23587
-
 
23588
-    default:
 
23589
-      gcc_unreachable ();
 
23590
-    }
 
23591
   /* By default push everything into the constant pool.  */
 
23592
   return SYMBOL_FORCE_TO_MEM;
 
23593
 }
 
23594
 
 
23595
-/* Return true if X is a symbolic constant that can be used in context
 
23596
-   CONTEXT.  If it is, store the type of the symbol in *SYMBOL_TYPE.  */
 
23597
-
 
23598
 bool
 
23599
-aarch64_symbolic_constant_p (rtx x, enum aarch64_symbol_context context,
 
23600
-                            enum aarch64_symbol_type *symbol_type)
 
23601
-{
 
23602
-  rtx offset;
 
23603
-  split_const (x, &x, &offset);
 
23604
-  if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
 
23605
-    *symbol_type = aarch64_classify_symbol (x, context);
 
23606
-  else
 
23607
-    return false;
 
23608
-
 
23609
-  /* No checking of offset at this point.  */
 
23610
-  return true;
 
23611
-}
 
23612
-
 
23613
-bool
 
23614
 aarch64_constant_address_p (rtx x)
 
23615
 {
 
23616
   return (CONSTANT_P (x) && memory_address_p (DImode, x));
 
23617
@@ -5092,8 +5302,7 @@
 
23618
   /* This could probably go away because
 
23619
      we now decompose CONST_INTs according to expand_mov_immediate.  */
 
23620
   if ((GET_CODE (x) == CONST_VECTOR
 
23621
-       && aarch64_simd_valid_immediate (x, mode, false,
 
23622
-                                       NULL, NULL, NULL, NULL, NULL) != -1)
 
23623
+       && aarch64_simd_valid_immediate (x, mode, false, NULL))
 
23624
       || CONST_INT_P (x) || aarch64_valid_floating_const (mode, x))
 
23625
        return !targetm.cannot_force_const_mem (mode, x);
 
23626
 
 
23627
@@ -5924,32 +6133,57 @@
 
23628
   return false;
 
23629
 }
 
23630
 
 
23631
-/* Return quad mode as the preferred SIMD mode.  */
 
23632
+/* Return appropriate SIMD container
 
23633
+   for MODE within a vector of WIDTH bits.  */
 
23634
 static enum machine_mode
 
23635
-aarch64_preferred_simd_mode (enum machine_mode mode)
 
23636
+aarch64_simd_container_mode (enum machine_mode mode, unsigned width)
 
23637
 {
 
23638
+  gcc_assert (width == 64 || width == 128);
 
23639
   if (TARGET_SIMD)
 
23640
-    switch (mode)
 
23641
-      {
 
23642
-      case DFmode:
 
23643
-        return V2DFmode;
 
23644
-      case SFmode:
 
23645
-        return V4SFmode;
 
23646
-      case SImode:
 
23647
-        return V4SImode;
 
23648
-      case HImode:
 
23649
-        return V8HImode;
 
23650
-      case QImode:
 
23651
-        return V16QImode;
 
23652
-      case DImode:
 
23653
-          return V2DImode;
 
23654
-        break;
 
23655
-
 
23656
-      default:;
 
23657
-      }
 
23658
+    {
 
23659
+      if (width == 128)
 
23660
+       switch (mode)
 
23661
+         {
 
23662
+         case DFmode:
 
23663
+           return V2DFmode;
 
23664
+         case SFmode:
 
23665
+           return V4SFmode;
 
23666
+         case SImode:
 
23667
+           return V4SImode;
 
23668
+         case HImode:
 
23669
+           return V8HImode;
 
23670
+         case QImode:
 
23671
+           return V16QImode;
 
23672
+         case DImode:
 
23673
+           return V2DImode;
 
23674
+         default:
 
23675
+           break;
 
23676
+         }
 
23677
+      else
 
23678
+       switch (mode)
 
23679
+         {
 
23680
+         case SFmode:
 
23681
+           return V2SFmode;
 
23682
+         case SImode:
 
23683
+           return V2SImode;
 
23684
+         case HImode:
 
23685
+           return V4HImode;
 
23686
+         case QImode:
 
23687
+           return V8QImode;
 
23688
+         default:
 
23689
+           break;
 
23690
+         }
 
23691
+    }
 
23692
   return word_mode;
 
23693
 }
 
23694
 
 
23695
+/* Return 128-bit container as the preferred SIMD mode for MODE.  */
 
23696
+static enum machine_mode
 
23697
+aarch64_preferred_simd_mode (enum machine_mode mode)
 
23698
+{
 
23699
+  return aarch64_simd_container_mode (mode, 128);
 
23700
+}
 
23701
+
 
23702
 /* Return the bitmask of possible vector sizes for the vectorizer
 
23703
    to iterate over.  */
 
23704
 static unsigned int
 
23705
@@ -6037,7 +6271,7 @@
 
23706
 }
 
23707
 
 
23708
 /* Return the equivalent letter for size.  */
 
23709
-static unsigned char
 
23710
+static char
 
23711
 sizetochar (int size)
 
23712
 {
 
23713
   switch (size)
 
23714
@@ -6084,15 +6318,10 @@
 
23715
   return aarch64_float_const_representable_p (x0);
 
23716
 }
 
23717
 
 
23718
-/* TODO: This function returns values similar to those
 
23719
-   returned by neon_valid_immediate in gcc/config/arm/arm.c
 
23720
-   but the API here is different enough that these magic numbers
 
23721
-   are not used.  It should be sufficient to return true or false.  */
 
23722
-static int
 
23723
-aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, int inverse,
 
23724
-                             rtx *modconst, int *elementwidth,
 
23725
-                             unsigned char *elementchar,
 
23726
-                             int *mvn, int *shift)
 
23727
+/* Return true for valid and false for invalid.  */
 
23728
+bool
 
23729
+aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, bool inverse,
 
23730
+                             struct simd_immediate_info *info)
 
23731
 {
 
23732
 #define CHECK(STRIDE, ELSIZE, CLASS, TEST, SHIFT, NEG) \
 
23733
   matches = 1;                                         \
 
23734
@@ -6103,7 +6332,6 @@
 
23735
     {                                                  \
 
23736
       immtype = (CLASS);                               \
 
23737
       elsize = (ELSIZE);                               \
 
23738
-      elchar = sizetochar (elsize);                    \
 
23739
       eshift = (SHIFT);                                        \
 
23740
       emvn = (NEG);                                    \
 
23741
       break;                                           \
 
23742
@@ -6112,36 +6340,25 @@
 
23743
   unsigned int i, elsize = 0, idx = 0, n_elts = CONST_VECTOR_NUNITS (op);
 
23744
   unsigned int innersize = GET_MODE_SIZE (GET_MODE_INNER (mode));
 
23745
   unsigned char bytes[16];
 
23746
-  unsigned char elchar = 0;
 
23747
   int immtype = -1, matches;
 
23748
   unsigned int invmask = inverse ? 0xff : 0;
 
23749
   int eshift, emvn;
 
23750
 
 
23751
   if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
 
23752
     {
 
23753
-      bool simd_imm_zero = aarch64_simd_imm_zero_p (op, mode);
 
23754
-      int elem_width = GET_MODE_BITSIZE (GET_MODE (CONST_VECTOR_ELT (op, 0)));
 
23755
+      if (! (aarch64_simd_imm_zero_p (op, mode)
 
23756
+            || aarch64_vect_float_const_representable_p (op)))
 
23757
+       return false;
 
23758
 
 
23759
-      if (!(simd_imm_zero
 
23760
-           || aarch64_vect_float_const_representable_p (op)))
 
23761
-       return -1;
 
23762
+      if (info)
 
23763
+       {
 
23764
+         info->value = CONST_VECTOR_ELT (op, 0);
 
23765
+         info->element_width = GET_MODE_BITSIZE (GET_MODE (info->value));
 
23766
+         info->mvn = false;
 
23767
+         info->shift = 0;
 
23768
+       }
 
23769
 
 
23770
-       if (modconst)
 
23771
-         *modconst = CONST_VECTOR_ELT (op, 0);
 
23772
-
 
23773
-       if (elementwidth)
 
23774
-         *elementwidth = elem_width;
 
23775
-
 
23776
-       if (elementchar)
 
23777
-         *elementchar = sizetochar (elem_width);
 
23778
-
 
23779
-       if (shift)
 
23780
-         *shift = 0;
 
23781
-
 
23782
-       if (simd_imm_zero)
 
23783
-         return 19;
 
23784
-       else
 
23785
-         return 18;
 
23786
+      return true;
 
23787
     }
 
23788
 
 
23789
   /* Splat vector constant out into a byte vector.  */
 
23790
@@ -6215,16 +6432,16 @@
 
23791
       CHECK (2, 16, 11, bytes[i] == 0xff && bytes[i + 1] == bytes[1], 8, 1);
 
23792
 
 
23793
       CHECK (4, 32, 12, bytes[i] == 0xff && bytes[i + 1] == bytes[1]
 
23794
-            && bytes[i + 2] == 0 && bytes[i + 3] == 0, 0, 0);
 
23795
+            && bytes[i + 2] == 0 && bytes[i + 3] == 0, 8, 0);
 
23796
 
 
23797
       CHECK (4, 32, 13, bytes[i] == 0 && bytes[i + 1] == bytes[1]
 
23798
-            && bytes[i + 2] == 0xff && bytes[i + 3] == 0xff, 0, 1);
 
23799
+            && bytes[i + 2] == 0xff && bytes[i + 3] == 0xff, 8, 1);
 
23800
 
 
23801
       CHECK (4, 32, 14, bytes[i] == 0xff && bytes[i + 1] == 0xff
 
23802
-            && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0, 0, 0);
 
23803
+            && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0, 16, 0);
 
23804
 
 
23805
       CHECK (4, 32, 15, bytes[i] == 0 && bytes[i + 1] == 0
 
23806
-            && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0xff, 0, 1);
 
23807
+            && bytes[i + 2] == bytes[2] && bytes[i + 3] == 0xff, 16, 1);
 
23808
 
 
23809
       CHECK (1, 8, 16, bytes[i] == bytes[0], 0, 0);
 
23810
 
 
23811
@@ -6233,31 +6450,20 @@
 
23812
     }
 
23813
   while (0);
 
23814
 
 
23815
-  /* TODO: Currently the assembler cannot handle types 12 to 15.
 
23816
-     And there is no way to specify cmode through the compiler.
 
23817
-     Disable them till there is support in the assembler.  */
 
23818
-  if (immtype == -1
 
23819
-      || (immtype >= 12 && immtype <= 15)
 
23820
-      || immtype == 18)
 
23821
-    return -1;
 
23822
+  if (immtype == -1)
 
23823
+    return false;
 
23824
 
 
23825
+  if (info)
 
23826
+    {
 
23827
+      info->element_width = elsize;
 
23828
+      info->mvn = emvn != 0;
 
23829
+      info->shift = eshift;
 
23830
 
 
23831
-  if (elementwidth)
 
23832
-    *elementwidth = elsize;
 
23833
+      unsigned HOST_WIDE_INT imm = 0;
 
23834
 
 
23835
-  if (elementchar)
 
23836
-    *elementchar = elchar;
 
23837
+      if (immtype >= 12 && immtype <= 15)
 
23838
+       info->msl = true;
 
23839
 
 
23840
-  if (mvn)
 
23841
-    *mvn = emvn;
 
23842
-
 
23843
-  if (shift)
 
23844
-    *shift = eshift;
 
23845
-
 
23846
-  if (modconst)
 
23847
-    {
 
23848
-      unsigned HOST_WIDE_INT imm = 0;
 
23849
-
 
23850
       /* Un-invert bytes of recognized vector, if necessary.  */
 
23851
       if (invmask != 0)
 
23852
         for (i = 0; i < idx; i++)
 
23853
@@ -6272,68 +6478,27 @@
 
23854
             imm |= (unsigned HOST_WIDE_INT) (bytes[i] ? 0xff : 0)
 
23855
              << (i * BITS_PER_UNIT);
 
23856
 
 
23857
-          *modconst = GEN_INT (imm);
 
23858
-        }
 
23859
+
 
23860
+         info->value = GEN_INT (imm);
 
23861
+       }
 
23862
       else
 
23863
-        {
 
23864
-          unsigned HOST_WIDE_INT imm = 0;
 
23865
+       {
 
23866
+         for (i = 0; i < elsize / BITS_PER_UNIT; i++)
 
23867
+           imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT);
 
23868
 
 
23869
-          for (i = 0; i < elsize / BITS_PER_UNIT; i++)
 
23870
-            imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT);
 
23871
-
 
23872
          /* Construct 'abcdefgh' because the assembler cannot handle
 
23873
-            generic constants.  */
 
23874
-         gcc_assert (shift != NULL && mvn != NULL);
 
23875
-         if (*mvn)
 
23876
+            generic constants.  */
 
23877
+         if (info->mvn)
 
23878
            imm = ~imm;
 
23879
-         imm = (imm >> *shift) & 0xff;
 
23880
-          *modconst = GEN_INT (imm);
 
23881
-        }
 
23882
+         imm = (imm >> info->shift) & 0xff;
 
23883
+         info->value = GEN_INT (imm);
 
23884
+       }
 
23885
     }
 
23886
 
 
23887
-  return immtype;
 
23888
+  return true;
 
23889
 #undef CHECK
 
23890
 }
 
23891
 
 
23892
-/* Return TRUE if rtx X is legal for use as either a AdvSIMD MOVI instruction
 
23893
-   (or, implicitly, MVNI) immediate.  Write back width per element
 
23894
-   to *ELEMENTWIDTH, and a modified constant (whatever should be output
 
23895
-   for a MOVI instruction) in *MODCONST.  */
 
23896
-int
 
23897
-aarch64_simd_immediate_valid_for_move (rtx op, enum machine_mode mode,
 
23898
-                                      rtx *modconst, int *elementwidth,
 
23899
-                                      unsigned char *elementchar,
 
23900
-                                      int *mvn, int *shift)
 
23901
-{
 
23902
-  rtx tmpconst;
 
23903
-  int tmpwidth;
 
23904
-  unsigned char tmpwidthc;
 
23905
-  int tmpmvn = 0, tmpshift = 0;
 
23906
-  int retval = aarch64_simd_valid_immediate (op, mode, 0, &tmpconst,
 
23907
-                                            &tmpwidth, &tmpwidthc,
 
23908
-                                            &tmpmvn, &tmpshift);
 
23909
-
 
23910
-  if (retval == -1)
 
23911
-    return 0;
 
23912
-
 
23913
-  if (modconst)
 
23914
-    *modconst = tmpconst;
 
23915
-
 
23916
-  if (elementwidth)
 
23917
-    *elementwidth = tmpwidth;
 
23918
-
 
23919
-  if (elementchar)
 
23920
-    *elementchar = tmpwidthc;
 
23921
-
 
23922
-  if (mvn)
 
23923
-    *mvn = tmpmvn;
 
23924
-
 
23925
-  if (shift)
 
23926
-    *shift = tmpshift;
 
23927
-
 
23928
-  return 1;
 
23929
-}
 
23930
-
 
23931
 static bool
 
23932
 aarch64_const_vec_all_same_int_p (rtx x,
 
23933
                                  HOST_WIDE_INT minval,
 
23934
@@ -6395,6 +6560,25 @@
 
23935
   return true;
 
23936
 }
 
23937
 
 
23938
+bool
 
23939
+aarch64_mov_operand_p (rtx x,
 
23940
+                      enum aarch64_symbol_context context,
 
23941
+                      enum machine_mode mode)
 
23942
+{
 
23943
+  if (GET_CODE (x) == HIGH
 
23944
+      && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
 
23945
+    return true;
 
23946
+
 
23947
+  if (CONST_INT_P (x) && aarch64_move_imm (INTVAL (x), mode))
 
23948
+    return true;
 
23949
+
 
23950
+  if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
 
23951
+    return true;
 
23952
+
 
23953
+  return aarch64_classify_symbolic_expression (x, context)
 
23954
+    == SYMBOL_TINY_ABSOLUTE;
 
23955
+}
 
23956
+
 
23957
 /* Return a const_int vector of VAL.  */
 
23958
 rtx
 
23959
 aarch64_simd_gen_const_vector_dup (enum machine_mode mode, int val)
 
23960
@@ -6409,6 +6593,19 @@
 
23961
   return gen_rtx_CONST_VECTOR (mode, v);
 
23962
 }
 
23963
 
 
23964
+/* Check OP is a legal scalar immediate for the MOVI instruction.  */
 
23965
+
 
23966
+bool
 
23967
+aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode)
 
23968
+{
 
23969
+  enum machine_mode vmode;
 
23970
+
 
23971
+  gcc_assert (!VECTOR_MODE_P (mode));
 
23972
+  vmode = aarch64_preferred_simd_mode (mode);
 
23973
+  rtx op_v = aarch64_simd_gen_const_vector_dup (vmode, INTVAL (op));
 
23974
+  return aarch64_simd_valid_immediate (op_v, vmode, false, NULL);
 
23975
+}
 
23976
+
 
23977
 /* Construct and return a PARALLEL RTX vector.  */
 
23978
 rtx
 
23979
 aarch64_simd_vect_par_cnst_half (enum machine_mode mode, bool high)
 
23980
@@ -6634,8 +6831,7 @@
 
23981
     gcc_unreachable ();
 
23982
 
 
23983
   if (const_vec != NULL_RTX
 
23984
-      && aarch64_simd_immediate_valid_for_move (const_vec, mode, NULL, NULL,
 
23985
-                                               NULL, NULL, NULL))
 
23986
+      && aarch64_simd_valid_immediate (const_vec, mode, false, NULL))
 
23987
     /* Load using MOVI/MVNI.  */
 
23988
     return const_vec;
 
23989
   else if ((const_dup = aarch64_simd_dup_constant (vals)) != NULL_RTX)
 
23990
@@ -7193,49 +7389,80 @@
 
23991
 }
 
23992
 
 
23993
 char*
 
23994
-aarch64_output_simd_mov_immediate (rtx *const_vector,
 
23995
+aarch64_output_simd_mov_immediate (rtx const_vector,
 
23996
                                   enum machine_mode mode,
 
23997
                                   unsigned width)
 
23998
 {
 
23999
-  int is_valid;
 
24000
-  unsigned char widthc;
 
24001
-  int lane_width_bits;
 
24002
+  bool is_valid;
 
24003
   static char templ[40];
 
24004
-  int shift = 0, mvn = 0;
 
24005
   const char *mnemonic;
 
24006
+  const char *shift_op;
 
24007
   unsigned int lane_count = 0;
 
24008
+  char element_char;
 
24009
 
 
24010
-  is_valid =
 
24011
-    aarch64_simd_immediate_valid_for_move (*const_vector, mode,
 
24012
-                                          const_vector, &lane_width_bits,
 
24013
-                                          &widthc, &mvn, &shift);
 
24014
+  struct simd_immediate_info info = { NULL_RTX, 0, 0, false, false };
 
24015
+
 
24016
+  /* This will return true to show const_vector is legal for use as either
 
24017
+     a AdvSIMD MOVI instruction (or, implicitly, MVNI) immediate.  It will
 
24018
+     also update INFO to show how the immediate should be generated.  */
 
24019
+  is_valid = aarch64_simd_valid_immediate (const_vector, mode, false, &info);
 
24020
   gcc_assert (is_valid);
 
24021
 
 
24022
+  element_char = sizetochar (info.element_width);
 
24023
+  lane_count = width / info.element_width;
 
24024
+
 
24025
   mode = GET_MODE_INNER (mode);
 
24026
   if (mode == SFmode || mode == DFmode)
 
24027
     {
 
24028
-      bool zero_p =
 
24029
-       aarch64_float_const_zero_rtx_p (*const_vector);
 
24030
-      gcc_assert (shift == 0);
 
24031
-      mnemonic = zero_p ? "movi" : "fmov";
 
24032
+      gcc_assert (info.shift == 0 && ! info.mvn);
 
24033
+      if (aarch64_float_const_zero_rtx_p (info.value))
 
24034
+        info.value = GEN_INT (0);
 
24035
+      else
 
24036
+       {
 
24037
+#define buf_size 20
 
24038
+         REAL_VALUE_TYPE r;
 
24039
+         REAL_VALUE_FROM_CONST_DOUBLE (r, info.value);
 
24040
+         char float_buf[buf_size] = {'\0'};
 
24041
+         real_to_decimal_for_mode (float_buf, &r, buf_size, buf_size, 1, mode);
 
24042
+#undef buf_size
 
24043
+
 
24044
+         if (lane_count == 1)
 
24045
+           snprintf (templ, sizeof (templ), "fmov\t%%d0, %s", float_buf);
 
24046
+         else
 
24047
+           snprintf (templ, sizeof (templ), "fmov\t%%0.%d%c, %s",
 
24048
+                     lane_count, element_char, float_buf);
 
24049
+         return templ;
 
24050
+       }
 
24051
     }
 
24052
-  else
 
24053
-    mnemonic = mvn ? "mvni" : "movi";
 
24054
 
 
24055
-  gcc_assert (lane_width_bits != 0);
 
24056
-  lane_count = width / lane_width_bits;
 
24057
+  mnemonic = info.mvn ? "mvni" : "movi";
 
24058
+  shift_op = info.msl ? "msl" : "lsl";
 
24059
 
 
24060
   if (lane_count == 1)
 
24061
-    snprintf (templ, sizeof (templ), "%s\t%%d0, %%1", mnemonic);
 
24062
-  else if (shift)
 
24063
-    snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, %%1, lsl %d",
 
24064
-             mnemonic, lane_count, widthc, shift);
 
24065
+    snprintf (templ, sizeof (templ), "%s\t%%d0, " HOST_WIDE_INT_PRINT_HEX,
 
24066
+             mnemonic, UINTVAL (info.value));
 
24067
+  else if (info.shift)
 
24068
+    snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, " HOST_WIDE_INT_PRINT_HEX
 
24069
+             ", %s %d", mnemonic, lane_count, element_char,
 
24070
+             UINTVAL (info.value), shift_op, info.shift);
 
24071
   else
 
24072
-    snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, %%1",
 
24073
-             mnemonic, lane_count, widthc);
 
24074
+    snprintf (templ, sizeof (templ), "%s\t%%0.%d%c, " HOST_WIDE_INT_PRINT_HEX,
 
24075
+             mnemonic, lane_count, element_char, UINTVAL (info.value));
 
24076
   return templ;
 
24077
 }
 
24078
 
 
24079
+char*
 
24080
+aarch64_output_scalar_simd_mov_immediate (rtx immediate,
 
24081
+                                         enum machine_mode mode)
 
24082
+{
 
24083
+  enum machine_mode vmode;
 
24084
+
 
24085
+  gcc_assert (!VECTOR_MODE_P (mode));
 
24086
+  vmode = aarch64_simd_container_mode (mode, 64);
 
24087
+  rtx v_op = aarch64_simd_gen_const_vector_dup (vmode, INTVAL (immediate));
 
24088
+  return aarch64_output_simd_mov_immediate (v_op, vmode, 64);
 
24089
+}
 
24090
+
 
24091
 /* Split operands into moves from op[1] + op[2] into op[0].  */
 
24092
 
 
24093
 void
 
24094
@@ -7860,6 +8087,9 @@
 
24095
 #undef TARGET_EXPAND_BUILTIN_VA_START
 
24096
 #define TARGET_EXPAND_BUILTIN_VA_START aarch64_expand_builtin_va_start
 
24097
 
 
24098
+#undef TARGET_FOLD_BUILTIN
 
24099
+#define TARGET_FOLD_BUILTIN aarch64_fold_builtin
 
24100
+
 
24101
 #undef TARGET_FUNCTION_ARG
 
24102
 #define TARGET_FUNCTION_ARG aarch64_function_arg
 
24103
 
 
24104
@@ -7881,6 +8111,9 @@
 
24105
 #undef TARGET_FRAME_POINTER_REQUIRED
 
24106
 #define TARGET_FRAME_POINTER_REQUIRED aarch64_frame_pointer_required
 
24107
 
 
24108
+#undef TARGET_GIMPLE_FOLD_BUILTIN
 
24109
+#define TARGET_GIMPLE_FOLD_BUILTIN aarch64_gimple_fold_builtin
 
24110
+
 
24111
 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
 
24112
 #define TARGET_GIMPLIFY_VA_ARG_EXPR aarch64_gimplify_va_arg_expr
 
24113
 
 
24114
@@ -7960,6 +8193,13 @@
 
24115
 #undef TARGET_ARRAY_MODE_SUPPORTED_P
 
24116
 #define TARGET_ARRAY_MODE_SUPPORTED_P aarch64_array_mode_supported_p
 
24117
 
 
24118
+#undef TARGET_VECTORIZE_ADD_STMT_COST
 
24119
+#define TARGET_VECTORIZE_ADD_STMT_COST aarch64_add_stmt_cost
 
24120
+
 
24121
+#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
 
24122
+#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
 
24123
+  aarch64_builtin_vectorization_cost
 
24124
+
 
24125
 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
 
24126
 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE aarch64_preferred_simd_mode
 
24127
 
 
24128
--- a/src/gcc/config/aarch64/iterators.md
 
24129
+++ b/src/gcc/config/aarch64/iterators.md
 
24130
@@ -83,6 +83,12 @@
 
24131
 ;; Vector Float modes.
 
24132
 (define_mode_iterator VDQF [V2SF V4SF V2DF])
 
24133
 
 
24134
+;; Modes suitable to use as the return type of a vcond expression.
 
24135
+(define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI])
 
24136
+
 
24137
+;; All Float modes.
 
24138
+(define_mode_iterator VALLF [V2SF V4SF V2DF SF DF])
 
24139
+
 
24140
 ;; Vector Float modes with 2 elements.
 
24141
 (define_mode_iterator V2F [V2SF V2DF])
 
24142
 
 
24143
@@ -122,9 +128,15 @@
 
24144
 ;; Vector modes except double int.
 
24145
 (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF])
 
24146
 
 
24147
+;; Vector modes for Q and H types.
 
24148
+(define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI])
 
24149
+
 
24150
 ;; Vector modes for H and S types.
 
24151
 (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI])
 
24152
 
 
24153
+;; Vector modes for Q, H and S types.
 
24154
+(define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI])
 
24155
+
 
24156
 ;; Vector and scalar integer modes for H and S
 
24157
 (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI])
 
24158
 
 
24159
@@ -160,10 +172,15 @@
 
24160
  [
 
24161
     UNSPEC_ASHIFT_SIGNED       ; Used in aarch-simd.md.
 
24162
     UNSPEC_ASHIFT_UNSIGNED     ; Used in aarch64-simd.md.
 
24163
+    UNSPEC_FMAX                ; Used in aarch64-simd.md.
 
24164
+    UNSPEC_FMAXNMV     ; Used in aarch64-simd.md.
 
24165
     UNSPEC_FMAXV       ; Used in aarch64-simd.md.
 
24166
+    UNSPEC_FMIN                ; Used in aarch64-simd.md.
 
24167
+    UNSPEC_FMINNMV     ; Used in aarch64-simd.md.
 
24168
     UNSPEC_FMINV       ; Used in aarch64-simd.md.
 
24169
     UNSPEC_FADDV       ; Used in aarch64-simd.md.
 
24170
-    UNSPEC_ADDV                ; Used in aarch64-simd.md.
 
24171
+    UNSPEC_SADDV       ; Used in aarch64-simd.md.
 
24172
+    UNSPEC_UADDV       ; Used in aarch64-simd.md.
 
24173
     UNSPEC_SMAXV       ; Used in aarch64-simd.md.
 
24174
     UNSPEC_SMINV       ; Used in aarch64-simd.md.
 
24175
     UNSPEC_UMAXV       ; Used in aarch64-simd.md.
 
24176
@@ -213,13 +230,6 @@
 
24177
     UNSPEC_URSHL       ; Used in aarch64-simd.md.
 
24178
     UNSPEC_SQRSHL      ; Used in aarch64-simd.md.
 
24179
     UNSPEC_UQRSHL      ; Used in aarch64-simd.md.
 
24180
-    UNSPEC_CMEQ                ; Used in aarch64-simd.md.
 
24181
-    UNSPEC_CMLE                ; Used in aarch64-simd.md.
 
24182
-    UNSPEC_CMLT                ; Used in aarch64-simd.md.
 
24183
-    UNSPEC_CMGE                ; Used in aarch64-simd.md.
 
24184
-    UNSPEC_CMGT                ; Used in aarch64-simd.md.
 
24185
-    UNSPEC_CMHS                ; Used in aarch64-simd.md.
 
24186
-    UNSPEC_CMHI                ; Used in aarch64-simd.md.
 
24187
     UNSPEC_SSLI                ; Used in aarch64-simd.md.
 
24188
     UNSPEC_USLI                ; Used in aarch64-simd.md.
 
24189
     UNSPEC_SSRI                ; Used in aarch64-simd.md.
 
24190
@@ -227,10 +237,6 @@
 
24191
     UNSPEC_SSHLL       ; Used in aarch64-simd.md.
 
24192
     UNSPEC_USHLL       ; Used in aarch64-simd.md.
 
24193
     UNSPEC_ADDP                ; Used in aarch64-simd.md.
 
24194
-    UNSPEC_CMTST       ; Used in aarch64-simd.md.
 
24195
-    UNSPEC_FMAX                ; Used in aarch64-simd.md.
 
24196
-    UNSPEC_FMIN                ; Used in aarch64-simd.md.
 
24197
-    UNSPEC_BSL         ; Used in aarch64-simd.md.
 
24198
     UNSPEC_TBL         ; Used in vector permute patterns.
 
24199
     UNSPEC_CONCAT      ; Used in vector permute patterns.
 
24200
     UNSPEC_ZIP1                ; Used in vector permute patterns.
 
24201
@@ -249,8 +255,12 @@
 
24202
 ;; 32-bit version and "%x0" in the 64-bit version.
 
24203
 (define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")])
 
24204
 
 
24205
+;; For constraints used in scalar immediate vector moves
 
24206
+(define_mode_attr hq [(HI "h") (QI "q")])
 
24207
+
 
24208
 ;; For scalar usage of vector/FP registers
 
24209
 (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d")
 
24210
+                   (SF "s") (DF "d")
 
24211
                    (V8QI "") (V16QI "")
 
24212
                    (V4HI "") (V8HI "")
 
24213
                    (V2SI "") (V4SI  "")
 
24214
@@ -305,7 +315,8 @@
 
24215
                         (V4SF ".4s") (V2DF ".2d")
 
24216
                         (DI   "")    (SI   "")
 
24217
                         (HI   "")    (QI   "")
 
24218
-                        (TI   "")])
 
24219
+                        (TI   "")    (SF   "")
 
24220
+                        (DF   "")])
 
24221
 
 
24222
 ;; Register suffix narrowed modes for VQN.
 
24223
 (define_mode_attr Vmntype [(V8HI ".8b") (V4SI ".4h")
 
24224
@@ -380,7 +391,8 @@
 
24225
 ;; Double modes of vector modes (lower case).
 
24226
 (define_mode_attr Vdbl [(V8QI "v16qi") (V4HI "v8hi")
 
24227
                        (V2SI "v4si")  (V2SF "v4sf")
 
24228
-                       (SI   "v2si")  (DI   "v2di")])
 
24229
+                       (SI   "v2si")  (DI   "v2di")
 
24230
+                       (DF   "v2df")])
 
24231
 
 
24232
 ;; Narrowed modes for VDN.
 
24233
 (define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI")
 
24234
@@ -435,6 +447,15 @@
 
24235
                         (V2SF "s") (V4SF "s")
 
24236
                         (V2DF "d")])
 
24237
 
 
24238
+;; Corresponding core element mode for each vector mode.  This is a
 
24239
+;; variation on <vw> mapping FP modes to GP regs.
 
24240
+(define_mode_attr vwcore  [(V8QI "w") (V16QI "w")
 
24241
+                          (V4HI "w") (V8HI "w")
 
24242
+                          (V2SI "w") (V4SI "w")
 
24243
+                          (DI   "x") (V2DI "x")
 
24244
+                          (V2SF "w") (V4SF "w")
 
24245
+                          (V2DF "x")])
 
24246
+
 
24247
 ;; Double vector types for ALLX.
 
24248
 (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")])
 
24249
 
 
24250
@@ -444,7 +465,8 @@
 
24251
                                (V2SI "V2SI") (V4SI  "V4SI")
 
24252
                                (DI   "DI")   (V2DI  "V2DI")
 
24253
                                (V2SF "V2SI") (V4SF  "V4SI")
 
24254
-                               (V2DF "V2DI")])
 
24255
+                               (V2DF "V2DI") (DF    "DI")
 
24256
+                               (SF   "SI")])
 
24257
 
 
24258
 ;; Lower case mode of results of comparison operations.
 
24259
 (define_mode_attr v_cmp_result [(V8QI "v8qi") (V16QI "v16qi")
 
24260
@@ -452,7 +474,8 @@
 
24261
                                (V2SI "v2si") (V4SI  "v4si")
 
24262
                                (DI   "di")   (V2DI  "v2di")
 
24263
                                (V2SF "v2si") (V4SF  "v4si")
 
24264
-                               (V2DF "v2di")])
 
24265
+                               (V2DF "v2di") (DF    "di")
 
24266
+                               (SF   "si")])
 
24267
 
 
24268
 ;; Vm for lane instructions is restricted to FP_LO_REGS.
 
24269
 (define_mode_attr vwx [(V4HI "x") (V8HI "x") (HI "x")
 
24270
@@ -528,9 +551,14 @@
 
24271
 ;; Iterator for integer conversions
 
24272
 (define_code_iterator FIXUORS [fix unsigned_fix])
 
24273
 
 
24274
+;; Iterator for float conversions
 
24275
+(define_code_iterator FLOATUORS [float unsigned_float])
 
24276
+
 
24277
 ;; Code iterator for variants of vector max and min.
 
24278
 (define_code_iterator MAXMIN [smax smin umax umin])
 
24279
 
 
24280
+(define_code_iterator FMAXMIN [smax smin])
 
24281
+
 
24282
 ;; Code iterator for variants of vector max and min.
 
24283
 (define_code_iterator ADDSUB [plus minus])
 
24284
 
 
24285
@@ -543,6 +571,15 @@
 
24286
 ;; Code iterator for signed variants of vector saturating binary ops.
 
24287
 (define_code_iterator SBINQOPS [ss_plus ss_minus])
 
24288
 
 
24289
+;; Comparison operators for <F>CM.
 
24290
+(define_code_iterator COMPARISONS [lt le eq ge gt])
 
24291
+
 
24292
+;; Unsigned comparison operators.
 
24293
+(define_code_iterator UCOMPARISONS [ltu leu geu gtu])
 
24294
+
 
24295
+;; Unsigned comparison operators.
 
24296
+(define_code_iterator FAC_COMPARISONS [lt le ge gt])
 
24297
+
 
24298
 ;; -------------------------------------------------------------------
 
24299
 ;; Code Attributes
 
24300
 ;; -------------------------------------------------------------------
 
24301
@@ -555,6 +592,10 @@
 
24302
                         (zero_extend "zero_extend")
 
24303
                         (sign_extract "extv")
 
24304
                         (zero_extract "extzv")
 
24305
+                        (fix "fix")
 
24306
+                        (unsigned_fix "fixuns")
 
24307
+                        (float "float")
 
24308
+                        (unsigned_float "floatuns")
 
24309
                         (and "and")
 
24310
                         (ior "ior")
 
24311
                         (xor "xor")
 
24312
@@ -571,12 +612,37 @@
 
24313
                         (eq "eq")
 
24314
                         (ne "ne")
 
24315
                         (lt "lt")
 
24316
-                        (ge "ge")])
 
24317
+                        (ge "ge")
 
24318
+                        (le "le")
 
24319
+                        (gt "gt")
 
24320
+                        (ltu "ltu")
 
24321
+                        (leu "leu")
 
24322
+                        (geu "geu")
 
24323
+                        (gtu "gtu")])
 
24324
 
 
24325
+;; For comparison operators we use the FCM* and CM* instructions.
 
24326
+;; As there are no CMLE or CMLT instructions which act on 3 vector
 
24327
+;; operands, we must use CMGE or CMGT and swap the order of the
 
24328
+;; source operands.
 
24329
+
 
24330
+(define_code_attr n_optab [(lt "gt") (le "ge") (eq "eq") (ge "ge") (gt "gt")
 
24331
+                          (ltu "hi") (leu "hs") (geu "hs") (gtu "hi")])
 
24332
+(define_code_attr cmp_1   [(lt "2") (le "2") (eq "1") (ge "1") (gt "1")
 
24333
+                          (ltu "2") (leu "2") (geu "1") (gtu "1")])
 
24334
+(define_code_attr cmp_2   [(lt "1") (le "1") (eq "2") (ge "2") (gt "2")
 
24335
+                          (ltu "1") (leu "1") (geu "2") (gtu "2")])
 
24336
+
 
24337
+(define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT")
 
24338
+                          (ltu "LTU") (leu "LEU") (geu "GEU") (gtu "GTU")])
 
24339
+
 
24340
+(define_code_attr fix_trunc_optab [(fix "fix_trunc")
 
24341
+                                  (unsigned_fix "fixuns_trunc")])
 
24342
+
 
24343
 ;; Optab prefix for sign/zero-extending operations
 
24344
 (define_code_attr su_optab [(sign_extend "") (zero_extend "u")
 
24345
                            (div "") (udiv "u")
 
24346
                            (fix "") (unsigned_fix "u")
 
24347
+                           (float "s") (unsigned_float "u")
 
24348
                            (ss_plus "s") (us_plus "u")
 
24349
                            (ss_minus "s") (us_minus "u")])
 
24350
 
 
24351
@@ -601,7 +667,9 @@
 
24352
 (define_code_attr su [(sign_extend "s") (zero_extend "u")
 
24353
                      (sign_extract "s") (zero_extract "u")
 
24354
                      (fix "s") (unsigned_fix "u")
 
24355
-                     (div "s") (udiv "u")])
 
24356
+                     (div "s") (udiv "u")
 
24357
+                     (smax "s") (umax "u")
 
24358
+                     (smin "s") (umin "u")])
 
24359
 
 
24360
 ;; Emit cbz/cbnz depending on comparison type.
 
24361
 (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")])
 
24362
@@ -610,10 +678,10 @@
 
24363
 (define_code_attr tbz [(eq "tbz") (ne "tbnz") (lt "tbnz") (ge "tbz")])
 
24364
 
 
24365
 ;; Max/min attributes.
 
24366
-(define_code_attr maxmin [(smax "smax")
 
24367
-                         (smin "smin")
 
24368
-                         (umax "umax")
 
24369
-                         (umin "umin")])
 
24370
+(define_code_attr maxmin [(smax "max")
 
24371
+                         (smin "min")
 
24372
+                         (umax "max")
 
24373
+                         (umin "min")])
 
24374
 
 
24375
 ;; MLA/MLS attributes.
 
24376
 (define_code_attr as [(ss_plus "a") (ss_minus "s")])
 
24377
@@ -635,8 +703,11 @@
 
24378
 (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV
 
24379
                              UNSPEC_SMAXV UNSPEC_SMINV])
 
24380
 
 
24381
-(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV])
 
24382
+(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV
 
24383
+                              UNSPEC_FMAXNMV UNSPEC_FMINNMV])
 
24384
 
 
24385
+(define_int_iterator SUADDV [UNSPEC_SADDV UNSPEC_UADDV])
 
24386
+
 
24387
 (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD
 
24388
                              UNSPEC_SRHADD UNSPEC_URHADD
 
24389
                              UNSPEC_SHSUB UNSPEC_UHSUB
 
24390
@@ -649,7 +720,7 @@
 
24391
 (define_int_iterator ADDSUBHN2 [UNSPEC_ADDHN2 UNSPEC_RADDHN2
 
24392
                                UNSPEC_SUBHN2 UNSPEC_RSUBHN2])
 
24393
 
 
24394
-(define_int_iterator FMAXMIN [UNSPEC_FMAX UNSPEC_FMIN])
 
24395
+(define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN])
 
24396
 
 
24397
 (define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH])
 
24398
 
 
24399
@@ -680,35 +751,44 @@
 
24400
                                UNSPEC_SQSHRN UNSPEC_UQSHRN
 
24401
                                UNSPEC_SQRSHRN UNSPEC_UQRSHRN])
 
24402
 
 
24403
-(define_int_iterator VCMP_S [UNSPEC_CMEQ UNSPEC_CMGE UNSPEC_CMGT
 
24404
-                            UNSPEC_CMLE UNSPEC_CMLT])
 
24405
-
 
24406
-(define_int_iterator VCMP_U [UNSPEC_CMHS UNSPEC_CMHI UNSPEC_CMTST])
 
24407
-
 
24408
 (define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2
 
24409
                              UNSPEC_TRN1 UNSPEC_TRN2
 
24410
                              UNSPEC_UZP1 UNSPEC_UZP2])
 
24411
 
 
24412
 (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
 
24413
-                            UNSPEC_FRINTI UNSPEC_FRINTX UNSPEC_FRINTA])
 
24414
+                            UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX
 
24415
+                            UNSPEC_FRINTA])
 
24416
 
 
24417
 (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
 
24418
-                           UNSPEC_FRINTA])
 
24419
+                           UNSPEC_FRINTA UNSPEC_FRINTN])
 
24420
 
 
24421
+(define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX])
 
24422
+
 
24423
 ;; -------------------------------------------------------------------
 
24424
 ;; Int Iterators Attributes.
 
24425
 ;; -------------------------------------------------------------------
 
24426
-(define_int_attr  maxminv [(UNSPEC_UMAXV "umax")
 
24427
-                          (UNSPEC_UMINV "umin")
 
24428
-                          (UNSPEC_SMAXV "smax")
 
24429
-                          (UNSPEC_SMINV "smin")])
 
24430
+(define_int_attr  maxmin_uns [(UNSPEC_UMAXV "umax")
 
24431
+                             (UNSPEC_UMINV "umin")
 
24432
+                             (UNSPEC_SMAXV "smax")
 
24433
+                             (UNSPEC_SMINV "smin")
 
24434
+                             (UNSPEC_FMAX  "smax_nan")
 
24435
+                             (UNSPEC_FMAXNMV "smax")
 
24436
+                             (UNSPEC_FMAXV "smax_nan")
 
24437
+                             (UNSPEC_FMIN "smin_nan")
 
24438
+                             (UNSPEC_FMINNMV "smin")
 
24439
+                             (UNSPEC_FMINV "smin_nan")])
 
24440
 
 
24441
-(define_int_attr  fmaxminv [(UNSPEC_FMAXV "max")
 
24442
-                           (UNSPEC_FMINV "min")])
 
24443
+(define_int_attr  maxmin_uns_op [(UNSPEC_UMAXV "umax")
 
24444
+                                (UNSPEC_UMINV "umin")
 
24445
+                                (UNSPEC_SMAXV "smax")
 
24446
+                                (UNSPEC_SMINV "smin")
 
24447
+                                (UNSPEC_FMAX "fmax")
 
24448
+                                (UNSPEC_FMAXNMV "fmaxnm")
 
24449
+                                (UNSPEC_FMAXV "fmax")
 
24450
+                                (UNSPEC_FMIN "fmin")
 
24451
+                                (UNSPEC_FMINNMV "fminnm")
 
24452
+                                (UNSPEC_FMINV "fmin")])
 
24453
 
 
24454
-(define_int_attr  fmaxmin [(UNSPEC_FMAX "fmax")
 
24455
-                          (UNSPEC_FMIN "fmin")])
 
24456
-
 
24457
 (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u")
 
24458
                      (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur")
 
24459
                      (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u")
 
24460
@@ -719,6 +799,7 @@
 
24461
                      (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r")
 
24462
                      (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u")
 
24463
                      (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su")
 
24464
+                     (UNSPEC_SADDV "s") (UNSPEC_UADDV "u")
 
24465
                      (UNSPEC_SSLI  "s") (UNSPEC_USLI  "u")
 
24466
                      (UNSPEC_SSRI  "s") (UNSPEC_USRI  "u")
 
24467
                      (UNSPEC_USRA  "u") (UNSPEC_SSRA  "s")
 
24468
@@ -768,12 +849,6 @@
 
24469
                         (UNSPEC_RADDHN2 "add")
 
24470
                         (UNSPEC_RSUBHN2 "sub")])
 
24471
 
 
24472
-(define_int_attr cmp [(UNSPEC_CMGE "ge") (UNSPEC_CMGT "gt")
 
24473
-                     (UNSPEC_CMLE "le") (UNSPEC_CMLT "lt")
 
24474
-                      (UNSPEC_CMEQ "eq")
 
24475
-                     (UNSPEC_CMHS "hs") (UNSPEC_CMHI "hi")
 
24476
-                     (UNSPEC_CMTST "tst")])
 
24477
-
 
24478
 (define_int_attr offsetlr [(UNSPEC_SSLI        "1") (UNSPEC_USLI "1")
 
24479
                           (UNSPEC_SSRI "0") (UNSPEC_USRI "0")])
 
24480
 
 
24481
@@ -783,15 +858,18 @@
 
24482
                                (UNSPEC_FRINTM "floor")
 
24483
                                (UNSPEC_FRINTI "nearbyint")
 
24484
                                (UNSPEC_FRINTX "rint")
 
24485
-                               (UNSPEC_FRINTA "round")])
 
24486
+                               (UNSPEC_FRINTA "round")
 
24487
+                               (UNSPEC_FRINTN "frintn")])
 
24488
 
 
24489
 ;; frint suffix for floating-point rounding instructions.
 
24490
 (define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p")
 
24491
                               (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i")
 
24492
-                              (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a")])
 
24493
+                              (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a")
 
24494
+                              (UNSPEC_FRINTN "n")])
 
24495
 
 
24496
 (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round")
 
24497
-                              (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor")])
 
24498
+                              (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor")
 
24499
+                              (UNSPEC_FRINTN "frintn")])
 
24500
 
 
24501
 (define_int_attr perm_insn [(UNSPEC_ZIP1 "zip") (UNSPEC_ZIP2 "zip")
 
24502
                            (UNSPEC_TRN1 "trn") (UNSPEC_TRN2 "trn")
 
24503
@@ -800,3 +878,5 @@
 
24504
 (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2")
 
24505
                            (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2")
 
24506
                            (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2")])
 
24507
+
 
24508
+(define_int_attr frecp_suffix  [(UNSPEC_FRECPE "e") (UNSPEC_FRECPX "x")])
 
24509
--- a/src/gcc/config/aarch64/aarch64.h
 
24510
+++ b/src/gcc/config/aarch64/aarch64.h
 
24511
@@ -151,6 +151,7 @@
 
24512
 #define AARCH64_FL_FP         (1 << 1) /* Has FP.  */
 
24513
 #define AARCH64_FL_CRYPTO     (1 << 2) /* Has crypto.  */
 
24514
 #define AARCH64_FL_SLOWMUL    (1 << 3) /* A slow multiply core.  */
 
24515
+#define AARCH64_FL_CRC        (1 << 4) /* Has CRC.  */
 
24516
 
 
24517
 /* Has FP and SIMD.  */
 
24518
 #define AARCH64_FL_FPSIMD     (AARCH64_FL_FP | AARCH64_FL_SIMD)
 
24519
@@ -163,6 +164,7 @@
 
24520
 
 
24521
 /* Macros to test ISA flags.  */
 
24522
 extern unsigned long aarch64_isa_flags;
 
24523
+#define AARCH64_ISA_CRC            (aarch64_isa_flags & AARCH64_FL_CRC)
 
24524
 #define AARCH64_ISA_CRYPTO         (aarch64_isa_flags & AARCH64_FL_CRYPTO)
 
24525
 #define AARCH64_ISA_FP             (aarch64_isa_flags & AARCH64_FL_FP)
 
24526
 #define AARCH64_ISA_SIMD           (aarch64_isa_flags & AARCH64_FL_SIMD)
 
24527
@@ -521,12 +523,6 @@
 
24528
 #endif
 
24529
 
 
24530
 
 
24531
-/* Which ABI to use.  */
 
24532
-enum arm_abi_type
 
24533
-{
 
24534
-  ARM_ABI_AAPCS64
 
24535
-};
 
24536
-
 
24537
 enum arm_pcs
 
24538
 {
 
24539
   ARM_PCS_AAPCS64,             /* Base standard AAPCS for 64 bit.  */
 
24540
@@ -534,11 +530,7 @@
 
24541
 };
 
24542
 
 
24543
 
 
24544
-extern enum arm_abi_type arm_abi;
 
24545
 extern enum arm_pcs arm_pcs_variant;
 
24546
-#ifndef ARM_DEFAULT_ABI
 
24547
-#define ARM_DEFAULT_ABI ARM_ABI_AAPCS64
 
24548
-#endif
 
24549
 
 
24550
 #ifndef ARM_DEFAULT_PCS
 
24551
 #define ARM_DEFAULT_PCS ARM_PCS_AAPCS64
 
24552
@@ -709,6 +701,8 @@
 
24553
 
 
24554
 #define SELECT_CC_MODE(OP, X, Y)       aarch64_select_cc_mode (OP, X, Y)
 
24555
 
 
24556
+#define REVERSIBLE_CC_MODE(MODE) 1
 
24557
+
 
24558
 #define REVERSE_CONDITION(CODE, MODE)          \
 
24559
   (((MODE) == CCFPmode || (MODE) == CCFPEmode) \
 
24560
    ? reverse_condition_maybe_unordered (CODE)  \
 
24561
@@ -758,9 +752,23 @@
 
24562
 #define PRINT_OPERAND_ADDRESS(STREAM, X) \
 
24563
   aarch64_print_operand_address (STREAM, X)
 
24564
 
 
24565
-#define FUNCTION_PROFILER(STREAM, LABELNO) \
 
24566
-  aarch64_function_profiler (STREAM, LABELNO)
 
24567
+#define MCOUNT_NAME "_mcount"
 
24568
 
 
24569
+#define NO_PROFILE_COUNTERS 1
 
24570
+
 
24571
+/* Emit rtl for profiling.  Output assembler code to FILE
 
24572
+   to call "_mcount" for profiling a function entry.  */
 
24573
+#define PROFILE_HOOK(LABEL)                                    \
 
24574
+{                                                              \
 
24575
+  rtx fun,lr;                                                  \
 
24576
+  lr = get_hard_reg_initial_val (Pmode, LR_REGNUM);            \
 
24577
+  fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME);               \
 
24578
+  emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \
 
24579
+}
 
24580
+
 
24581
+/* All the work done in PROFILE_HOOK, but still required.  */
 
24582
+#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0)
 
24583
+
 
24584
 /* For some reason, the Linux headers think they know how to define
 
24585
    these macros.  They don't!!!  */
 
24586
 #undef ASM_APP_ON
 
24587
--- a/src/gcc/config/arm/arm1020e.md
 
24588
+++ b/src/gcc/config/arm/arm1020e.md
 
24589
@@ -66,13 +66,14 @@
 
24590
 ;; ALU operations with no shifted operand
 
24591
 (define_insn_reservation "1020alu_op" 1 
 
24592
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24593
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
24594
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
24595
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
24596
  "1020a_e,1020a_m,1020a_w")
 
24597
 
 
24598
 ;; ALU operations with a shift-by-constant operand
 
24599
 (define_insn_reservation "1020alu_shift_op" 1 
 
24600
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24601
-      (eq_attr "type" "simple_alu_shift,alu_shift"))
 
24602
+      (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift"))
 
24603
  "1020a_e,1020a_m,1020a_w")
 
24604
 
 
24605
 ;; ALU operations with a shift-by-register operand
 
24606
@@ -81,7 +82,7 @@
 
24607
 ;; the execute stage.
 
24608
 (define_insn_reservation "1020alu_shift_reg_op" 2 
 
24609
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24610
-      (eq_attr "type" "alu_shift_reg"))
 
24611
+      (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg"))
 
24612
  "1020a_e*2,1020a_m,1020a_w")
 
24613
 
 
24614
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
24615
@@ -96,7 +97,7 @@
 
24616
 ;; until after the memory stage.
 
24617
 (define_insn_reservation "1020mult1" 2
 
24618
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24619
-      (eq_attr "insn" "smulxy,smulwy"))
 
24620
+      (eq_attr "type" "smulxy,smulwy"))
 
24621
  "1020a_e,1020a_m,1020a_w")
 
24622
 
 
24623
 ;; The "smlaxy" and "smlawx" instructions require two iterations through
 
24624
@@ -104,7 +105,7 @@
 
24625
 ;; the execute stage.
 
24626
 (define_insn_reservation "1020mult2" 2
 
24627
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24628
-      (eq_attr "insn" "smlaxy,smlalxy,smlawx"))
 
24629
+      (eq_attr "type" "smlaxy,smlalxy,smlawx"))
 
24630
  "1020a_e*2,1020a_m,1020a_w")
 
24631
 
 
24632
 ;; The "smlalxy", "mul", and "mla" instructions require two iterations
 
24633
@@ -112,7 +113,7 @@
 
24634
 ;; the memory stage.
 
24635
 (define_insn_reservation "1020mult3" 3
 
24636
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24637
-      (eq_attr "insn" "smlalxy,mul,mla"))
 
24638
+      (eq_attr "type" "smlalxy,mul,mla"))
 
24639
  "1020a_e*2,1020a_m,1020a_w")
 
24640
 
 
24641
 ;; The "muls" and "mlas" instructions loop in the execute stage for
 
24642
@@ -120,7 +121,7 @@
 
24643
 ;; available after three iterations.
 
24644
 (define_insn_reservation "1020mult4" 3
 
24645
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24646
-      (eq_attr "insn" "muls,mlas"))
 
24647
+      (eq_attr "type" "muls,mlas"))
 
24648
  "1020a_e*4,1020a_m,1020a_w")
 
24649
 
 
24650
 ;; Long multiply instructions that produce two registers of
 
24651
@@ -135,7 +136,7 @@
 
24652
 ;; available after the memory cycle.
 
24653
 (define_insn_reservation "1020mult5" 4
 
24654
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24655
-      (eq_attr "insn" "umull,umlal,smull,smlal"))
 
24656
+      (eq_attr "type" "umull,umlal,smull,smlal"))
 
24657
  "1020a_e*3,1020a_m,1020a_w")
 
24658
 
 
24659
 ;; The "umulls", "umlals", "smulls", and "smlals" instructions loop in
 
24660
@@ -143,7 +144,7 @@
 
24661
 ;; The value result is available after four iterations.
 
24662
 (define_insn_reservation "1020mult6" 4
 
24663
  (and (eq_attr "tune" "arm1020e,arm1022e")
 
24664
-      (eq_attr "insn" "umulls,umlals,smulls,smlals"))
 
24665
+      (eq_attr "type" "umulls,umlals,smulls,smlals"))
 
24666
  "1020a_e*5,1020a_m,1020a_w")
 
24667
 
 
24668
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
24669
--- a/src/gcc/config/arm/cortex-a15.md
 
24670
+++ b/src/gcc/config/arm/cortex-a15.md
 
24671
@@ -61,14 +61,16 @@
 
24672
 ;; Simple ALU without shift
 
24673
 (define_insn_reservation "cortex_a15_alu" 2
 
24674
   (and (eq_attr "tune" "cortexa15")
 
24675
-       (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
24676
+       (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
24677
+                             mov_imm,mov_reg,\
 
24678
+                             mvn_imm,mvn_reg")
 
24679
             (eq_attr "neon_type" "none")))
 
24680
   "ca15_issue1,(ca15_sx1,ca15_sx1_alu)|(ca15_sx2,ca15_sx2_alu)")
 
24681
 
 
24682
 ;; ALU ops with immediate shift
 
24683
 (define_insn_reservation "cortex_a15_alu_shift" 3
 
24684
   (and (eq_attr "tune" "cortexa15")
 
24685
-       (and (eq_attr "type" "simple_alu_shift,alu_shift")
 
24686
+       (and (eq_attr "type" "extend,arlo_shift,,mov_shift,mvn_shift")
 
24687
             (eq_attr "neon_type" "none")))
 
24688
   "ca15_issue1,(ca15_sx1,ca15_sx1+ca15_sx1_shf,ca15_sx1_alu)\
 
24689
               |(ca15_sx2,ca15_sx2+ca15_sx2_shf,ca15_sx2_alu)")
 
24690
@@ -76,7 +78,7 @@
 
24691
 ;; ALU ops with register controlled shift
 
24692
 (define_insn_reservation "cortex_a15_alu_shift_reg" 3
 
24693
   (and (eq_attr "tune" "cortexa15")
 
24694
-       (and (eq_attr "type" "alu_shift_reg")
 
24695
+       (and (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg")
 
24696
            (eq_attr "neon_type" "none")))
 
24697
   "(ca15_issue2,ca15_sx1+ca15_sx2,ca15_sx1_shf,ca15_sx2_alu)\
 
24698
    |(ca15_issue1,(ca15_issue1+ca15_sx2,ca15_sx1+ca15_sx2_shf)\
 
24699
@@ -87,28 +89,26 @@
 
24700
 ;; 32-bit multiplies
 
24701
 (define_insn_reservation "cortex_a15_mult32" 3
 
24702
   (and (eq_attr "tune" "cortexa15")
 
24703
-       (and (eq_attr "type" "mult")
 
24704
-           (and (eq_attr "neon_type" "none")
 
24705
-                (eq_attr "mul64" "no"))))
 
24706
+       (and (eq_attr "mul32" "yes")
 
24707
+           (eq_attr "neon_type" "none")))
 
24708
   "ca15_issue1,ca15_mx")
 
24709
 
 
24710
 ;; 64-bit multiplies
 
24711
 (define_insn_reservation "cortex_a15_mult64" 4
 
24712
   (and (eq_attr "tune" "cortexa15")
 
24713
-       (and (eq_attr "type" "mult")
 
24714
-           (and (eq_attr "neon_type" "none")
 
24715
-                (eq_attr "mul64" "yes"))))
 
24716
+       (and (eq_attr "mul64" "yes")
 
24717
+           (eq_attr "neon_type" "none")))
 
24718
   "ca15_issue1,ca15_mx*2")
 
24719
 
 
24720
 ;; Integer divide
 
24721
 (define_insn_reservation "cortex_a15_udiv" 9
 
24722
   (and (eq_attr "tune" "cortexa15")
 
24723
-       (eq_attr "insn" "udiv"))
 
24724
+       (eq_attr "type" "udiv"))
 
24725
   "ca15_issue1,ca15_mx")
 
24726
 
 
24727
 (define_insn_reservation "cortex_a15_sdiv" 10
 
24728
   (and (eq_attr "tune" "cortexa15")
 
24729
-       (eq_attr "insn" "sdiv"))
 
24730
+       (eq_attr "type" "sdiv"))
 
24731
   "ca15_issue1,ca15_mx")
 
24732
 
 
24733
 ;; Block all issue pipes for a cycle
 
24734
--- a/src/gcc/config/arm/arm-tables.opt
 
24735
+++ b/src/gcc/config/arm/arm-tables.opt
 
24736
@@ -250,6 +250,9 @@
 
24737
 Enum(processor_type) String(cortex-a15) Value(cortexa15)
 
24738
 
 
24739
 EnumValue
 
24740
+Enum(processor_type) String(cortex-a53) Value(cortexa53)
 
24741
+
 
24742
+EnumValue
 
24743
 Enum(processor_type) String(cortex-r4) Value(cortexr4)
 
24744
 
 
24745
 EnumValue
 
24746
@@ -259,6 +262,9 @@
 
24747
 Enum(processor_type) String(cortex-r5) Value(cortexr5)
 
24748
 
 
24749
 EnumValue
 
24750
+Enum(processor_type) String(cortex-r7) Value(cortexr7)
 
24751
+
 
24752
+EnumValue
 
24753
 Enum(processor_type) String(cortex-m4) Value(cortexm4)
 
24754
 
 
24755
 EnumValue
 
24756
--- a/src/gcc/config/arm/arm1026ejs.md
 
24757
+++ b/src/gcc/config/arm/arm1026ejs.md
 
24758
@@ -66,13 +66,14 @@
 
24759
 ;; ALU operations with no shifted operand
 
24760
 (define_insn_reservation "alu_op" 1 
 
24761
  (and (eq_attr "tune" "arm1026ejs")
 
24762
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
24763
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
24764
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
24765
  "a_e,a_m,a_w")
 
24766
 
 
24767
 ;; ALU operations with a shift-by-constant operand
 
24768
 (define_insn_reservation "alu_shift_op" 1 
 
24769
  (and (eq_attr "tune" "arm1026ejs")
 
24770
-      (eq_attr "type" "simple_alu_shift,alu_shift"))
 
24771
+      (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift"))
 
24772
  "a_e,a_m,a_w")
 
24773
 
 
24774
 ;; ALU operations with a shift-by-register operand
 
24775
@@ -81,7 +82,7 @@
 
24776
 ;; the execute stage.
 
24777
 (define_insn_reservation "alu_shift_reg_op" 2 
 
24778
  (and (eq_attr "tune" "arm1026ejs")
 
24779
-      (eq_attr "type" "alu_shift_reg"))
 
24780
+      (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg"))
 
24781
  "a_e*2,a_m,a_w")
 
24782
 
 
24783
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
24784
@@ -96,7 +97,7 @@
 
24785
 ;; until after the memory stage.
 
24786
 (define_insn_reservation "mult1" 2
 
24787
  (and (eq_attr "tune" "arm1026ejs")
 
24788
-      (eq_attr "insn" "smulxy,smulwy"))
 
24789
+      (eq_attr "type" "smulxy,smulwy"))
 
24790
  "a_e,a_m,a_w")
 
24791
 
 
24792
 ;; The "smlaxy" and "smlawx" instructions require two iterations through
 
24793
@@ -104,7 +105,7 @@
 
24794
 ;; the execute stage.
 
24795
 (define_insn_reservation "mult2" 2
 
24796
  (and (eq_attr "tune" "arm1026ejs")
 
24797
-      (eq_attr "insn" "smlaxy,smlalxy,smlawx"))
 
24798
+      (eq_attr "type" "smlaxy,smlalxy,smlawx"))
 
24799
  "a_e*2,a_m,a_w")
 
24800
 
 
24801
 ;; The "smlalxy", "mul", and "mla" instructions require two iterations
 
24802
@@ -112,7 +113,7 @@
 
24803
 ;; the memory stage.
 
24804
 (define_insn_reservation "mult3" 3
 
24805
  (and (eq_attr "tune" "arm1026ejs")
 
24806
-      (eq_attr "insn" "smlalxy,mul,mla"))
 
24807
+      (eq_attr "type" "smlalxy,mul,mla"))
 
24808
  "a_e*2,a_m,a_w")
 
24809
 
 
24810
 ;; The "muls" and "mlas" instructions loop in the execute stage for
 
24811
@@ -120,7 +121,7 @@
 
24812
 ;; available after three iterations.
 
24813
 (define_insn_reservation "mult4" 3
 
24814
  (and (eq_attr "tune" "arm1026ejs")
 
24815
-      (eq_attr "insn" "muls,mlas"))
 
24816
+      (eq_attr "type" "muls,mlas"))
 
24817
  "a_e*4,a_m,a_w")
 
24818
 
 
24819
 ;; Long multiply instructions that produce two registers of
 
24820
@@ -135,7 +136,7 @@
 
24821
 ;; available after the memory cycle.
 
24822
 (define_insn_reservation "mult5" 4
 
24823
  (and (eq_attr "tune" "arm1026ejs")
 
24824
-      (eq_attr "insn" "umull,umlal,smull,smlal"))
 
24825
+      (eq_attr "type" "umull,umlal,smull,smlal"))
 
24826
  "a_e*3,a_m,a_w")
 
24827
 
 
24828
 ;; The "umulls", "umlals", "smulls", and "smlals" instructions loop in
 
24829
@@ -143,7 +144,7 @@
 
24830
 ;; The value result is available after four iterations.
 
24831
 (define_insn_reservation "mult6" 4
 
24832
  (and (eq_attr "tune" "arm1026ejs")
 
24833
-      (eq_attr "insn" "umulls,umlals,smulls,smlals"))
 
24834
+      (eq_attr "type" "umulls,umlals,smulls,smlals"))
 
24835
  "a_e*5,a_m,a_w")
 
24836
 
 
24837
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
24838
--- a/src/gcc/config/arm/linux-elf.h
 
24839
+++ b/src/gcc/config/arm/linux-elf.h
 
24840
@@ -44,9 +44,9 @@
 
24841
 
 
24842
 #define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
 
24843
 
 
24844
+/* We do not have any MULTILIB_OPTIONS specified, so there are no
 
24845
+   MULTILIB_DEFAULTS.  */
 
24846
 #undef  MULTILIB_DEFAULTS
 
24847
-#define MULTILIB_DEFAULTS \
 
24848
-       { "marm", "mlittle-endian", "mfloat-abi=hard", "mno-thumb-interwork" }
 
24849
 
 
24850
 /* Now we define the strings used to build the spec file.  */
 
24851
 #undef  LIB_SPEC
 
24852
--- a/src/gcc/config/arm/arm1136jfs.md
 
24853
+++ b/src/gcc/config/arm/arm1136jfs.md
 
24854
@@ -75,13 +75,14 @@
 
24855
 ;; ALU operations with no shifted operand
 
24856
 (define_insn_reservation "11_alu_op" 2
 
24857
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24858
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
24859
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
24860
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
24861
  "e_1,e_2,e_3,e_wb")
 
24862
 
 
24863
 ;; ALU operations with a shift-by-constant operand
 
24864
 (define_insn_reservation "11_alu_shift_op" 2
 
24865
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24866
-      (eq_attr "type" "simple_alu_shift,alu_shift"))
 
24867
+      (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift"))
 
24868
  "e_1,e_2,e_3,e_wb")
 
24869
 
 
24870
 ;; ALU operations with a shift-by-register operand
 
24871
@@ -90,7 +91,7 @@
 
24872
 ;; the shift stage.
 
24873
 (define_insn_reservation "11_alu_shift_reg_op" 3
 
24874
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24875
-      (eq_attr "type" "alu_shift_reg"))
 
24876
+      (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg"))
 
24877
  "e_1*2,e_2,e_3,e_wb")
 
24878
 
 
24879
 ;; alu_ops can start sooner, if there is no shifter dependency
 
24880
@@ -129,13 +130,13 @@
 
24881
 ;; Multiply and multiply-accumulate results are available after four stages.
 
24882
 (define_insn_reservation "11_mult1" 4
 
24883
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24884
-      (eq_attr "insn" "mul,mla"))
 
24885
+      (eq_attr "type" "mul,mla"))
 
24886
  "e_1*2,e_2,e_3,e_wb")
 
24887
 
 
24888
 ;; The *S variants set the condition flags, which requires three more cycles.
 
24889
 (define_insn_reservation "11_mult2" 4
 
24890
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24891
-      (eq_attr "insn" "muls,mlas"))
 
24892
+      (eq_attr "type" "muls,mlas"))
 
24893
  "e_1*2,e_2,e_3,e_wb")
 
24894
 
 
24895
 (define_bypass 3 "11_mult1,11_mult2"
 
24896
@@ -160,13 +161,13 @@
 
24897
 ;; the two multiply-accumulate instructions.
 
24898
 (define_insn_reservation "11_mult3" 5
 
24899
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24900
-      (eq_attr "insn" "smull,umull,smlal,umlal"))
 
24901
+      (eq_attr "type" "smull,umull,smlal,umlal"))
 
24902
  "e_1*3,e_2,e_3,e_wb*2")
 
24903
 
 
24904
 ;; The *S variants set the condition flags, which requires three more cycles.
 
24905
 (define_insn_reservation "11_mult4" 5
 
24906
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24907
-      (eq_attr "insn" "smulls,umulls,smlals,umlals"))
 
24908
+      (eq_attr "type" "smulls,umulls,smlals,umlals"))
 
24909
  "e_1*3,e_2,e_3,e_wb*2")
 
24910
 
 
24911
 (define_bypass 4 "11_mult3,11_mult4"
 
24912
@@ -190,7 +191,8 @@
 
24913
 ;; cycles.
 
24914
 (define_insn_reservation "11_mult5" 3
 
24915
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24916
-      (eq_attr "insn" "smulxy,smlaxy,smulwy,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx"))
 
24917
+      (eq_attr "type" "smulxy,smlaxy,smulwy,smlawy,smuad,smuadx,smlad,smladx,\
 
24918
+                       smusd,smusdx,smlsd,smlsdx"))
 
24919
  "e_1,e_2,e_3,e_wb")
 
24920
 
 
24921
 (define_bypass 2 "11_mult5"
 
24922
@@ -211,14 +213,14 @@
 
24923
 ;; The same idea, then the 32-bit result is added to a 64-bit quantity.
 
24924
 (define_insn_reservation "11_mult6" 4
 
24925
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24926
-      (eq_attr "insn" "smlalxy"))
 
24927
+      (eq_attr "type" "smlalxy"))
 
24928
  "e_1*2,e_2,e_3,e_wb*2")
 
24929
 
 
24930
 ;; Signed 32x32 multiply, then the most significant 32 bits are extracted
 
24931
 ;; and are available after the memory stage.
 
24932
 (define_insn_reservation "11_mult7" 4
 
24933
  (and (eq_attr "tune" "arm1136js,arm1136jfs")
 
24934
-      (eq_attr "insn" "smmul,smmulr"))
 
24935
+      (eq_attr "type" "smmul,smmulr"))
 
24936
  "e_1*2,e_2,e_3,e_wb")
 
24937
 
 
24938
 (define_bypass 3 "11_mult6,11_mult7"
 
24939
--- a/src/gcc/config/arm/marvell-pj4.md
 
24940
+++ b/src/gcc/config/arm/marvell-pj4.md
 
24941
@@ -41,64 +41,68 @@
 
24942
 
 
24943
 (define_insn_reservation "pj4_alu_e1" 1
 
24944
   (and (eq_attr "tune" "marvell_pj4")
 
24945
-       (eq_attr "type" "simple_alu_imm,alu_reg")
 
24946
-       (not (eq_attr "conds" "set"))
 
24947
-       (eq_attr "insn" "mov,mvn"))
 
24948
+       (eq_attr "type" "mov_imm,mov_reg,mvn_imm,mvn_reg")
 
24949
+       (not (eq_attr "conds" "set")))
 
24950
                                "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24951
 
 
24952
 (define_insn_reservation "pj4_alu_e1_conds" 4
 
24953
   (and (eq_attr "tune" "marvell_pj4")
 
24954
-       (eq_attr "type" "simple_alu_imm,alu_reg")
 
24955
-       (eq_attr "conds" "set")
 
24956
-       (eq_attr "insn" "mov,mvn"))
 
24957
+       (eq_attr "type" "mov_imm,mov_reg,mvn_imm,mvn_reg")
 
24958
+       (eq_attr "conds" "set"))
 
24959
                                "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24960
 
 
24961
 (define_insn_reservation "pj4_alu" 1
 
24962
   (and (eq_attr "tune" "marvell_pj4")
 
24963
-       (eq_attr "type" "simple_alu_imm,alu_reg")
 
24964
-       (not (eq_attr "conds" "set"))
 
24965
-       (not (eq_attr "insn" "mov,mvn")))
 
24966
+       (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg")
 
24967
+       (not (eq_attr "conds" "set")))
 
24968
                                "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24969
 
 
24970
 (define_insn_reservation "pj4_alu_conds" 4
 
24971
   (and (eq_attr "tune" "marvell_pj4")
 
24972
-       (eq_attr "type" "simple_alu_imm,alu_reg")
 
24973
-       (eq_attr "conds" "set")
 
24974
-       (not (eq_attr "insn" "mov,mvn")))
 
24975
+       (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg")
 
24976
+       (eq_attr "conds" "set"))
 
24977
                                "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24978
 
 
24979
 (define_insn_reservation "pj4_shift" 1
 
24980
   (and (eq_attr "tune" "marvell_pj4")
 
24981
-       (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift")
 
24982
+       (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\
 
24983
+                        mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg")
 
24984
        (not (eq_attr "conds" "set"))
 
24985
        (eq_attr "shift" "1"))  "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24986
 
 
24987
 (define_insn_reservation "pj4_shift_conds" 4
 
24988
   (and (eq_attr "tune" "marvell_pj4")
 
24989
-       (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift")
 
24990
+       (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\
 
24991
+                        mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg")
 
24992
        (eq_attr "conds" "set")
 
24993
        (eq_attr "shift" "1"))  "pj4_is,(pj4_alu1,pj4_w1+pj4_cp)|(pj4_alu2,pj4_w2+pj4_cp)")
 
24994
 
 
24995
 (define_insn_reservation "pj4_alu_shift" 1
 
24996
   (and (eq_attr "tune" "marvell_pj4")
 
24997
        (not (eq_attr "conds" "set"))
 
24998
-       (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift"))
 
24999
+       (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\
 
25000
+                        mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg"))
 
25001
                                "pj4_is,(pj4_alu1,nothing,pj4_w1+pj4_cp)|(pj4_alu2,nothing,pj4_w2+pj4_cp)")
 
25002
 
 
25003
 (define_insn_reservation "pj4_alu_shift_conds" 4
 
25004
   (and (eq_attr "tune" "marvell_pj4")
 
25005
        (eq_attr "conds" "set")
 
25006
-       (eq_attr "type" "alu_shift,alu_shift_reg,simple_alu_shift"))
 
25007
+       (eq_attr "type" "arlo_shift,arlo_shift_reg,extend,\
 
25008
+                        mov_shift,mvn_shift,mov_shift_reg,mvn_shift_reg"))
 
25009
                                "pj4_is,(pj4_alu1,nothing,pj4_w1+pj4_cp)|(pj4_alu2,nothing,pj4_w2+pj4_cp)")
 
25010
 
 
25011
 (define_bypass 2 "pj4_alu_shift,pj4_shift"
 
25012
                  "pj4_ir_mul,pj4_ir_div,pj4_core_to_vfp")
 
25013
 
 
25014
 (define_insn_reservation "pj4_ir_mul" 3
 
25015
-  (and (eq_attr "tune" "marvell_pj4") (eq_attr "type" "mult")) "pj4_is,pj4_mul,nothing*2,pj4_cp")
 
25016
+  (and (eq_attr "tune" "marvell_pj4")
 
25017
+       (ior (eq_attr "mul32" "yes")
 
25018
+            (eq_attr "mul64" "yes")))
 
25019
+                     "pj4_is,pj4_mul,nothing*2,pj4_cp")
 
25020
 
 
25021
 (define_insn_reservation "pj4_ir_div" 20
 
25022
-  (and (eq_attr "tune" "marvell_pj4") (eq_attr "insn" "udiv,sdiv")) "pj4_is,pj4_div*19,pj4_cp")
 
25023
+  (and (eq_attr "tune" "marvell_pj4") 
 
25024
+       (eq_attr "type" "udiv,sdiv")) "pj4_is,pj4_div*19,pj4_cp")
 
25025
 
 
25026
 ;; Branches and calls.
 
25027
 
 
25028
--- a/src/gcc/config/arm/thumb2.md
 
25029
+++ b/src/gcc/config/arm/thumb2.md
 
25030
@@ -60,105 +60,230 @@
 
25031
   "TARGET_THUMB2"
 
25032
   "bic%?\\t%0, %1, %2%S4"
 
25033
   [(set_attr "predicable" "yes")
 
25034
+   (set_attr "predicable_short_it" "no")
 
25035
    (set_attr "shift" "2")
 
25036
-   (set_attr "type" "alu_shift")]
 
25037
+   (set_attr "type" "arlo_shift")]
 
25038
 )
 
25039
 
 
25040
-(define_insn "*thumb2_smaxsi3"
 
25041
-  [(set (match_operand:SI          0 "s_register_operand" "=r,r,r")
 
25042
-       (smax:SI (match_operand:SI 1 "s_register_operand"  "0,r,?r")
 
25043
-                (match_operand:SI 2 "arm_rhs_operand"    "rI,0,rI")))
 
25044
+;; We use the '0' constraint for operand 1 because reload should
 
25045
+;; be smart enough to generate an appropriate move for the r/r/r case.
 
25046
+(define_insn_and_split "*thumb2_smaxsi3"
 
25047
+  [(set (match_operand:SI          0 "s_register_operand" "=r,l,r")
 
25048
+       (smax:SI (match_operand:SI 1 "s_register_operand" "%0,0,0")
 
25049
+                (match_operand:SI 2 "arm_rhs_operand"    "r,Py,I")))
 
25050
    (clobber (reg:CC CC_REGNUM))]
 
25051
-  "TARGET_THUMB2"
 
25052
-  "@
 
25053
-   cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %2
 
25054
-   cmp\\t%1, %2\;it\\tge\;movge\\t%0, %1
 
25055
-   cmp\\t%1, %2\;ite\\tge\;movge\\t%0, %1\;movlt\\t%0, %2"
 
25056
+   "TARGET_THUMB2"
 
25057
+   "#"
 
25058
+   ; cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %2
 
25059
+  "TARGET_THUMB2 && reload_completed"
 
25060
+  [(set (reg:CC CC_REGNUM)
 
25061
+        (compare:CC (match_dup 1) (match_dup 2)))
 
25062
+   (cond_exec (lt:SI (reg:CC CC_REGNUM) (const_int 0))
 
25063
+              (set (match_dup 0)
 
25064
+                   (match_dup 2)))]
 
25065
+  ""
 
25066
   [(set_attr "conds" "clob")
 
25067
-   (set_attr "length" "10,10,14")]
 
25068
+   (set_attr "enabled_for_depr_it" "yes,yes,no")
 
25069
+   (set_attr "length" "6,6,10")]
 
25070
 )
 
25071
 
 
25072
-(define_insn "*thumb2_sminsi3"
 
25073
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
25074
-       (smin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
 
25075
-                (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
25076
+(define_insn_and_split "*thumb2_sminsi3"
 
25077
+  [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
 
25078
+       (smin:SI (match_operand:SI 1 "s_register_operand" "%0,0,0")
 
25079
+                (match_operand:SI 2 "arm_rhs_operand" "r,Py,I")))
 
25080
    (clobber (reg:CC CC_REGNUM))]
 
25081
   "TARGET_THUMB2"
 
25082
-  "@
 
25083
-   cmp\\t%1, %2\;it\\tge\;movge\\t%0, %2
 
25084
-   cmp\\t%1, %2\;it\\tlt\;movlt\\t%0, %1
 
25085
-   cmp\\t%1, %2\;ite\\tlt\;movlt\\t%0, %1\;movge\\t%0, %2"
 
25086
+  "#"
 
25087
+  ; cmp\\t%1, %2\;it\\tge\;movge\\t%0, %2
 
25088
+  "TARGET_THUMB2 && reload_completed"
 
25089
+  [(set (reg:CC CC_REGNUM)
 
25090
+        (compare:CC (match_dup 1) (match_dup 2)))
 
25091
+   (cond_exec (ge:SI (reg:CC CC_REGNUM) (const_int 0))
 
25092
+              (set (match_dup 0)
 
25093
+                   (match_dup 2)))]
 
25094
+  ""
 
25095
   [(set_attr "conds" "clob")
 
25096
-   (set_attr "length" "10,10,14")]
 
25097
+   (set_attr "enabled_for_depr_it" "yes,yes,no")
 
25098
+   (set_attr "length" "6,6,10")]
 
25099
 )
 
25100
 
 
25101
-(define_insn "*thumb32_umaxsi3"
 
25102
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
25103
-       (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
 
25104
-                (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
25105
-   (clobber (reg:CC CC_REGNUM))]
 
25106
+(define_insn_and_split "*thumb32_umaxsi3"
 
25107
+  [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
 
25108
+       (umax:SI (match_operand:SI 1 "s_register_operand" "%0,0,0")
 
25109
+                (match_operand:SI 2 "arm_rhs_operand" "r,Py,I")))
 
25110
+  (clobber (reg:CC CC_REGNUM))]
 
25111
   "TARGET_THUMB2"
 
25112
-  "@
 
25113
-   cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %2
 
25114
-   cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %1
 
25115
-   cmp\\t%1, %2\;ite\\tcs\;movcs\\t%0, %1\;movcc\\t%0, %2"
 
25116
+  "#"
 
25117
+  ; cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %2
 
25118
+  "TARGET_THUMB2 && reload_completed"
 
25119
+  [(set (reg:CC CC_REGNUM)
 
25120
+        (compare:CC (match_dup 1) (match_dup 2)))
 
25121
+   (cond_exec (ltu:SI (reg:CC CC_REGNUM) (const_int 0))
 
25122
+              (set (match_dup 0)
 
25123
+                   (match_dup 2)))]
 
25124
+  ""
 
25125
   [(set_attr "conds" "clob")
 
25126
-   (set_attr "length" "10,10,14")]
 
25127
+   (set_attr "length" "6,6,10")
 
25128
+   (set_attr "enabled_for_depr_it" "yes,yes,no")]
 
25129
 )
 
25130
 
 
25131
-(define_insn "*thumb2_uminsi3"
 
25132
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
25133
-       (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
 
25134
-                (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
25135
+(define_insn_and_split "*thumb2_uminsi3"
 
25136
+  [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
 
25137
+       (umin:SI (match_operand:SI 1 "s_register_operand" "%0,0,0")
 
25138
+                (match_operand:SI 2 "arm_rhs_operand" "r,Py,I")))
 
25139
    (clobber (reg:CC CC_REGNUM))]
 
25140
   "TARGET_THUMB2"
 
25141
-  "@
 
25142
-   cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %2
 
25143
-   cmp\\t%1, %2\;it\\tcc\;movcc\\t%0, %1
 
25144
-   cmp\\t%1, %2\;ite\\tcc\;movcc\\t%0, %1\;movcs\\t%0, %2"
 
25145
+  "#"
 
25146
+  ; cmp\\t%1, %2\;it\\tcs\;movcs\\t%0, %2
 
25147
+  "TARGET_THUMB2 && reload_completed"
 
25148
+  [(set (reg:CC CC_REGNUM)
 
25149
+        (compare:CC (match_dup 1) (match_dup 2)))
 
25150
+   (cond_exec (geu:SI (reg:CC CC_REGNUM) (const_int 0))
 
25151
+              (set (match_dup 0)
 
25152
+                   (match_dup 2)))]
 
25153
+  ""
 
25154
   [(set_attr "conds" "clob")
 
25155
-   (set_attr "length" "10,10,14")]
 
25156
+   (set_attr "length" "6,6,10")
 
25157
+   (set_attr "enabled_for_depr_it" "yes,yes,no")]
 
25158
 )
 
25159
 
 
25160
 ;; Thumb-2 does not have rsc, so use a clever trick with shifter operands.
 
25161
-(define_insn "*thumb2_negdi2"
 
25162
+(define_insn_and_split "*thumb2_negdi2"
 
25163
   [(set (match_operand:DI         0 "s_register_operand" "=&r,r")
 
25164
        (neg:DI (match_operand:DI 1 "s_register_operand"  "?r,0")))
 
25165
    (clobber (reg:CC CC_REGNUM))]
 
25166
   "TARGET_THUMB2"
 
25167
-  "negs\\t%Q0, %Q1\;sbc\\t%R0, %R1, %R1, lsl #1"
 
25168
+  "#" ; negs\\t%Q0, %Q1\;sbc\\t%R0, %R1, %R1, lsl #1
 
25169
+  "&& reload_completed"
 
25170
+  [(parallel [(set (reg:CC CC_REGNUM)
 
25171
+                  (compare:CC (const_int 0) (match_dup 1)))
 
25172
+             (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1)))])
 
25173
+   (set (match_dup 2) (minus:SI (minus:SI (match_dup 3)
 
25174
+                                          (ashift:SI (match_dup 3)
 
25175
+                                                     (const_int 1)))
 
25176
+                                (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
25177
+  {
 
25178
+    operands[2] = gen_highpart (SImode, operands[0]);
 
25179
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
25180
+    operands[3] = gen_highpart (SImode, operands[1]);
 
25181
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
25182
+  }
 
25183
   [(set_attr "conds" "clob")
 
25184
    (set_attr "length" "8")]
 
25185
 )
 
25186
 
 
25187
-(define_insn "*thumb2_abssi2"
 
25188
-  [(set (match_operand:SI         0 "s_register_operand" "=r,&r")
 
25189
-       (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))
 
25190
+(define_insn_and_split "*thumb2_abssi2"
 
25191
+  [(set (match_operand:SI         0 "s_register_operand" "=&r,l,r")
 
25192
+       (abs:SI (match_operand:SI 1 "s_register_operand" "r,0,0")))
 
25193
    (clobber (reg:CC CC_REGNUM))]
 
25194
   "TARGET_THUMB2"
 
25195
-  "@
 
25196
-   cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0
 
25197
-   eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31"
 
25198
-  [(set_attr "conds" "clob,*")
 
25199
+  "#"
 
25200
+   ; eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31
 
25201
+   ; cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0
 
25202
+   ; cmp\\t%0, #0\;it\tlt\;rsblt\\t%0, %0, #0
 
25203
+  "&& reload_completed"
 
25204
+  [(const_int 0)]
 
25205
+  {
 
25206
+    if (REGNO(operands[0]) == REGNO(operands[1]))
 
25207
+      {
 
25208
+       rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
 
25209
+
 
25210
+       emit_insn (gen_rtx_SET (VOIDmode,
 
25211
+                               cc_reg,
 
25212
+                               gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
 
25213
+       emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25214
+                                    (gen_rtx_LT (SImode,
 
25215
+                                                 cc_reg,
 
25216
+                                                 const0_rtx)),
 
25217
+                                    (gen_rtx_SET (VOIDmode,
 
25218
+                                                  operands[0],
 
25219
+                                                  (gen_rtx_MINUS (SImode,
 
25220
+                                                                  const0_rtx,
 
25221
+                                                                  operands[1]))))));
 
25222
+      }
 
25223
+    else
 
25224
+      {
 
25225
+        emit_insn (gen_rtx_SET (VOIDmode,
 
25226
+                                operands[0],
 
25227
+                                gen_rtx_XOR (SImode,
 
25228
+                                             gen_rtx_ASHIFTRT (SImode,
 
25229
+                                                               operands[1],
 
25230
+                                                               GEN_INT (31)),
 
25231
+                                             operands[1])));
 
25232
+        emit_insn (gen_rtx_SET (VOIDmode,
 
25233
+                                operands[0],
 
25234
+                                gen_rtx_MINUS (SImode,
 
25235
+                                               operands[0],
 
25236
+                                               gen_rtx_ASHIFTRT (SImode,
 
25237
+                                                                 operands[1],
 
25238
+                                                                 GEN_INT (31)))));
 
25239
+      }
 
25240
+    DONE;
 
25241
+  }
 
25242
+  [(set_attr "conds" "*,clob,clob")
 
25243
    (set_attr "shift" "1")
 
25244
-   (set_attr "predicable" "no, yes")
 
25245
+   (set_attr "predicable" "yes,no,no")
 
25246
+   (set_attr "predicable_short_it" "no")
 
25247
+   (set_attr "enabled_for_depr_it" "yes,yes,no")
 
25248
    (set_attr "ce_count" "2")
 
25249
-   (set_attr "length" "10,8")]
 
25250
+   (set_attr "length" "8,6,10")]
 
25251
 )
 
25252
 
 
25253
-(define_insn "*thumb2_neg_abssi2"
 
25254
-  [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
 
25255
-       (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
 
25256
+(define_insn_and_split "*thumb2_neg_abssi2"
 
25257
+  [(set (match_operand:SI 0 "s_register_operand" "=&r,l,r")
 
25258
+       (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "r,0,0"))))
 
25259
    (clobber (reg:CC CC_REGNUM))]
 
25260
   "TARGET_THUMB2"
 
25261
-  "@
 
25262
-   cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0
 
25263
-   eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"
 
25264
-  [(set_attr "conds" "clob,*")
 
25265
+  "#"
 
25266
+   ; eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31
 
25267
+   ; cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0
 
25268
+   ; cmp\\t%0, #0\;it\\tgt\;rsbgt\\t%0, %0, #0
 
25269
+  "&& reload_completed"
 
25270
+  [(const_int 0)]
 
25271
+  {
 
25272
+    if (REGNO(operands[0]) == REGNO(operands[1]))
 
25273
+      {
 
25274
+       rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
 
25275
+
 
25276
+       emit_insn (gen_rtx_SET (VOIDmode,
 
25277
+                               cc_reg,
 
25278
+                               gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
 
25279
+       emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25280
+                                    (gen_rtx_GT (SImode,
 
25281
+                                                 cc_reg,
 
25282
+                                                 const0_rtx)),
 
25283
+                                    (gen_rtx_SET (VOIDmode,
 
25284
+                                                  operands[0],
 
25285
+                                                  (gen_rtx_MINUS (SImode,
 
25286
+                                                                  const0_rtx,
 
25287
+                                                                  operands[1]))))));
 
25288
+      }
 
25289
+    else
 
25290
+      {
 
25291
+        emit_insn (gen_rtx_SET (VOIDmode,
 
25292
+                                operands[0],
 
25293
+                                gen_rtx_XOR (SImode,
 
25294
+                                             gen_rtx_ASHIFTRT (SImode,
 
25295
+                                                               operands[1],
 
25296
+                                                               GEN_INT (31)),
 
25297
+                                             operands[1])));
 
25298
+        emit_insn (gen_rtx_SET (VOIDmode,
 
25299
+                                operands[0],
 
25300
+                                gen_rtx_MINUS (SImode,
 
25301
+                                               gen_rtx_ASHIFTRT (SImode,
 
25302
+                                                                 operands[1],
 
25303
+                                                                 GEN_INT (31)),
 
25304
+                                               operands[0])));
 
25305
+      }
 
25306
+    DONE;
 
25307
+  }
 
25308
+  [(set_attr "conds" "*,clob,clob")
 
25309
    (set_attr "shift" "1")
 
25310
-   (set_attr "predicable" "no, yes")
 
25311
+   (set_attr "predicable" "yes,no,no")
 
25312
+   (set_attr "enabled_for_depr_it" "yes,yes,no")
 
25313
+   (set_attr "predicable_short_it" "no")
 
25314
    (set_attr "ce_count" "2")
 
25315
-   (set_attr "length" "10,8")]
 
25316
+   (set_attr "length" "8,6,10")]
 
25317
 )
 
25318
 
 
25319
 ;; We have two alternatives here for memory loads (and similarly for stores)
 
25320
@@ -167,8 +292,8 @@
 
25321
 ;; regs.  The high register alternatives are not taken into account when
 
25322
 ;; choosing register preferences in order to reflect their expense.
 
25323
 (define_insn "*thumb2_movsi_insn"
 
25324
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,l ,*hk,m,*m")
 
25325
-       (match_operand:SI 1 "general_operand"      "rk ,I,K,j,mi,*mi,l,*hk"))]
 
25326
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,l,r,r,l ,*hk,m,*m")
 
25327
+       (match_operand:SI 1 "general_operand"      "rk,I,Py,K,j,mi,*mi,l,*hk"))]
 
25328
   "TARGET_THUMB2 && ! TARGET_IWMMXT
 
25329
    && !(TARGET_HARD_FLOAT && TARGET_VFP)
 
25330
    && (   register_operand (operands[0], SImode)
 
25331
@@ -176,16 +301,19 @@
 
25332
   "@
 
25333
    mov%?\\t%0, %1
 
25334
    mov%?\\t%0, %1
 
25335
+   mov%?\\t%0, %1
 
25336
    mvn%?\\t%0, #%B1
 
25337
    movw%?\\t%0, %1
 
25338
    ldr%?\\t%0, %1
 
25339
    ldr%?\\t%0, %1
 
25340
    str%?\\t%1, %0
 
25341
    str%?\\t%1, %0"
 
25342
-  [(set_attr "type" "*,*,simple_alu_imm,*,load1,load1,store1,store1")
 
25343
+  [(set_attr "type" "*,arlo_imm,arlo_imm,arlo_imm,*,load1,load1,store1,store1")
 
25344
+   (set_attr "length" "2,4,2,4,4,4,4,4,4")
 
25345
    (set_attr "predicable" "yes")
 
25346
-   (set_attr "pool_range" "*,*,*,*,1018,4094,*,*")
 
25347
-   (set_attr "neg_pool_range" "*,*,*,*,0,0,*,*")]
 
25348
+   (set_attr "predicable_short_it" "yes,no,yes,no,no,no,no,no,no")
 
25349
+   (set_attr "pool_range" "*,*,*,*,*,1018,4094,*,*")
 
25350
+   (set_attr "neg_pool_range" "*,*,*,*,*,0,0,*,*")]
 
25351
 )
 
25352
 
 
25353
 (define_insn "tls_load_dot_plus_four"
 
25354
@@ -223,6 +351,21 @@
 
25355
    (set_attr "neg_pool_range" "*,*,*,250")]
 
25356
 )
 
25357
 
 
25358
+(define_insn "*thumb2_storewb_pairsi"
 
25359
+  [(set (match_operand:SI 0 "register_operand" "=&kr")
 
25360
+       (plus:SI (match_operand:SI 1 "register_operand" "0")
 
25361
+                (match_operand:SI 2 "const_int_operand" "n")))
 
25362
+   (set (mem:SI (plus:SI (match_dup 0) (match_dup 2)))
 
25363
+       (match_operand:SI 3 "register_operand" "r"))
 
25364
+   (set (mem:SI (plus:SI (match_dup 0)
 
25365
+                        (match_operand:SI 5 "const_int_operand" "n")))
 
25366
+       (match_operand:SI 4 "register_operand" "r"))]
 
25367
+  "TARGET_THUMB2
 
25368
+   && INTVAL (operands[5]) == INTVAL (operands[2]) + 4"
 
25369
+  "strd\\t%3, %4, [%0, %2]!"
 
25370
+  [(set_attr "type" "store2")]
 
25371
+)
 
25372
+
 
25373
 (define_insn "*thumb2_cmpsi_neg_shiftsi"
 
25374
   [(set (reg:CC CC_REGNUM)
 
25375
        (compare:CC (match_operand:SI 0 "s_register_operand" "r")
 
25376
@@ -233,57 +376,170 @@
 
25377
   "cmn%?\\t%0, %1%S3"
 
25378
   [(set_attr "conds" "set")
 
25379
    (set_attr "shift" "1")
 
25380
-   (set_attr "type" "alu_shift")]
 
25381
+   (set_attr "type" "arlo_shift")]
 
25382
 )
 
25383
 
 
25384
-(define_insn "*thumb2_mov_scc"
 
25385
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
25386
+(define_insn_and_split "*thumb2_mov_scc"
 
25387
+  [(set (match_operand:SI 0 "s_register_operand" "=l,r")
 
25388
        (match_operator:SI 1 "arm_comparison_operator"
 
25389
         [(match_operand 2 "cc_register" "") (const_int 0)]))]
 
25390
   "TARGET_THUMB2"
 
25391
-  "ite\\t%D1\;mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
 
25392
+  "#"   ; "ite\\t%D1\;mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
 
25393
+  "TARGET_THUMB2"
 
25394
+  [(set (match_dup 0)
 
25395
+        (if_then_else:SI (match_dup 1)
 
25396
+                         (const_int 1)
 
25397
+                         (const_int 0)))]
 
25398
+  ""
 
25399
   [(set_attr "conds" "use")
 
25400
-   (set_attr "length" "10")]
 
25401
+   (set_attr "enabled_for_depr_it" "yes,no")
 
25402
+   (set_attr "length" "8,10")]
 
25403
 )
 
25404
 
 
25405
-(define_insn "*thumb2_mov_negscc"
 
25406
+(define_insn_and_split "*thumb2_mov_negscc"
 
25407
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
25408
        (neg:SI (match_operator:SI 1 "arm_comparison_operator"
 
25409
                 [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
25410
+  "TARGET_THUMB2 && !arm_restrict_it"
 
25411
+  "#"   ; "ite\\t%D1\;mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
 
25412
   "TARGET_THUMB2"
 
25413
-  "ite\\t%D1\;mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
 
25414
+  [(set (match_dup 0)
 
25415
+        (if_then_else:SI (match_dup 1)
 
25416
+                         (match_dup 3)
 
25417
+                         (const_int 0)))]
 
25418
+  {
 
25419
+    operands[3] = GEN_INT (~0);
 
25420
+  }
 
25421
   [(set_attr "conds" "use")
 
25422
    (set_attr "length" "10")]
 
25423
 )
 
25424
 
 
25425
-(define_insn "*thumb2_mov_notscc"
 
25426
+(define_insn_and_split "*thumb2_mov_negscc_strict_it"
 
25427
+  [(set (match_operand:SI 0 "low_register_operand" "=l")
 
25428
+       (neg:SI (match_operator:SI 1 "arm_comparison_operator"
 
25429
+                [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
25430
+  "TARGET_THUMB2 && arm_restrict_it"
 
25431
+  "#"   ; ";mvn\\t%0, #0 ;it\\t%D1\;mov%D1\\t%0, #0\"
 
25432
+  "&& reload_completed"
 
25433
+  [(set (match_dup 0)
 
25434
+        (match_dup 3))
 
25435
+   (cond_exec (match_dup 4)
 
25436
+              (set (match_dup 0)
 
25437
+                   (const_int 0)))]
 
25438
+  {
 
25439
+    operands[3] = GEN_INT (~0);
 
25440
+    enum machine_mode mode = GET_MODE (operands[2]);
 
25441
+    enum rtx_code rc = GET_CODE (operands[1]);
 
25442
+
 
25443
+    if (mode == CCFPmode || mode == CCFPEmode)
 
25444
+      rc = reverse_condition_maybe_unordered (rc);
 
25445
+    else
 
25446
+      rc = reverse_condition (rc);
 
25447
+    operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
25448
+
 
25449
+  }
 
25450
+  [(set_attr "conds" "use")
 
25451
+   (set_attr "length" "8")]
 
25452
+)
 
25453
+
 
25454
+(define_insn_and_split "*thumb2_mov_notscc"
 
25455
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
25456
        (not:SI (match_operator:SI 1 "arm_comparison_operator"
 
25457
                 [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
25458
+  "TARGET_THUMB2 && !arm_restrict_it"
 
25459
+  "#"   ; "ite\\t%D1\;mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
 
25460
   "TARGET_THUMB2"
 
25461
-  "ite\\t%D1\;mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
 
25462
+  [(set (match_dup 0)
 
25463
+        (if_then_else:SI (match_dup 1)
 
25464
+                         (match_dup 3)
 
25465
+                         (match_dup 4)))]
 
25466
+  {
 
25467
+    operands[3] = GEN_INT (~1);
 
25468
+    operands[4] = GEN_INT (~0);
 
25469
+  }
 
25470
   [(set_attr "conds" "use")
 
25471
    (set_attr "length" "10")]
 
25472
 )
 
25473
 
 
25474
-(define_insn "*thumb2_movsicc_insn"
 
25475
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r")
 
25476
+(define_insn_and_split "*thumb2_mov_notscc_strict_it"
 
25477
+  [(set (match_operand:SI 0 "low_register_operand" "=l")
 
25478
+        (not:SI (match_operator:SI 1 "arm_comparison_operator"
 
25479
+                 [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
25480
+  "TARGET_THUMB2 && arm_restrict_it"
 
25481
+  "#"   ; "mvn %0, #0 ; it%d1 ; lsl%d1 %0, %0, #1"
 
25482
+  "&& reload_completed"
 
25483
+  [(set (match_dup 0)
 
25484
+        (match_dup 3))
 
25485
+   (cond_exec (match_dup 4)
 
25486
+              (set (match_dup 0)
 
25487
+                   (ashift:SI (match_dup 0)
 
25488
+                              (const_int 1))))]
 
25489
+  {
 
25490
+    operands[3] = GEN_INT (~0);
 
25491
+    operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]),
 
25492
+                                  VOIDmode, operands[2], const0_rtx);
 
25493
+  }
 
25494
+  [(set_attr "conds" "use")
 
25495
+   (set_attr "length" "8")]
 
25496
+)
 
25497
+
 
25498
+(define_insn_and_split "*thumb2_movsicc_insn"
 
25499
+  [(set (match_operand:SI 0 "s_register_operand" "=l,l,r,r,r,r,r,r,r,r,r")
 
25500
        (if_then_else:SI
 
25501
         (match_operator 3 "arm_comparison_operator"
 
25502
          [(match_operand 4 "cc_register" "") (const_int 0)])
 
25503
-        (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K")
 
25504
-        (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))]
 
25505
+        (match_operand:SI 1 "arm_not_operand" "0 ,lPy,0 ,0,rI,K,rI,rI,K ,K,r")
 
25506
+        (match_operand:SI 2 "arm_not_operand" "lPy,0 ,rI,K,0 ,0,rI,K ,rI,K,r")))]
 
25507
   "TARGET_THUMB2"
 
25508
   "@
 
25509
    it\\t%D3\;mov%D3\\t%0, %2
 
25510
+   it\\t%d3\;mov%d3\\t%0, %1
 
25511
+   it\\t%D3\;mov%D3\\t%0, %2
 
25512
    it\\t%D3\;mvn%D3\\t%0, #%B2
 
25513
    it\\t%d3\;mov%d3\\t%0, %1
 
25514
    it\\t%d3\;mvn%d3\\t%0, #%B1
 
25515
-   ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2
 
25516
-   ite\\t%d3\;mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2
 
25517
-   ite\\t%d3\;mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2
 
25518
-   ite\\t%d3\;mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2"
 
25519
-  [(set_attr "length" "6,6,6,6,10,10,10,10")
 
25520
+   #
 
25521
+   #
 
25522
+   #
 
25523
+   #
 
25524
+   #"
 
25525
+   ; alt 6: ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2
 
25526
+   ; alt 7: ite\\t%d3\;mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2
 
25527
+   ; alt 8: ite\\t%d3\;mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2
 
25528
+   ; alt 9: ite\\t%d3\;mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2
 
25529
+   ; alt 10: ite\\t%d3\;mov%d3\\t%0, %1\;mov%D3\\t%0, %2
 
25530
+  "&& reload_completed"
 
25531
+  [(const_int 0)]
 
25532
+  {
 
25533
+    enum rtx_code rev_code;
 
25534
+    enum machine_mode mode;
 
25535
+    rtx rev_cond;
 
25536
+
 
25537
+    emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25538
+                                  operands[3],
 
25539
+                                  gen_rtx_SET (VOIDmode,
 
25540
+                                               operands[0],
 
25541
+                                               operands[1])));
 
25542
+    rev_code = GET_CODE (operands[3]);
 
25543
+    mode = GET_MODE (operands[4]);
 
25544
+    if (mode == CCFPmode || mode == CCFPEmode)
 
25545
+      rev_code = reverse_condition_maybe_unordered (rev_code);
 
25546
+    else
 
25547
+      rev_code = reverse_condition (rev_code);
 
25548
+
 
25549
+    rev_cond = gen_rtx_fmt_ee (rev_code,
 
25550
+                               VOIDmode,
 
25551
+                               gen_rtx_REG (mode, CC_REGNUM),
 
25552
+                               const0_rtx);
 
25553
+    emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25554
+                                  rev_cond,
 
25555
+                                  gen_rtx_SET (VOIDmode,
 
25556
+                                               operands[0],
 
25557
+                                               operands[2])));
 
25558
+    DONE;
 
25559
+  }
 
25560
+  [(set_attr "length" "4,4,6,6,6,6,10,10,10,10,6")
 
25561
+   (set_attr "enabled_for_depr_it" "yes,yes,no,no,no,no,no,no,no,no,yes")
 
25562
    (set_attr "conds" "use")]
 
25563
 )
 
25564
 
 
25565
@@ -333,28 +589,74 @@
 
25566
 ;; addresses will have the thumb bit set correctly. 
 
25567
 
 
25568
 
 
25569
-(define_insn "*thumb2_and_scc"
 
25570
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
25571
+(define_insn_and_split "*thumb2_and_scc"
 
25572
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts")
 
25573
        (and:SI (match_operator:SI 1 "arm_comparison_operator"
 
25574
-                [(match_operand 3 "cc_register" "") (const_int 0)])
 
25575
-               (match_operand:SI 2 "s_register_operand" "r")))]
 
25576
+                [(match_operand 2 "cc_register" "") (const_int 0)])
 
25577
+               (match_operand:SI 3 "s_register_operand" "r")))]
 
25578
   "TARGET_THUMB2"
 
25579
-  "ite\\t%D1\;mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1"
 
25580
+  "#"   ; "and\\t%0, %3, #1\;it\\t%D1\;mov%D1\\t%0, #0"
 
25581
+  "&& reload_completed"
 
25582
+  [(set (match_dup 0)
 
25583
+        (and:SI (match_dup 3) (const_int 1)))
 
25584
+   (cond_exec (match_dup 4) (set (match_dup 0) (const_int 0)))]
 
25585
+  {
 
25586
+    enum machine_mode mode = GET_MODE (operands[2]);
 
25587
+    enum rtx_code rc = GET_CODE (operands[1]);
 
25588
+
 
25589
+    if (mode == CCFPmode || mode == CCFPEmode)
 
25590
+      rc = reverse_condition_maybe_unordered (rc);
 
25591
+    else
 
25592
+      rc = reverse_condition (rc);
 
25593
+    operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
25594
+  }
 
25595
   [(set_attr "conds" "use")
 
25596
-   (set_attr "length" "10")]
 
25597
+   (set (attr "length") (if_then_else (match_test "arm_restrict_it")
 
25598
+                                      (const_int 8)
 
25599
+                                      (const_int 10)))]
 
25600
 )
 
25601
 
 
25602
-(define_insn "*thumb2_ior_scc"
 
25603
+(define_insn_and_split "*thumb2_ior_scc"
 
25604
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
25605
+       (ior:SI (match_operator:SI 1 "arm_comparison_operator"
 
25606
+                [(match_operand 2 "cc_register" "") (const_int 0)])
 
25607
+               (match_operand:SI 3 "s_register_operand" "0,?r")))]
 
25608
+  "TARGET_THUMB2 && !arm_restrict_it"
 
25609
+  "@
 
25610
+   it\\t%d1\;orr%d1\\t%0, %3, #1
 
25611
+   #"
 
25612
+   ; alt 1: ite\\t%D1\;mov%D1\\t%0, %3\;orr%d1\\t%0, %3, #1
 
25613
+   "&& reload_completed
 
25614
+    && REGNO (operands [0]) != REGNO (operands[3])"
 
25615
+   [(cond_exec (match_dup 5) (set (match_dup 0) (match_dup 3)))
 
25616
+    (cond_exec (match_dup 4) (set (match_dup 0)
 
25617
+                                  (ior:SI (match_dup 3) (const_int 1))))]
 
25618
+  {
 
25619
+    enum machine_mode mode = GET_MODE (operands[2]);
 
25620
+    enum rtx_code rc = GET_CODE (operands[1]);
 
25621
+
 
25622
+    operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
25623
+    if (mode == CCFPmode || mode == CCFPEmode)
 
25624
+      rc = reverse_condition_maybe_unordered (rc);
 
25625
+    else
 
25626
+      rc = reverse_condition (rc);
 
25627
+    operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
25628
+  }
 
25629
+  [(set_attr "conds" "use")
 
25630
+   (set_attr "length" "6,10")]
 
25631
+)
 
25632
+
 
25633
+(define_insn "*thumb2_ior_scc_strict_it"
 
25634
+  [(set (match_operand:SI 0 "s_register_operand" "=l,l")
 
25635
        (ior:SI (match_operator:SI 2 "arm_comparison_operator"
 
25636
                 [(match_operand 3 "cc_register" "") (const_int 0)])
 
25637
-               (match_operand:SI 1 "s_register_operand" "0,?r")))]
 
25638
-  "TARGET_THUMB2"
 
25639
+               (match_operand:SI 1 "s_register_operand" "0,?l")))]
 
25640
+  "TARGET_THUMB2 && arm_restrict_it"
 
25641
   "@
 
25642
-   it\\t%d2\;orr%d2\\t%0, %1, #1
 
25643
-   ite\\t%D2\;mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1"
 
25644
+   it\\t%d2\;mov%d2\\t%0, #1\;it\\t%d2\;orr%d2\\t%0, %1
 
25645
+   mov\\t%0, #1\;orr\\t%0, %1\;it\\t%D2\;mov%D2\\t%0, %1"
 
25646
   [(set_attr "conds" "use")
 
25647
-   (set_attr "length" "6,10")]
 
25648
+   (set_attr "length" "8")]
 
25649
 )
 
25650
 
 
25651
 (define_insn "*thumb2_cond_move"
 
25652
@@ -384,13 +686,20 @@
 
25653
        output_asm_insn (\"it\\t%D4\", operands);
 
25654
        break;
 
25655
       case 2:
 
25656
-       output_asm_insn (\"ite\\t%D4\", operands);
 
25657
+       if (arm_restrict_it)
 
25658
+         output_asm_insn (\"it\\t%D4\", operands);
 
25659
+       else
 
25660
+         output_asm_insn (\"ite\\t%D4\", operands);
 
25661
        break;
 
25662
       default:
 
25663
        abort();
 
25664
       }
 
25665
     if (which_alternative != 0)
 
25666
-      output_asm_insn (\"mov%D4\\t%0, %1\", operands);
 
25667
+      {
 
25668
+        output_asm_insn (\"mov%D4\\t%0, %1\", operands);
 
25669
+        if (arm_restrict_it && which_alternative == 2)
 
25670
+          output_asm_insn (\"it\\t%d4\", operands);
 
25671
+      }
 
25672
     if (which_alternative != 1)
 
25673
       output_asm_insn (\"mov%d4\\t%0, %2\", operands);
 
25674
     return \"\";
 
25675
@@ -407,7 +716,7 @@
 
25676
            (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
 
25677
           (match_operand:SI 1 "s_register_operand" "0,?r")]))
 
25678
    (clobber (reg:CC CC_REGNUM))]
 
25679
-  "TARGET_THUMB2"
 
25680
+  "TARGET_THUMB2 && !arm_restrict_it"
 
25681
   "*
 
25682
     if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx)
 
25683
       return \"%i5\\t%0, %1, %2, lsr #31\";
 
25684
@@ -436,9 +745,78 @@
 
25685
    (set_attr "length" "14")]
 
25686
 )
 
25687
 
 
25688
+(define_insn_and_split "*thumb2_cond_arith_strict_it"
 
25689
+  [(set (match_operand:SI 0 "s_register_operand" "=l")
 
25690
+        (match_operator:SI 5 "shiftable_operator_strict_it"
 
25691
+        [(match_operator:SI 4 "arm_comparison_operator"
 
25692
+           [(match_operand:SI 2 "s_register_operand" "r")
 
25693
+           (match_operand:SI 3 "arm_rhs_operand" "rI")])
 
25694
+          (match_operand:SI 1 "s_register_operand" "0")]))
 
25695
+   (clobber (reg:CC CC_REGNUM))]
 
25696
+  "TARGET_THUMB2 && arm_restrict_it"
 
25697
+  "#"
 
25698
+  "&& reload_completed"
 
25699
+  [(const_int 0)]
 
25700
+  {
 
25701
+    if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx)
 
25702
+      {
 
25703
+        /*  %i5 %0, %1, %2, lsr #31  */
 
25704
+        rtx shifted_op = gen_rtx_LSHIFTRT (SImode, operands[2], GEN_INT (31));
 
25705
+        rtx op = NULL_RTX;
 
25706
+
 
25707
+        switch (GET_CODE (operands[5]))
 
25708
+          {
 
25709
+          case AND:
 
25710
+            op = gen_rtx_AND (SImode, shifted_op, operands[1]);
 
25711
+            break;
 
25712
+           case PLUS:
 
25713
+            op = gen_rtx_PLUS (SImode, shifted_op, operands[1]);
 
25714
+            break;
 
25715
+          default: gcc_unreachable ();
 
25716
+          }
 
25717
+        emit_insn (gen_rtx_SET (VOIDmode, operands[0], op));
 
25718
+        DONE;
 
25719
+      }
 
25720
+
 
25721
+    /*  "cmp  %2, %3"  */
 
25722
+    emit_insn (gen_rtx_SET (VOIDmode,
 
25723
+                               gen_rtx_REG (CCmode, CC_REGNUM),
 
25724
+                               gen_rtx_COMPARE (CCmode, operands[2], operands[3])));
 
25725
+
 
25726
+    if (GET_CODE (operands[5]) == AND)
 
25727
+      {
 
25728
+        /*  %i5  %0, %1, #1
 
25729
+            it%D4
 
25730
+            mov%D4  %0, #0  */
 
25731
+        enum rtx_code rc = reverse_condition (GET_CODE (operands[4]));
 
25732
+        emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_AND (SImode, operands[1], GEN_INT (1))));
 
25733
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25734
+                                      gen_rtx_fmt_ee (rc, VOIDmode, gen_rtx_REG (CCmode, CC_REGNUM), const0_rtx),
 
25735
+                                      gen_rtx_SET (VOIDmode, operands[0], const0_rtx)));
 
25736
+        DONE;
 
25737
+      }
 
25738
+    else
 
25739
+      {
 
25740
+        /*  it\\t%d4
 
25741
+            %i5%d4\\t%0, %1, #1   */
 
25742
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode, gen_rtx_fmt_ee (GET_CODE (operands[4]),
 
25743
+                                                                VOIDmode,
 
25744
+                                                                gen_rtx_REG (CCmode, CC_REGNUM), const0_rtx),
 
25745
+                                                gen_rtx_SET(VOIDmode, operands[0],
 
25746
+                                                            gen_rtx_PLUS (SImode,
 
25747
+                                                                          operands[1],
 
25748
+                                                                          GEN_INT (1)))));
 
25749
+        DONE;
 
25750
+      }
 
25751
+     FAIL;
 
25752
+  }
 
25753
+  [(set_attr "conds" "clob")
 
25754
+   (set_attr "length" "12")]
 
25755
+)
 
25756
+
 
25757
 (define_insn "*thumb2_cond_sub"
 
25758
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
25759
-        (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r")
 
25760
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts")
 
25761
+        (minus:SI (match_operand:SI 1 "s_register_operand" "0,?Ts")
 
25762
                  (match_operator:SI 4 "arm_comparison_operator"
 
25763
                    [(match_operand:SI 2 "s_register_operand" "r,r")
 
25764
                    (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))
 
25765
@@ -448,8 +826,16 @@
 
25766
     output_asm_insn (\"cmp\\t%2, %3\", operands);
 
25767
     if (which_alternative != 0)
 
25768
       {
 
25769
-       output_asm_insn (\"ite\\t%D4\", operands);
 
25770
-       output_asm_insn (\"mov%D4\\t%0, %1\", operands);
 
25771
+       if (arm_restrict_it)
 
25772
+         {
 
25773
+           output_asm_insn (\"mov\\t%0, %1\", operands);
 
25774
+           output_asm_insn (\"it\\t%d4\", operands);
 
25775
+         }
 
25776
+       else
 
25777
+       {
 
25778
+         output_asm_insn (\"ite\\t%D4\", operands);
 
25779
+         output_asm_insn (\"mov%D4\\t%0, %1\", operands);
 
25780
+       }
 
25781
       }
 
25782
     else
 
25783
       output_asm_insn (\"it\\t%d4\", operands);
 
25784
@@ -459,37 +845,82 @@
 
25785
    (set_attr "length" "10,14")]
 
25786
 )
 
25787
 
 
25788
-(define_insn "*thumb2_negscc"
 
25789
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
25790
+(define_insn_and_split "*thumb2_negscc"
 
25791
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts")
 
25792
        (neg:SI (match_operator 3 "arm_comparison_operator"
 
25793
                 [(match_operand:SI 1 "s_register_operand" "r")
 
25794
                  (match_operand:SI 2 "arm_rhs_operand" "rI")])))
 
25795
    (clobber (reg:CC CC_REGNUM))]
 
25796
   "TARGET_THUMB2"
 
25797
-  "*
 
25798
-  if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
 
25799
-    return \"asr\\t%0, %1, #31\";
 
25800
+  "#"
 
25801
+  "&& reload_completed"
 
25802
+  [(const_int 0)]
 
25803
+  {
 
25804
+    rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
 
25805
 
 
25806
-  if (GET_CODE (operands[3]) == NE)
 
25807
-    return \"subs\\t%0, %1, %2\;it\\tne\;mvnne\\t%0, #0\";
 
25808
+    if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
 
25809
+      {
 
25810
+        /* Emit asr\\t%0, %1, #31 */
 
25811
+        emit_insn (gen_rtx_SET (VOIDmode,
 
25812
+                                operands[0],
 
25813
+                                gen_rtx_ASHIFTRT (SImode,
 
25814
+                                                  operands[1],
 
25815
+                                                  GEN_INT (31))));
 
25816
+        DONE;
 
25817
+      }
 
25818
+    else if (GET_CODE (operands[3]) == NE && !arm_restrict_it)
 
25819
+      {
 
25820
+        /* Emit subs\\t%0, %1, %2\;it\\tne\;mvnne\\t%0, #0 */
 
25821
+        if (CONST_INT_P (operands[2]))
 
25822
+          emit_insn (gen_cmpsi2_addneg (operands[0], operands[1], operands[2],
 
25823
+                                        GEN_INT (- INTVAL (operands[2]))));
 
25824
+        else
 
25825
+          emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2]));
 
25826
 
 
25827
-  output_asm_insn (\"cmp\\t%1, %2\", operands);
 
25828
-  output_asm_insn (\"ite\\t%D3\", operands);
 
25829
-  output_asm_insn (\"mov%D3\\t%0, #0\", operands);
 
25830
-  return \"mvn%d3\\t%0, #0\";
 
25831
-  "
 
25832
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25833
+                                      gen_rtx_NE (SImode,
 
25834
+                                                  cc_reg,
 
25835
+                                                  const0_rtx),
 
25836
+                                      gen_rtx_SET (SImode,
 
25837
+                                                   operands[0],
 
25838
+                                                   GEN_INT (~0))));
 
25839
+        DONE;
 
25840
+      }
 
25841
+    else
 
25842
+      {
 
25843
+       /* Emit:  cmp\\t%1, %2\;mvn\\t%0, #0\;it\\t%D3\;mov%D3\\t%0, #0\;*/
 
25844
+       enum rtx_code rc = reverse_condition (GET_CODE (operands[3]));
 
25845
+       enum machine_mode mode = SELECT_CC_MODE (rc, operands[1], operands[2]);
 
25846
+       rtx tmp1 = gen_rtx_REG (mode, CC_REGNUM);
 
25847
+
 
25848
+       emit_insn (gen_rtx_SET (VOIDmode,
 
25849
+                               cc_reg,
 
25850
+                               gen_rtx_COMPARE (CCmode, operands[1], operands[2])));
 
25851
+
 
25852
+       emit_insn (gen_rtx_SET (VOIDmode, operands[0], GEN_INT (~0)));
 
25853
+
 
25854
+       emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
25855
+                                     gen_rtx_fmt_ee (rc,
 
25856
+                                                     VOIDmode,
 
25857
+                                                     tmp1,
 
25858
+                                                     const0_rtx),
 
25859
+                                     gen_rtx_SET (VOIDmode, operands[0], const0_rtx)));
 
25860
+       DONE;
 
25861
+      }
 
25862
+    FAIL;
 
25863
+  }
 
25864
   [(set_attr "conds" "clob")
 
25865
    (set_attr "length" "14")]
 
25866
 )
 
25867
 
 
25868
 (define_insn "*thumb2_movcond"
 
25869
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
25870
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts,Ts")
 
25871
        (if_then_else:SI
 
25872
         (match_operator 5 "arm_comparison_operator"
 
25873
          [(match_operand:SI 3 "s_register_operand" "r,r,r")
 
25874
           (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL")])
 
25875
-        (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI")
 
25876
-        (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
25877
+        (match_operand:SI 1 "arm_rhs_operand" "0,TsI,?TsI")
 
25878
+        (match_operand:SI 2 "arm_rhs_operand" "TsI,0,TsI")))
 
25879
    (clobber (reg:CC CC_REGNUM))]
 
25880
   "TARGET_THUMB2"
 
25881
   "*
 
25882
@@ -544,12 +975,18 @@
 
25883
       output_asm_insn (\"it\\t%d5\", operands);
 
25884
       break;
 
25885
     case 2:
 
25886
-      output_asm_insn (\"ite\\t%d5\", operands);
 
25887
+      if (arm_restrict_it)
 
25888
+        {
 
25889
+          output_asm_insn (\"mov\\t%0, %1\", operands);
 
25890
+          output_asm_insn (\"it\\t%D5\", operands);
 
25891
+        }
 
25892
+      else
 
25893
+        output_asm_insn (\"ite\\t%d5\", operands);
 
25894
       break;
 
25895
     default:
 
25896
       abort();
 
25897
     }
 
25898
-  if (which_alternative != 0)
 
25899
+  if (which_alternative != 0 && !(arm_restrict_it && which_alternative == 2))
 
25900
     output_asm_insn (\"mov%d5\\t%0, %1\", operands);
 
25901
   if (which_alternative != 1)
 
25902
     output_asm_insn (\"mov%D5\\t%0, %2\", operands);
 
25903
@@ -570,8 +1007,9 @@
 
25904
   "@
 
25905
    sxtb%?\\t%0, %1
 
25906
    ldr%(sb%)\\t%0, %1"
 
25907
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
25908
+  [(set_attr "type" "extend,load_byte")
 
25909
    (set_attr "predicable" "yes")
 
25910
+   (set_attr "predicable_short_it" "no")
 
25911
    (set_attr "pool_range" "*,4094")
 
25912
    (set_attr "neg_pool_range" "*,250")]
 
25913
 )
 
25914
@@ -583,8 +1021,9 @@
 
25915
   "@
 
25916
    uxth%?\\t%0, %1
 
25917
    ldr%(h%)\\t%0, %1"
 
25918
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
25919
+  [(set_attr "type" "extend,load_byte")
 
25920
    (set_attr "predicable" "yes")
 
25921
+   (set_attr "predicable_short_it" "no")
 
25922
    (set_attr "pool_range" "*,4094")
 
25923
    (set_attr "neg_pool_range" "*,250")]
 
25924
 )
 
25925
@@ -596,8 +1035,9 @@
 
25926
   "@
 
25927
    uxtb%(%)\\t%0, %1
 
25928
    ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2"
 
25929
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
25930
+  [(set_attr "type" "extend,load_byte")
 
25931
    (set_attr "predicable" "yes")
 
25932
+   (set_attr "predicable_short_it" "no")
 
25933
    (set_attr "pool_range" "*,4094")
 
25934
    (set_attr "neg_pool_range" "*,250")]
 
25935
 )
 
25936
@@ -688,8 +1128,8 @@
 
25937
    (set_attr "shift" "1")
 
25938
    (set_attr "length" "2")
 
25939
    (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
 
25940
-                     (const_string "alu_shift")
 
25941
-                     (const_string "alu_shift_reg")))]
 
25942
+                     (const_string "arlo_shift")
 
25943
+                     (const_string "arlo_shift_reg")))]
 
25944
 )
 
25945
 
 
25946
 (define_insn "*thumb2_mov<mode>_shortim"
 
25947
@@ -811,7 +1251,7 @@
 
25948
   "
 
25949
   [(set_attr "conds" "set")
 
25950
    (set_attr "length" "2,2,4,4")
 
25951
-   (set_attr "type"   "simple_alu_imm,*,simple_alu_imm,*")]
 
25952
+   (set_attr "type"   "arlo_imm,*,arlo_imm,*")]
 
25953
 )
 
25954
 
 
25955
 (define_insn "*thumb2_mulsi_short"
 
25956
@@ -823,7 +1263,7 @@
 
25957
   "mul%!\\t%0, %2, %0"
 
25958
   [(set_attr "predicable" "yes")
 
25959
    (set_attr "length" "2")
 
25960
-   (set_attr "insn" "muls")])
 
25961
+   (set_attr "type" "muls")])
 
25962
 
 
25963
 (define_insn "*thumb2_mulsi_short_compare0"
 
25964
   [(set (reg:CC_NOOV CC_REGNUM)
 
25965
@@ -836,7 +1276,7 @@
 
25966
   "TARGET_THUMB2 && optimize_size"
 
25967
   "muls\\t%0, %2, %0"
 
25968
   [(set_attr "length" "2")
 
25969
-   (set_attr "insn" "muls")])
 
25970
+   (set_attr "type" "muls")])
 
25971
 
 
25972
 (define_insn "*thumb2_mulsi_short_compare0_scratch"
 
25973
   [(set (reg:CC_NOOV CC_REGNUM)
 
25974
@@ -848,7 +1288,7 @@
 
25975
   "TARGET_THUMB2 && optimize_size"
 
25976
   "muls\\t%0, %2, %0"
 
25977
   [(set_attr "length" "2")
 
25978
-   (set_attr "insn" "muls")])
 
25979
+   (set_attr "type" "muls")])
 
25980
 
 
25981
 (define_insn "*thumb2_cbz"
 
25982
   [(set (pc) (if_then_else
 
25983
@@ -922,7 +1362,8 @@
 
25984
                (match_operand:SI 1 "s_register_operand" "r")))]
 
25985
   "TARGET_THUMB2"
 
25986
   "orn%?\\t%0, %1, %2"
 
25987
-  [(set_attr "predicable" "yes")]
 
25988
+  [(set_attr "predicable" "yes")
 
25989
+   (set_attr "predicable_short_it" "no")]
 
25990
 )
 
25991
 
 
25992
 (define_insn "*orsi_not_shiftsi_si"
 
25993
@@ -934,8 +1375,9 @@
 
25994
   "TARGET_THUMB2"
 
25995
   "orn%?\\t%0, %1, %2%S4"
 
25996
   [(set_attr "predicable" "yes")
 
25997
+   (set_attr "predicable_short_it" "no")
 
25998
    (set_attr "shift" "2")
 
25999
-   (set_attr "type" "alu_shift")]
 
26000
+   (set_attr "type" "arlo_shift")]
 
26001
 )
 
26002
 
 
26003
 (define_peephole2
 
26004
--- a/src/gcc/config/arm/arm.c
 
26005
+++ b/src/gcc/config/arm/arm.c
 
26006
@@ -173,6 +173,7 @@
 
26007
 static tree arm_builtin_decl (unsigned, bool);
 
26008
 static void emit_constant_insn (rtx cond, rtx pattern);
 
26009
 static rtx emit_set_insn (rtx, rtx);
 
26010
+static rtx emit_multi_reg_push (unsigned long);
 
26011
 static int arm_arg_partial_bytes (cumulative_args_t, enum machine_mode,
 
26012
                                  tree, bool);
 
26013
 static rtx arm_function_arg (cumulative_args_t, enum machine_mode,
 
26014
@@ -280,6 +281,7 @@
 
26015
 
 
26016
 static void arm_canonicalize_comparison (int *code, rtx *op0, rtx *op1,
 
26017
                                         bool op0_preserve_value);
 
26018
+static unsigned HOST_WIDE_INT arm_asan_shadow_offset (void);
 
26019
 
 
26020
 /* Table of machine attributes.  */
 
26021
 static const struct attribute_spec arm_attribute_table[] =
 
26022
@@ -620,6 +622,13 @@
 
26023
 #undef TARGET_CLASS_LIKELY_SPILLED_P
 
26024
 #define TARGET_CLASS_LIKELY_SPILLED_P arm_class_likely_spilled_p
 
26025
 
 
26026
+#undef TARGET_VECTORIZE_BUILTINS
 
26027
+#define TARGET_VECTORIZE_BUILTINS
 
26028
+
 
26029
+#undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
 
26030
+#define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
 
26031
+  arm_builtin_vectorized_function
 
26032
+
 
26033
 #undef TARGET_VECTOR_ALIGNMENT
 
26034
 #define TARGET_VECTOR_ALIGNMENT arm_vector_alignment
 
26035
 
 
26036
@@ -649,6 +658,13 @@
 
26037
 #define TARGET_CANONICALIZE_COMPARISON \
 
26038
   arm_canonicalize_comparison
 
26039
 
 
26040
+#undef TARGET_ASAN_SHADOW_OFFSET
 
26041
+#define TARGET_ASAN_SHADOW_OFFSET arm_asan_shadow_offset
 
26042
+
 
26043
+#undef MAX_INSN_PER_IT_BLOCK
 
26044
+#define MAX_INSN_PER_IT_BLOCK (arm_restrict_it ? 1 : 4)
 
26045
+
 
26046
+
 
26047
 struct gcc_target targetm = TARGET_INITIALIZER;
 
26048
 
 
26049
 /* Obstack for minipool constant handling.  */
 
26050
@@ -839,6 +855,10 @@
 
26051
 int arm_arch_arm_hwdiv;
 
26052
 int arm_arch_thumb_hwdiv;
 
26053
 
 
26054
+/* Nonzero if we should use Neon to handle 64-bits operations rather
 
26055
+   than core registers.  */
 
26056
+int prefer_neon_for_64bits = 0;
 
26057
+
 
26058
 /* In case of a PRE_INC, POST_INC, PRE_DEC, POST_DEC memory reference,
 
26059
    we must report the mode of the memory reference from
 
26060
    TARGET_PRINT_OPERAND to TARGET_PRINT_OPERAND_ADDRESS.  */
 
26061
@@ -936,6 +956,7 @@
 
26062
   false,                                       /* Prefer LDRD/STRD.  */
 
26063
   {true, true},                                        /* Prefer non short circuit.  */
 
26064
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26065
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26066
 };
 
26067
 
 
26068
 const struct tune_params arm_fastmul_tune =
 
26069
@@ -950,6 +971,7 @@
 
26070
   false,                                       /* Prefer LDRD/STRD.  */
 
26071
   {true, true},                                        /* Prefer non short circuit.  */
 
26072
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26073
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26074
 };
 
26075
 
 
26076
 /* StrongARM has early execution of branches, so a sequence that is worth
 
26077
@@ -967,6 +989,7 @@
 
26078
   false,                                       /* Prefer LDRD/STRD.  */
 
26079
   {true, true},                                        /* Prefer non short circuit.  */
 
26080
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26081
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26082
 };
 
26083
 
 
26084
 const struct tune_params arm_xscale_tune =
 
26085
@@ -981,6 +1004,7 @@
 
26086
   false,                                       /* Prefer LDRD/STRD.  */
 
26087
   {true, true},                                        /* Prefer non short circuit.  */
 
26088
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26089
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26090
 };
 
26091
 
 
26092
 const struct tune_params arm_9e_tune =
 
26093
@@ -995,6 +1019,7 @@
 
26094
   false,                                       /* Prefer LDRD/STRD.  */
 
26095
   {true, true},                                        /* Prefer non short circuit.  */
 
26096
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26097
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26098
 };
 
26099
 
 
26100
 const struct tune_params arm_v6t2_tune =
 
26101
@@ -1009,6 +1034,7 @@
 
26102
   false,                                       /* Prefer LDRD/STRD.  */
 
26103
   {true, true},                                        /* Prefer non short circuit.  */
 
26104
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26105
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26106
 };
 
26107
 
 
26108
 /* Generic Cortex tuning.  Use more specific tunings if appropriate.  */
 
26109
@@ -1024,6 +1050,7 @@
 
26110
   false,                                       /* Prefer LDRD/STRD.  */
 
26111
   {true, true},                                        /* Prefer non short circuit.  */
 
26112
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26113
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26114
 };
 
26115
 
 
26116
 const struct tune_params arm_cortex_a15_tune =
 
26117
@@ -1031,13 +1058,14 @@
 
26118
   arm_9e_rtx_costs,
 
26119
   NULL,
 
26120
   1,                                           /* Constant limit.  */
 
26121
-  5,                                           /* Max cond insns.  */
 
26122
+  2,                                           /* Max cond insns.  */
 
26123
   ARM_PREFETCH_NOT_BENEFICIAL,
 
26124
   false,                                       /* Prefer constant pool.  */
 
26125
   arm_default_branch_cost,
 
26126
   true,                                                /* Prefer LDRD/STRD.  */
 
26127
   {true, true},                                        /* Prefer non short circuit.  */
 
26128
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26129
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26130
 };
 
26131
 
 
26132
 /* Branches can be dual-issued on Cortex-A5, so conditional execution is
 
26133
@@ -1055,6 +1083,7 @@
 
26134
   false,                                       /* Prefer LDRD/STRD.  */
 
26135
   {false, false},                              /* Prefer non short circuit.  */
 
26136
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26137
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26138
 };
 
26139
 
 
26140
 const struct tune_params arm_cortex_a9_tune =
 
26141
@@ -1069,6 +1098,7 @@
 
26142
   false,                                       /* Prefer LDRD/STRD.  */
 
26143
   {true, true},                                        /* Prefer non short circuit.  */
 
26144
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26145
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26146
 };
 
26147
 
 
26148
 /* The arm_v6m_tune is duplicated from arm_cortex_tune, rather than
 
26149
@@ -1085,6 +1115,7 @@
 
26150
   false,                                       /* Prefer LDRD/STRD.  */
 
26151
   {false, false},                              /* Prefer non short circuit.  */
 
26152
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26153
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26154
 };
 
26155
 
 
26156
 const struct tune_params arm_fa726te_tune =
 
26157
@@ -1099,6 +1130,7 @@
 
26158
   false,                                       /* Prefer LDRD/STRD.  */
 
26159
   {true, true},                                        /* Prefer non short circuit.  */
 
26160
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
 
26161
+  false                                         /* Prefer Neon for 64-bits bitops.  */
 
26162
 };
 
26163
 
 
26164
 
 
26165
@@ -1842,7 +1874,12 @@
 
26166
   arm_arch_thumb_hwdiv = (insn_flags & FL_THUMB_DIV) != 0;
 
26167
   arm_arch_arm_hwdiv = (insn_flags & FL_ARM_DIV) != 0;
 
26168
   arm_tune_cortex_a9 = (arm_tune == cortexa9) != 0;
 
26169
+  if (arm_restrict_it == 2)
 
26170
+    arm_restrict_it = arm_arch8 && TARGET_THUMB2;
 
26171
 
 
26172
+  if (!TARGET_THUMB2)
 
26173
+    arm_restrict_it = 0;
 
26174
+
 
26175
   /* If we are not using the default (ARM mode) section anchor offset
 
26176
      ranges, then set the correct ranges now.  */
 
26177
   if (TARGET_THUMB1)
 
26178
@@ -2129,11 +2166,25 @@
 
26179
                            global_options.x_param_values,
 
26180
                            global_options_set.x_param_values);
 
26181
 
 
26182
+  /* Use Neon to perform 64-bits operations rather than core
 
26183
+     registers.  */
 
26184
+  prefer_neon_for_64bits = current_tune->prefer_neon_for_64bits;
 
26185
+  if (use_neon_for_64bits == 1)
 
26186
+     prefer_neon_for_64bits = true;
 
26187
+
 
26188
   /* Use the alternative scheduling-pressure algorithm by default.  */
 
26189
   maybe_set_param_value (PARAM_SCHED_PRESSURE_ALGORITHM, 2,
 
26190
                          global_options.x_param_values,
 
26191
                          global_options_set.x_param_values);
 
26192
 
 
26193
+  /* Disable shrink-wrap when optimizing function for size, since it tends to
 
26194
+     generate additional returns.  */
 
26195
+  if (optimize_function_for_size_p (cfun) && TARGET_THUMB2)
 
26196
+    flag_shrink_wrap = false;
 
26197
+  /* TBD: Dwarf info for apcs frame is not handled yet.  */
 
26198
+  if (TARGET_APCS_FRAME)
 
26199
+    flag_shrink_wrap = false;
 
26200
+
 
26201
   /* Register global variables with the garbage collector.  */
 
26202
   arm_add_gc_roots ();
 
26203
 }
 
26204
@@ -2382,6 +2433,10 @@
 
26205
   if (IS_INTERRUPT (func_type) && (frame_pointer_needed || TARGET_THUMB))
 
26206
     return 0;
 
26207
 
 
26208
+  if (TARGET_LDRD && current_tune->prefer_ldrd_strd
 
26209
+      && !optimize_function_for_size_p (cfun))
 
26210
+    return 0;
 
26211
+
 
26212
   offsets = arm_get_frame_offsets ();
 
26213
   stack_adjust = offsets->outgoing_args - offsets->saved_regs;
 
26214
 
 
26215
@@ -2479,6 +2534,18 @@
 
26216
   return 1;
 
26217
 }
 
26218
 
 
26219
+/* Return TRUE if we should try to use a simple_return insn, i.e. perform
 
26220
+   shrink-wrapping if possible.  This is the case if we need to emit a
 
26221
+   prologue, which we can test by looking at the offsets.  */
 
26222
+bool
 
26223
+use_simple_return_p (void)
 
26224
+{
 
26225
+  arm_stack_offsets *offsets;
 
26226
+
 
26227
+  offsets = arm_get_frame_offsets ();
 
26228
+  return offsets->outgoing_args != 0;
 
26229
+}
 
26230
+
 
26231
 /* Return TRUE if int I is a valid immediate ARM constant.  */
 
26232
 
 
26233
 int
 
26234
@@ -2617,6 +2684,11 @@
 
26235
 
 
26236
   switch (code)
 
26237
     {
 
26238
+    case AND:
 
26239
+    case IOR:
 
26240
+    case XOR:
 
26241
+      return (const_ok_for_op (hi_val, code) || hi_val == 0xFFFFFFFF)
 
26242
+              && (const_ok_for_op (lo_val, code) || lo_val == 0xFFFFFFFF);
 
26243
     case PLUS:
 
26244
       return arm_not_operand (hi, SImode) && arm_add_operand (lo, SImode);
 
26245
 
 
26246
@@ -5337,9 +5409,8 @@
 
26247
   if (cfun->machine->sibcall_blocked)
 
26248
     return false;
 
26249
 
 
26250
-  /* Never tailcall something for which we have no decl, or if we
 
26251
-     are generating code for Thumb-1.  */
 
26252
-  if (decl == NULL || TARGET_THUMB1)
 
26253
+  /* Never tailcall something if we are generating code for Thumb-1.  */
 
26254
+  if (TARGET_THUMB1)
 
26255
     return false;
 
26256
 
 
26257
   /* The PIC register is live on entry to VxWorks PLT entries, so we
 
26258
@@ -5349,13 +5420,14 @@
 
26259
 
 
26260
   /* Cannot tail-call to long calls, since these are out of range of
 
26261
      a branch instruction.  */
 
26262
-  if (arm_is_long_call_p (decl))
 
26263
+  if (decl && arm_is_long_call_p (decl))
 
26264
     return false;
 
26265
 
 
26266
   /* If we are interworking and the function is not declared static
 
26267
      then we can't tail-call it unless we know that it exists in this
 
26268
      compilation unit (since it might be a Thumb routine).  */
 
26269
-  if (TARGET_INTERWORK && TREE_PUBLIC (decl) && !TREE_ASM_WRITTEN (decl))
 
26270
+  if (TARGET_INTERWORK && decl && TREE_PUBLIC (decl)
 
26271
+      && !TREE_ASM_WRITTEN (decl))
 
26272
     return false;
 
26273
 
 
26274
   func_type = arm_current_func_type ();
 
26275
@@ -5387,6 +5459,7 @@
 
26276
      sibling calls.  */
 
26277
   if (TARGET_AAPCS_BASED
 
26278
       && arm_abi == ARM_ABI_AAPCS
 
26279
+      && decl
 
26280
       && DECL_WEAK (decl))
 
26281
     return false;
 
26282
 
 
26283
@@ -8578,7 +8651,12 @@
 
26284
         instruction we depend on is another ALU instruction, then we may
 
26285
         have to account for an additional stall.  */
 
26286
       if (shift_opnum != 0
 
26287
-         && (attr_type == TYPE_ALU_SHIFT || attr_type == TYPE_ALU_SHIFT_REG))
 
26288
+         && (attr_type == TYPE_ARLO_SHIFT
 
26289
+             || attr_type == TYPE_ARLO_SHIFT_REG
 
26290
+             || attr_type == TYPE_MOV_SHIFT
 
26291
+             || attr_type == TYPE_MVN_SHIFT
 
26292
+             || attr_type == TYPE_MOV_SHIFT_REG
 
26293
+             || attr_type == TYPE_MVN_SHIFT_REG))
 
26294
        {
 
26295
          rtx shifted_operand;
 
26296
          int opno;
 
26297
@@ -8859,12 +8937,12 @@
 
26298
   if (recog_memoized (insn) < 0)
 
26299
     return false;
 
26300
 
 
26301
-  if (get_attr_insn (insn) == INSN_MOV)
 
26302
-    return false;
 
26303
-
 
26304
   switch (get_attr_type (insn))
 
26305
     {
 
26306
-    case TYPE_ALU_REG:
 
26307
+    case TYPE_ARLO_REG:
 
26308
+    case TYPE_MVN_REG:
 
26309
+    case TYPE_SHIFT:
 
26310
+    case TYPE_SHIFT_REG:
 
26311
     case TYPE_LOAD_BYTE:
 
26312
     case TYPE_LOAD1:
 
26313
     case TYPE_STORE1:
 
26314
@@ -8905,13 +8983,15 @@
 
26315
       return false;
 
26316
     }
 
26317
 
 
26318
-  if (get_attr_insn (insn) == INSN_MOV)
 
26319
-    return true;
 
26320
-
 
26321
   switch (get_attr_type (insn))
 
26322
     {
 
26323
-    case TYPE_SIMPLE_ALU_IMM:
 
26324
-    case TYPE_SIMPLE_ALU_SHIFT:
 
26325
+    case TYPE_ARLO_IMM:
 
26326
+    case TYPE_EXTEND:
 
26327
+    case TYPE_MVN_IMM:
 
26328
+    case TYPE_MOV_IMM:
 
26329
+    case TYPE_MOV_REG:
 
26330
+    case TYPE_MOV_SHIFT:
 
26331
+    case TYPE_MOV_SHIFT_REG:
 
26332
     case TYPE_BRANCH:
 
26333
     case TYPE_CALL:
 
26334
       return true;
 
26335
@@ -9070,6 +9150,12 @@
 
26336
   return cost;
 
26337
 }
 
26338
 
 
26339
+int
 
26340
+arm_max_conditional_execute (void)
 
26341
+{
 
26342
+  return max_insns_skipped;
 
26343
+}
 
26344
+
 
26345
 static int
 
26346
 arm_default_branch_cost (bool speed_p, bool predictable_p ATTRIBUTE_UNUSED)
 
26347
 {
 
26348
@@ -11825,6 +11911,142 @@
 
26349
   return 1;
 
26350
 }
 
26351
 
 
26352
+/* Helper for gen_movmem_ldrd_strd. Increase the address of memory rtx
 
26353
+by mode size.  */
 
26354
+inline static rtx
 
26355
+next_consecutive_mem (rtx mem)
 
26356
+{
 
26357
+  enum machine_mode mode = GET_MODE (mem);
 
26358
+  HOST_WIDE_INT offset = GET_MODE_SIZE (mode);
 
26359
+  rtx addr = plus_constant (Pmode, XEXP (mem, 0), offset);
 
26360
+
 
26361
+  return adjust_automodify_address (mem, mode, addr, offset);
 
26362
+}
 
26363
+
 
26364
+/* Copy using LDRD/STRD instructions whenever possible.
 
26365
+   Returns true upon success. */
 
26366
+bool
 
26367
+gen_movmem_ldrd_strd (rtx *operands)
 
26368
+{
 
26369
+  unsigned HOST_WIDE_INT len;
 
26370
+  HOST_WIDE_INT align;
 
26371
+  rtx src, dst, base;
 
26372
+  rtx reg0;
 
26373
+  bool src_aligned, dst_aligned;
 
26374
+  bool src_volatile, dst_volatile;
 
26375
+
 
26376
+  gcc_assert (CONST_INT_P (operands[2]));
 
26377
+  gcc_assert (CONST_INT_P (operands[3]));
 
26378
+
 
26379
+  len = UINTVAL (operands[2]);
 
26380
+  if (len > 64)
 
26381
+    return false;
 
26382
+
 
26383
+  /* Maximum alignment we can assume for both src and dst buffers.  */
 
26384
+  align = INTVAL (operands[3]);
 
26385
+
 
26386
+  if ((!unaligned_access) && (len >= 4) && ((align & 3) != 0))
 
26387
+    return false;
 
26388
+
 
26389
+  /* Place src and dst addresses in registers
 
26390
+     and update the corresponding mem rtx.  */
 
26391
+  dst = operands[0];
 
26392
+  dst_volatile = MEM_VOLATILE_P (dst);
 
26393
+  dst_aligned = MEM_ALIGN (dst) >= BITS_PER_WORD;
 
26394
+  base = copy_to_mode_reg (SImode, XEXP (dst, 0));
 
26395
+  dst = adjust_automodify_address (dst, VOIDmode, base, 0);
 
26396
+
 
26397
+  src = operands[1];
 
26398
+  src_volatile = MEM_VOLATILE_P (src);
 
26399
+  src_aligned = MEM_ALIGN (src) >= BITS_PER_WORD;
 
26400
+  base = copy_to_mode_reg (SImode, XEXP (src, 0));
 
26401
+  src = adjust_automodify_address (src, VOIDmode, base, 0);
 
26402
+
 
26403
+  if (!unaligned_access && !(src_aligned && dst_aligned))
 
26404
+    return false;
 
26405
+
 
26406
+  if (src_volatile || dst_volatile)
 
26407
+    return false;
 
26408
+
 
26409
+  /* If we cannot generate any LDRD/STRD, try to generate LDM/STM.  */
 
26410
+  if (!(dst_aligned || src_aligned))
 
26411
+    return arm_gen_movmemqi (operands);
 
26412
+
 
26413
+  src = adjust_address (src, DImode, 0);
 
26414
+  dst = adjust_address (dst, DImode, 0);
 
26415
+  while (len >= 8)
 
26416
+    {
 
26417
+      len -= 8;
 
26418
+      reg0 = gen_reg_rtx (DImode);
 
26419
+      if (src_aligned)
 
26420
+        emit_move_insn (reg0, src);
 
26421
+      else
 
26422
+        emit_insn (gen_unaligned_loaddi (reg0, src));
 
26423
+
 
26424
+      if (dst_aligned)
 
26425
+        emit_move_insn (dst, reg0);
 
26426
+      else
 
26427
+        emit_insn (gen_unaligned_storedi (dst, reg0));
 
26428
+
 
26429
+      src = next_consecutive_mem (src);
 
26430
+      dst = next_consecutive_mem (dst);
 
26431
+    }
 
26432
+
 
26433
+  gcc_assert (len < 8);
 
26434
+  if (len >= 4)
 
26435
+    {
 
26436
+      /* More than a word but less than a double-word to copy.  Copy a word.  */
 
26437
+      reg0 = gen_reg_rtx (SImode);
 
26438
+      src = adjust_address (src, SImode, 0);
 
26439
+      dst = adjust_address (dst, SImode, 0);
 
26440
+      if (src_aligned)
 
26441
+        emit_move_insn (reg0, src);
 
26442
+      else
 
26443
+        emit_insn (gen_unaligned_loadsi (reg0, src));
 
26444
+
 
26445
+      if (dst_aligned)
 
26446
+        emit_move_insn (dst, reg0);
 
26447
+      else
 
26448
+        emit_insn (gen_unaligned_storesi (dst, reg0));
 
26449
+
 
26450
+      src = next_consecutive_mem (src);
 
26451
+      dst = next_consecutive_mem (dst);
 
26452
+      len -= 4;
 
26453
+    }
 
26454
+
 
26455
+  if (len == 0)
 
26456
+    return true;
 
26457
+
 
26458
+  /* Copy the remaining bytes.  */
 
26459
+  if (len >= 2)
 
26460
+    {
 
26461
+      dst = adjust_address (dst, HImode, 0);
 
26462
+      src = adjust_address (src, HImode, 0);
 
26463
+      reg0 = gen_reg_rtx (SImode);
 
26464
+      if (src_aligned)
 
26465
+        emit_insn (gen_zero_extendhisi2 (reg0, src));
 
26466
+      else
 
26467
+        emit_insn (gen_unaligned_loadhiu (reg0, src));
 
26468
+
 
26469
+      if (dst_aligned)
 
26470
+        emit_insn (gen_movhi (dst, gen_lowpart(HImode, reg0)));
 
26471
+      else
 
26472
+        emit_insn (gen_unaligned_storehi (dst, gen_lowpart (HImode, reg0)));
 
26473
+
 
26474
+      src = next_consecutive_mem (src);
 
26475
+      dst = next_consecutive_mem (dst);
 
26476
+      if (len == 2)
 
26477
+        return true;
 
26478
+    }
 
26479
+
 
26480
+  dst = adjust_address (dst, QImode, 0);
 
26481
+  src = adjust_address (src, QImode, 0);
 
26482
+  reg0 = gen_reg_rtx (QImode);
 
26483
+  emit_move_insn (reg0, src);
 
26484
+  emit_move_insn (dst, reg0);
 
26485
+  return true;
 
26486
+}
 
26487
+
 
26488
 /* Select a dominance comparison mode if possible for a test of the general
 
26489
    form (OP (COND_OR (X) (Y)) (const_int 0)).  We support three forms.
 
26490
    COND_OR == DOM_CC_X_AND_Y => (X && Y)
 
26491
@@ -12625,6 +12847,277 @@
 
26492
   return true;
 
26493
 }
 
26494
 
 
26495
+/* Helper for gen_operands_ldrd_strd.  Returns true iff the memory
 
26496
+   operand ADDR is an immediate offset from the base register and is
 
26497
+   not volatile, in which case it sets BASE and OFFSET
 
26498
+   accordingly.  */
 
26499
+bool
 
26500
+mem_ok_for_ldrd_strd (rtx addr, rtx *base, rtx *offset)
 
26501
+{
 
26502
+  /* TODO: Handle more general memory operand patterns, such as
 
26503
+     PRE_DEC and PRE_INC.  */
 
26504
+
 
26505
+  /* Convert a subreg of mem into mem itself.  */
 
26506
+  if (GET_CODE (addr) == SUBREG)
 
26507
+    addr = alter_subreg (&addr, true);
 
26508
+
 
26509
+  gcc_assert (MEM_P (addr));
 
26510
+
 
26511
+  /* Don't modify volatile memory accesses.  */
 
26512
+  if (MEM_VOLATILE_P (addr))
 
26513
+    return false;
 
26514
+
 
26515
+  *offset = const0_rtx;
 
26516
+
 
26517
+  addr = XEXP (addr, 0);
 
26518
+  if (REG_P (addr))
 
26519
+    {
 
26520
+      *base = addr;
 
26521
+      return true;
 
26522
+    }
 
26523
+  else if (GET_CODE (addr) == PLUS || GET_CODE (addr) == MINUS)
 
26524
+    {
 
26525
+      *base = XEXP (addr, 0);
 
26526
+      *offset = XEXP (addr, 1);
 
26527
+      return (REG_P (*base) && CONST_INT_P (*offset));
 
26528
+    }
 
26529
+
 
26530
+  return false;
 
26531
+}
 
26532
+
 
26533
+#define SWAP_RTX(x,y) do { rtx tmp = x; x = y; y = tmp; } while (0)
 
26534
+
 
26535
+/* Called from a peephole2 to replace two word-size accesses with a
 
26536
+   single LDRD/STRD instruction.  Returns true iff we can generate a
 
26537
+   new instruction sequence.  That is, both accesses use the same base
 
26538
+   register and the gap between constant offsets is 4.  This function
 
26539
+   may reorder its operands to match ldrd/strd RTL templates.
 
26540
+   OPERANDS are the operands found by the peephole matcher;
 
26541
+   OPERANDS[0,1] are register operands, and OPERANDS[2,3] are the
 
26542
+   corresponding memory operands.  LOAD indicaates whether the access
 
26543
+   is load or store.  CONST_STORE indicates a store of constant
 
26544
+   integer values held in OPERANDS[4,5] and assumes that the pattern
 
26545
+   is of length 4 insn, for the purpose of checking dead registers.
 
26546
+   COMMUTE indicates that register operands may be reordered.  */
 
26547
+bool
 
26548
+gen_operands_ldrd_strd (rtx *operands, bool load,
 
26549
+                        bool const_store, bool commute)
 
26550
+{
 
26551
+  int nops = 2;
 
26552
+  HOST_WIDE_INT offsets[2], offset;
 
26553
+  rtx base = NULL_RTX;
 
26554
+  rtx cur_base, cur_offset, tmp;
 
26555
+  int i, gap;
 
26556
+  HARD_REG_SET regset;
 
26557
+
 
26558
+  gcc_assert (!const_store || !load);
 
26559
+  /* Check that the memory references are immediate offsets from the
 
26560
+     same base register.  Extract the base register, the destination
 
26561
+     registers, and the corresponding memory offsets.  */
 
26562
+  for (i = 0; i < nops; i++)
 
26563
+    {
 
26564
+      if (!mem_ok_for_ldrd_strd (operands[nops+i], &cur_base, &cur_offset))
 
26565
+        return false;
 
26566
+
 
26567
+      if (i == 0)
 
26568
+        base = cur_base;
 
26569
+      else if (REGNO (base) != REGNO (cur_base))
 
26570
+        return false;
 
26571
+
 
26572
+      offsets[i] = INTVAL (cur_offset);
 
26573
+      if (GET_CODE (operands[i]) == SUBREG)
 
26574
+        {
 
26575
+          tmp = SUBREG_REG (operands[i]);
 
26576
+          gcc_assert (GET_MODE (operands[i]) == GET_MODE (tmp));
 
26577
+          operands[i] = tmp;
 
26578
+        }
 
26579
+    }
 
26580
+
 
26581
+  /* Make sure there is no dependency between the individual loads.  */
 
26582
+  if (load && REGNO (operands[0]) == REGNO (base))
 
26583
+    return false; /* RAW */
 
26584
+
 
26585
+  if (load && REGNO (operands[0]) == REGNO (operands[1]))
 
26586
+    return false; /* WAW */
 
26587
+
 
26588
+  /* If the same input register is used in both stores
 
26589
+     when storing different constants, try to find a free register.
 
26590
+     For example, the code
 
26591
+        mov r0, 0
 
26592
+        str r0, [r2]
 
26593
+        mov r0, 1
 
26594
+        str r0, [r2, #4]
 
26595
+     can be transformed into
 
26596
+        mov r1, 0
 
26597
+        strd r1, r0, [r2]
 
26598
+     in Thumb mode assuming that r1 is free.  */
 
26599
+  if (const_store
 
26600
+      && REGNO (operands[0]) == REGNO (operands[1])
 
26601
+      && INTVAL (operands[4]) != INTVAL (operands[5]))
 
26602
+    {
 
26603
+    if (TARGET_THUMB2)
 
26604
+      {
 
26605
+        CLEAR_HARD_REG_SET (regset);
 
26606
+        tmp = peep2_find_free_register (0, 4, "r", SImode, &regset);
 
26607
+        if (tmp == NULL_RTX)
 
26608
+          return false;
 
26609
+
 
26610
+        /* Use the new register in the first load to ensure that
 
26611
+           if the original input register is not dead after peephole,
 
26612
+           then it will have the correct constant value.  */
 
26613
+        operands[0] = tmp;
 
26614
+      }
 
26615
+    else if (TARGET_ARM)
 
26616
+      {
 
26617
+        return false;
 
26618
+        int regno = REGNO (operands[0]);
 
26619
+        if (!peep2_reg_dead_p (4, operands[0]))
 
26620
+          {
 
26621
+            /* When the input register is even and is not dead after the
 
26622
+               pattern, it has to hold the second constant but we cannot
 
26623
+               form a legal STRD in ARM mode with this register as the second
 
26624
+               register.  */
 
26625
+            if (regno % 2 == 0)
 
26626
+              return false;
 
26627
+
 
26628
+            /* Is regno-1 free? */
 
26629
+            SET_HARD_REG_SET (regset);
 
26630
+            CLEAR_HARD_REG_BIT(regset, regno - 1);
 
26631
+            tmp = peep2_find_free_register (0, 4, "r", SImode, &regset);
 
26632
+            if (tmp == NULL_RTX)
 
26633
+              return false;
 
26634
+
 
26635
+            operands[0] = tmp;
 
26636
+          }
 
26637
+        else
 
26638
+          {
 
26639
+            /* Find a DImode register.  */
 
26640
+            CLEAR_HARD_REG_SET (regset);
 
26641
+            tmp = peep2_find_free_register (0, 4, "r", DImode, &regset);
 
26642
+            if (tmp != NULL_RTX)
 
26643
+              {
 
26644
+                operands[0] = simplify_gen_subreg (SImode, tmp, DImode, 0);
 
26645
+                operands[1] = simplify_gen_subreg (SImode, tmp, DImode, 4);
 
26646
+              }
 
26647
+            else
 
26648
+              {
 
26649
+                /* Can we use the input register to form a DI register?  */
 
26650
+                SET_HARD_REG_SET (regset);
 
26651
+                CLEAR_HARD_REG_BIT(regset,
 
26652
+                                   regno % 2 == 0 ? regno + 1 : regno - 1);
 
26653
+                tmp = peep2_find_free_register (0, 4, "r", SImode, &regset);
 
26654
+                if (tmp == NULL_RTX)
 
26655
+                  return false;
 
26656
+                operands[regno % 2 == 1 ? 0 : 1] = tmp;
 
26657
+              }
 
26658
+          }
 
26659
+
 
26660
+        gcc_assert (operands[0] != NULL_RTX);
 
26661
+        gcc_assert (operands[1] != NULL_RTX);
 
26662
+        gcc_assert (REGNO (operands[0]) % 2 == 0);
 
26663
+        gcc_assert (REGNO (operands[1]) == REGNO (operands[0]) + 1);
 
26664
+      }
 
26665
+    }
 
26666
+
 
26667
+  /* Make sure the instructions are ordered with lower memory access first.  */
 
26668
+  if (offsets[0] > offsets[1])
 
26669
+    {
 
26670
+      gap = offsets[0] - offsets[1];
 
26671
+      offset = offsets[1];
 
26672
+
 
26673
+      /* Swap the instructions such that lower memory is accessed first.  */
 
26674
+      SWAP_RTX (operands[0], operands[1]);
 
26675
+      SWAP_RTX (operands[2], operands[3]);
 
26676
+      if (const_store)
 
26677
+        SWAP_RTX (operands[4], operands[5]);
 
26678
+    }
 
26679
+  else
 
26680
+    {
 
26681
+      gap = offsets[1] - offsets[0];
 
26682
+      offset = offsets[0];
 
26683
+    }
 
26684
+
 
26685
+  /* Make sure accesses are to consecutive memory locations.  */
 
26686
+  if (gap != 4)
 
26687
+    return false;
 
26688
+
 
26689
+  /* Make sure we generate legal instructions.  */
 
26690
+  if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset,
 
26691
+                             false, load))
 
26692
+    return true;
 
26693
+
 
26694
+  /* In Thumb state, where registers are almost unconstrained, there
 
26695
+     is little hope to fix it.  */
 
26696
+  if (TARGET_THUMB2)
 
26697
+    return false;
 
26698
+
 
26699
+  if (load && commute)
 
26700
+    {
 
26701
+      /* Try reordering registers.  */
 
26702
+      SWAP_RTX (operands[0], operands[1]);
 
26703
+      if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset,
 
26704
+                                 false, load))
 
26705
+        return true;
 
26706
+    }
 
26707
+
 
26708
+  if (const_store)
 
26709
+    {
 
26710
+      /* If input registers are dead after this pattern, they can be
 
26711
+         reordered or replaced by other registers that are free in the
 
26712
+         current pattern.  */
 
26713
+      if (!peep2_reg_dead_p (4, operands[0])
 
26714
+          || !peep2_reg_dead_p (4, operands[1]))
 
26715
+        return false;
 
26716
+
 
26717
+      /* Try to reorder the input registers.  */
 
26718
+      /* For example, the code
 
26719
+           mov r0, 0
 
26720
+           mov r1, 1
 
26721
+           str r1, [r2]
 
26722
+           str r0, [r2, #4]
 
26723
+         can be transformed into
 
26724
+           mov r1, 0
 
26725
+           mov r0, 1
 
26726
+           strd r0, [r2]
 
26727
+      */
 
26728
+      if (operands_ok_ldrd_strd (operands[1], operands[0], base, offset,
 
26729
+                                  false, false))
 
26730
+        {
 
26731
+          SWAP_RTX (operands[0], operands[1]);
 
26732
+          return true;
 
26733
+        }
 
26734
+
 
26735
+      /* Try to find a free DI register.  */
 
26736
+      CLEAR_HARD_REG_SET (regset);
 
26737
+      add_to_hard_reg_set (&regset, SImode, REGNO (operands[0]));
 
26738
+      add_to_hard_reg_set (&regset, SImode, REGNO (operands[1]));
 
26739
+      while (true)
 
26740
+        {
 
26741
+          tmp = peep2_find_free_register (0, 4, "r", DImode, &regset);
 
26742
+          if (tmp == NULL_RTX)
 
26743
+            return false;
 
26744
+
 
26745
+          /* DREG must be an even-numbered register in DImode.
 
26746
+             Split it into SI registers.  */
 
26747
+          operands[0] = simplify_gen_subreg (SImode, tmp, DImode, 0);
 
26748
+          operands[1] = simplify_gen_subreg (SImode, tmp, DImode, 4);
 
26749
+          gcc_assert (operands[0] != NULL_RTX);
 
26750
+          gcc_assert (operands[1] != NULL_RTX);
 
26751
+          gcc_assert (REGNO (operands[0]) % 2 == 0);
 
26752
+          gcc_assert (REGNO (operands[0]) + 1 == REGNO (operands[1]));
 
26753
+
 
26754
+          return (operands_ok_ldrd_strd (operands[0], operands[1],
 
26755
+                                         base, offset,
 
26756
+                                         false, load));
 
26757
+        }
 
26758
+    }
 
26759
+
 
26760
+  return false;
 
26761
+}
 
26762
+#undef SWAP_RTX
 
26763
+
 
26764
+
 
26765
+
 
26766
 
 
26767
 /* Print a symbolic form of X to the debug file, F.  */
 
26768
 static void
 
26769
@@ -13858,6 +14351,16 @@
 
26770
                                   && IN_RANGE (INTVAL (op1), -7, 7))
 
26771
                            action = CONV;
 
26772
                        }
 
26773
+                     /* ADCS <Rd>, <Rn>  */
 
26774
+                     else if (GET_CODE (XEXP (src, 0)) == PLUS
 
26775
+                             && rtx_equal_p (XEXP (XEXP (src, 0), 0), dst)
 
26776
+                             && low_register_operand (XEXP (XEXP (src, 0), 1),
 
26777
+                                                      SImode)
 
26778
+                             && COMPARISON_P (op1)
 
26779
+                             && cc_register (XEXP (op1, 0), VOIDmode)
 
26780
+                             && maybe_get_arm_condition_code (op1) == ARM_CS
 
26781
+                             && XEXP (op1, 1) == const0_rtx)
 
26782
+                       action = CONV;
 
26783
                      break;
 
26784
 
 
26785
                    case MINUS:
 
26786
@@ -14816,7 +15319,8 @@
 
26787
     {
 
26788
       /* Constraints should ensure this.  */
 
26789
       gcc_assert (code0 == MEM && code1 == REG);
 
26790
-      gcc_assert (REGNO (operands[1]) != IP_REGNUM);
 
26791
+      gcc_assert ((REGNO (operands[1]) != IP_REGNUM)
 
26792
+                  || (TARGET_ARM && TARGET_LDRD));
 
26793
 
 
26794
       switch (GET_CODE (XEXP (operands[0], 0)))
 
26795
         {
 
26796
@@ -16289,124 +16793,308 @@
 
26797
     }
 
26798
 }
 
26799
 
 
26800
-/* Generate and emit a pattern that will be recognized as STRD pattern.  If even
 
26801
-   number of registers are being pushed, multiple STRD patterns are created for
 
26802
-   all register pairs.  If odd number of registers are pushed, emit a
 
26803
-   combination of STRDs and STR for the prologue saves.  */
 
26804
+/* Generate and emit a sequence of insns equivalent to PUSH, but using
 
26805
+   STR and STRD.  If an even number of registers are being pushed, one
 
26806
+   or more STRD patterns are created for each register pair.  If an
 
26807
+   odd number of registers are pushed, emit an initial STR followed by
 
26808
+   as many STRD instructions as are needed.  This works best when the
 
26809
+   stack is initially 64-bit aligned (the normal case), since it
 
26810
+   ensures that each STRD is also 64-bit aligned.  */
 
26811
 static void
 
26812
 thumb2_emit_strd_push (unsigned long saved_regs_mask)
 
26813
 {
 
26814
   int num_regs = 0;
 
26815
-  int i, j;
 
26816
+  int i;
 
26817
+  int regno;
 
26818
   rtx par = NULL_RTX;
 
26819
-  rtx insn = NULL_RTX;
 
26820
   rtx dwarf = NULL_RTX;
 
26821
-  rtx tmp, reg, tmp1;
 
26822
+  rtx tmp;
 
26823
+  bool first = true;
 
26824
 
 
26825
+  num_regs = bit_count (saved_regs_mask);
 
26826
+
 
26827
+  /* Must be at least one register to save, and can't save SP or PC.  */
 
26828
+  gcc_assert (num_regs > 0 && num_regs <= 14);
 
26829
+  gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM)));
 
26830
+  gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM)));
 
26831
+
 
26832
+  /* Create sequence for DWARF info.  All the frame-related data for
 
26833
+     debugging is held in this wrapper.  */
 
26834
+  dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1));
 
26835
+
 
26836
+  /* Describe the stack adjustment.  */
 
26837
+  tmp = gen_rtx_SET (VOIDmode,
 
26838
+                     stack_pointer_rtx,
 
26839
+                     plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs));
 
26840
+  RTX_FRAME_RELATED_P (tmp) = 1;
 
26841
+  XVECEXP (dwarf, 0, 0) = tmp;
 
26842
+
 
26843
+  /* Find the first register.  */
 
26844
+  for (regno = 0; (saved_regs_mask & (1 << regno)) == 0; regno++)
 
26845
+    ;
 
26846
+
 
26847
+  i = 0;
 
26848
+
 
26849
+  /* If there's an odd number of registers to push.  Start off by
 
26850
+     pushing a single register.  This ensures that subsequent strd
 
26851
+     operations are dword aligned (assuming that SP was originally
 
26852
+     64-bit aligned).  */
 
26853
+  if ((num_regs & 1) != 0)
 
26854
+    {
 
26855
+      rtx reg, mem, insn;
 
26856
+
 
26857
+      reg = gen_rtx_REG (SImode, regno);
 
26858
+      if (num_regs == 1)
 
26859
+       mem = gen_frame_mem (Pmode, gen_rtx_PRE_DEC (Pmode,
 
26860
+                                                    stack_pointer_rtx));
 
26861
+      else
 
26862
+       mem = gen_frame_mem (Pmode,
 
26863
+                            gen_rtx_PRE_MODIFY
 
26864
+                            (Pmode, stack_pointer_rtx,
 
26865
+                             plus_constant (Pmode, stack_pointer_rtx,
 
26866
+                                            -4 * num_regs)));
 
26867
+
 
26868
+      tmp = gen_rtx_SET (VOIDmode, mem, reg);
 
26869
+      RTX_FRAME_RELATED_P (tmp) = 1;
 
26870
+      insn = emit_insn (tmp);
 
26871
+      RTX_FRAME_RELATED_P (insn) = 1;
 
26872
+      add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf);
 
26873
+      tmp = gen_rtx_SET (VOIDmode, gen_frame_mem (Pmode, stack_pointer_rtx),
 
26874
+                        reg);
 
26875
+      RTX_FRAME_RELATED_P (tmp) = 1;
 
26876
+      i++;
 
26877
+      regno++;
 
26878
+      XVECEXP (dwarf, 0, i) = tmp;
 
26879
+      first = false;
 
26880
+    }
 
26881
+
 
26882
+  while (i < num_regs)
 
26883
+    if (saved_regs_mask & (1 << regno))
 
26884
+      {
 
26885
+       rtx reg1, reg2, mem1, mem2;
 
26886
+       rtx tmp0, tmp1, tmp2;
 
26887
+       int regno2;
 
26888
+
 
26889
+       /* Find the register to pair with this one.  */
 
26890
+       for (regno2 = regno + 1; (saved_regs_mask & (1 << regno2)) == 0;
 
26891
+            regno2++)
 
26892
+         ;
 
26893
+
 
26894
+       reg1 = gen_rtx_REG (SImode, regno);
 
26895
+       reg2 = gen_rtx_REG (SImode, regno2);
 
26896
+
 
26897
+       if (first)
 
26898
+         {
 
26899
+           rtx insn;
 
26900
+
 
26901
+           first = false;
 
26902
+           mem1 = gen_frame_mem (Pmode, plus_constant (Pmode,
 
26903
+                                                       stack_pointer_rtx,
 
26904
+                                                       -4 * num_regs));
 
26905
+           mem2 = gen_frame_mem (Pmode, plus_constant (Pmode,
 
26906
+                                                       stack_pointer_rtx,
 
26907
+                                                       -4 * (num_regs - 1)));
 
26908
+           tmp0 = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
 
26909
+                               plus_constant (Pmode, stack_pointer_rtx,
 
26910
+                                              -4 * (num_regs)));
 
26911
+           tmp1 = gen_rtx_SET (VOIDmode, mem1, reg1);
 
26912
+           tmp2 = gen_rtx_SET (VOIDmode, mem2, reg2);
 
26913
+           RTX_FRAME_RELATED_P (tmp0) = 1;
 
26914
+           RTX_FRAME_RELATED_P (tmp1) = 1;
 
26915
+           RTX_FRAME_RELATED_P (tmp2) = 1;
 
26916
+           par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
 
26917
+           XVECEXP (par, 0, 0) = tmp0;
 
26918
+           XVECEXP (par, 0, 1) = tmp1;
 
26919
+           XVECEXP (par, 0, 2) = tmp2;
 
26920
+           insn = emit_insn (par);
 
26921
+           RTX_FRAME_RELATED_P (insn) = 1;
 
26922
+           add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf);
 
26923
+         }
 
26924
+       else
 
26925
+         {
 
26926
+           mem1 = gen_frame_mem (Pmode, plus_constant (Pmode,
 
26927
+                                                       stack_pointer_rtx,
 
26928
+                                                       4 * i));
 
26929
+           mem2 = gen_frame_mem (Pmode, plus_constant (Pmode,
 
26930
+                                                       stack_pointer_rtx,
 
26931
+                                                       4 * (i + 1)));
 
26932
+           tmp1 = gen_rtx_SET (VOIDmode, mem1, reg1);
 
26933
+           tmp2 = gen_rtx_SET (VOIDmode, mem2, reg2);
 
26934
+           RTX_FRAME_RELATED_P (tmp1) = 1;
 
26935
+           RTX_FRAME_RELATED_P (tmp2) = 1;
 
26936
+           par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
 
26937
+           XVECEXP (par, 0, 0) = tmp1;
 
26938
+           XVECEXP (par, 0, 1) = tmp2;
 
26939
+           emit_insn (par);
 
26940
+         }
 
26941
+
 
26942
+       /* Create unwind information.  This is an approximation.  */
 
26943
+       tmp1 = gen_rtx_SET (VOIDmode,
 
26944
+                           gen_frame_mem (Pmode,
 
26945
+                                          plus_constant (Pmode,
 
26946
+                                                         stack_pointer_rtx,
 
26947
+                                                         4 * i)),
 
26948
+                           reg1);
 
26949
+       tmp2 = gen_rtx_SET (VOIDmode,
 
26950
+                           gen_frame_mem (Pmode,
 
26951
+                                          plus_constant (Pmode,
 
26952
+                                                         stack_pointer_rtx,
 
26953
+                                                         4 * (i + 1))),
 
26954
+                           reg2);
 
26955
+
 
26956
+       RTX_FRAME_RELATED_P (tmp1) = 1;
 
26957
+       RTX_FRAME_RELATED_P (tmp2) = 1;
 
26958
+       XVECEXP (dwarf, 0, i + 1) = tmp1;
 
26959
+       XVECEXP (dwarf, 0, i + 2) = tmp2;
 
26960
+       i += 2;
 
26961
+       regno = regno2 + 1;
 
26962
+      }
 
26963
+    else
 
26964
+      regno++;
 
26965
+
 
26966
+  return;
 
26967
+}
 
26968
+
 
26969
+/* STRD in ARM mode requires consecutive registers.  This function emits STRD
 
26970
+   whenever possible, otherwise it emits single-word stores.  The first store
 
26971
+   also allocates stack space for all saved registers, using writeback with
 
26972
+   post-addressing mode.  All other stores use offset addressing.  If no STRD
 
26973
+   can be emitted, this function emits a sequence of single-word stores,
 
26974
+   and not an STM as before, because single-word stores provide more freedom
 
26975
+   scheduling and can be turned into an STM by peephole optimizations.  */
 
26976
+static void
 
26977
+arm_emit_strd_push (unsigned long saved_regs_mask)
 
26978
+{
 
26979
+  int num_regs = 0;
 
26980
+  int i, j, dwarf_index  = 0;
 
26981
+  int offset = 0;
 
26982
+  rtx dwarf = NULL_RTX;
 
26983
+  rtx insn = NULL_RTX;
 
26984
+  rtx tmp, mem;
 
26985
+
 
26986
+  /* TODO: A more efficient code can be emitted by changing the
 
26987
+     layout, e.g., first push all pairs that can use STRD to keep the
 
26988
+     stack aligned, and then push all other registers.  */
 
26989
   for (i = 0; i <= LAST_ARM_REGNUM; i++)
 
26990
     if (saved_regs_mask & (1 << i))
 
26991
       num_regs++;
 
26992
 
 
26993
-  gcc_assert (num_regs && num_regs <= 16);
 
26994
+  gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM)));
 
26995
+  gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM)));
 
26996
+  gcc_assert (num_regs > 0);
 
26997
 
 
26998
-  /* Pre-decrement the stack pointer, based on there being num_regs 4-byte
 
26999
-     registers to push.  */
 
27000
-  tmp = gen_rtx_SET (VOIDmode,
 
27001
-                     stack_pointer_rtx,
 
27002
-                     plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs));
 
27003
-  RTX_FRAME_RELATED_P (tmp) = 1;
 
27004
-  insn = emit_insn (tmp);
 
27005
-
 
27006
   /* Create sequence for DWARF info.  */
 
27007
   dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1));
 
27008
 
 
27009
-  /* RTLs cannot be shared, hence create new copy for dwarf.  */
 
27010
-  tmp1 = gen_rtx_SET (VOIDmode,
 
27011
+  /* For dwarf info, we generate explicit stack update.  */
 
27012
+  tmp = gen_rtx_SET (VOIDmode,
 
27013
                      stack_pointer_rtx,
 
27014
                      plus_constant (Pmode, stack_pointer_rtx, -4 * num_regs));
 
27015
-  RTX_FRAME_RELATED_P (tmp1) = 1;
 
27016
-  XVECEXP (dwarf, 0, 0) = tmp1;
 
27017
+  RTX_FRAME_RELATED_P (tmp) = 1;
 
27018
+  XVECEXP (dwarf, 0, dwarf_index++) = tmp;
 
27019
 
 
27020
-  gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM)));
 
27021
-  gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM)));
 
27022
-
 
27023
-  /* Var j iterates over all the registers to gather all the registers in
 
27024
-     saved_regs_mask.  Var i gives index of register R_j in stack frame.
 
27025
-     A PARALLEL RTX of register-pair is created here, so that pattern for
 
27026
-     STRD can be matched.  If num_regs is odd, 1st register will be pushed
 
27027
-     using STR and remaining registers will be pushed with STRD in pairs.
 
27028
-     If num_regs is even, all registers are pushed with STRD in pairs.
 
27029
-     Hence, skip first element for odd num_regs.  */
 
27030
-  for (i = num_regs - 1, j = LAST_ARM_REGNUM; i >= (num_regs % 2); j--)
 
27031
+  /* Save registers.  */
 
27032
+  offset = - 4 * num_regs;
 
27033
+  j = 0;
 
27034
+  while (j <= LAST_ARM_REGNUM)
 
27035
     if (saved_regs_mask & (1 << j))
 
27036
       {
 
27037
-        /* Create RTX for store.  New RTX is created for dwarf as
 
27038
-           they are not sharable.  */
 
27039
-        reg = gen_rtx_REG (SImode, j);
 
27040
-        tmp = gen_rtx_SET (SImode,
 
27041
-                           gen_frame_mem
 
27042
-                           (SImode,
 
27043
-                            plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
 
27044
-                           reg);
 
27045
+        if ((j % 2 == 0)
 
27046
+            && (saved_regs_mask & (1 << (j + 1))))
 
27047
+          {
 
27048
+            /* Current register and previous register form register pair for
 
27049
+               which STRD can be generated.  */
 
27050
+            if (offset < 0)
 
27051
+              {
 
27052
+                /* Allocate stack space for all saved registers.  */
 
27053
+                tmp = plus_constant (Pmode, stack_pointer_rtx, offset);
 
27054
+                tmp = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, tmp);
 
27055
+                mem = gen_frame_mem (DImode, tmp);
 
27056
+                offset = 0;
 
27057
+              }
 
27058
+            else if (offset > 0)
 
27059
+              mem = gen_frame_mem (DImode,
 
27060
+                                   plus_constant (Pmode,
 
27061
+                                                  stack_pointer_rtx,
 
27062
+                                                  offset));
 
27063
+            else
 
27064
+              mem = gen_frame_mem (DImode, stack_pointer_rtx);
 
27065
 
 
27066
-        tmp1 = gen_rtx_SET (SImode,
 
27067
-                           gen_frame_mem
 
27068
-                           (SImode,
 
27069
-                            plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
 
27070
-                           reg);
 
27071
-        RTX_FRAME_RELATED_P (tmp) = 1;
 
27072
-        RTX_FRAME_RELATED_P (tmp1) = 1;
 
27073
+            tmp = gen_rtx_SET (DImode, mem, gen_rtx_REG (DImode, j));
 
27074
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27075
+            tmp = emit_insn (tmp);
 
27076
 
 
27077
-        if (((i - (num_regs % 2)) % 2) == 1)
 
27078
-          /* When (i - (num_regs % 2)) is odd, the RTX to be emitted is yet to
 
27079
-             be created.  Hence create it first.  The STRD pattern we are
 
27080
-             generating is :
 
27081
-             [ (SET (MEM (PLUS (SP) (NUM))) (reg_t1))
 
27082
-               (SET (MEM (PLUS (SP) (NUM + 4))) (reg_t2)) ]
 
27083
-             where the target registers need not be consecutive.  */
 
27084
-          par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
 
27085
+            /* Record the first store insn.  */
 
27086
+            if (dwarf_index == 1)
 
27087
+              insn = tmp;
 
27088
 
 
27089
-        /* Register R_j is added in PARALLEL RTX.  If (i - (num_regs % 2)) is
 
27090
-           even, the reg_j is added as 0th element and if it is odd, reg_i is
 
27091
-           added as 1st element of STRD pattern shown above.  */
 
27092
-        XVECEXP (par, 0, ((i - (num_regs % 2)) % 2)) = tmp;
 
27093
-        XVECEXP (dwarf, 0, (i + 1)) = tmp1;
 
27094
+            /* Generate dwarf info.  */
 
27095
+            mem = gen_frame_mem (SImode,
 
27096
+                                 plus_constant (Pmode,
 
27097
+                                                stack_pointer_rtx,
 
27098
+                                                offset));
 
27099
+            tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j));
 
27100
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27101
+            XVECEXP (dwarf, 0, dwarf_index++) = tmp;
 
27102
 
 
27103
-        if (((i - (num_regs % 2)) % 2) == 0)
 
27104
-          /* When (i - (num_regs % 2)) is even, RTXs for both the registers
 
27105
-             to be loaded are generated in above given STRD pattern, and the
 
27106
-             pattern can be emitted now.  */
 
27107
-          emit_insn (par);
 
27108
+            mem = gen_frame_mem (SImode,
 
27109
+                                 plus_constant (Pmode,
 
27110
+                                                stack_pointer_rtx,
 
27111
+                                                offset + 4));
 
27112
+            tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j + 1));
 
27113
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27114
+            XVECEXP (dwarf, 0, dwarf_index++) = tmp;
 
27115
 
 
27116
-        i--;
 
27117
-      }
 
27118
+            offset += 8;
 
27119
+            j += 2;
 
27120
+          }
 
27121
+        else
 
27122
+          {
 
27123
+            /* Emit a single word store.  */
 
27124
+            if (offset < 0)
 
27125
+              {
 
27126
+                /* Allocate stack space for all saved registers.  */
 
27127
+                tmp = plus_constant (Pmode, stack_pointer_rtx, offset);
 
27128
+                tmp = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, tmp);
 
27129
+                mem = gen_frame_mem (SImode, tmp);
 
27130
+                offset = 0;
 
27131
+              }
 
27132
+            else if (offset > 0)
 
27133
+              mem = gen_frame_mem (SImode,
 
27134
+                                   plus_constant (Pmode,
 
27135
+                                                  stack_pointer_rtx,
 
27136
+                                                  offset));
 
27137
+            else
 
27138
+              mem = gen_frame_mem (SImode, stack_pointer_rtx);
 
27139
 
 
27140
-  if ((num_regs % 2) == 1)
 
27141
-    {
 
27142
-      /* If odd number of registers are pushed, generate STR pattern to store
 
27143
-         lone register.  */
 
27144
-      for (; (saved_regs_mask & (1 << j)) == 0; j--);
 
27145
+            tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j));
 
27146
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27147
+            tmp = emit_insn (tmp);
 
27148
 
 
27149
-      tmp1 = gen_frame_mem (SImode, plus_constant (Pmode,
 
27150
-                                                   stack_pointer_rtx, 4 * i));
 
27151
-      reg = gen_rtx_REG (SImode, j);
 
27152
-      tmp = gen_rtx_SET (SImode, tmp1, reg);
 
27153
-      RTX_FRAME_RELATED_P (tmp) = 1;
 
27154
+            /* Record the first store insn.  */
 
27155
+            if (dwarf_index == 1)
 
27156
+              insn = tmp;
 
27157
 
 
27158
-      emit_insn (tmp);
 
27159
+            /* Generate dwarf info.  */
 
27160
+            mem = gen_frame_mem (SImode,
 
27161
+                                 plus_constant(Pmode,
 
27162
+                                               stack_pointer_rtx,
 
27163
+                                               offset));
 
27164
+            tmp = gen_rtx_SET (SImode, mem, gen_rtx_REG (SImode, j));
 
27165
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27166
+            XVECEXP (dwarf, 0, dwarf_index++) = tmp;
 
27167
 
 
27168
-      tmp1 = gen_rtx_SET (SImode,
 
27169
-                         gen_frame_mem
 
27170
-                         (SImode,
 
27171
-                          plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
 
27172
-                          reg);
 
27173
-      RTX_FRAME_RELATED_P (tmp1) = 1;
 
27174
-      XVECEXP (dwarf, 0, (i + 1)) = tmp1;
 
27175
-    }
 
27176
+            offset += 4;
 
27177
+            j += 1;
 
27178
+          }
 
27179
+      }
 
27180
+    else
 
27181
+      j++;
 
27182
 
 
27183
+  /* Attach dwarf info to the first insn we generate.  */
 
27184
+  gcc_assert (insn != NULL_RTX);
 
27185
   add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf);
 
27186
   RTX_FRAME_RELATED_P (insn) = 1;
 
27187
-  return;
 
27188
 }
 
27189
 
 
27190
 /* Generate and emit an insn that we will recognize as a push_multi.
 
27191
@@ -16551,6 +17239,19 @@
 
27192
   return par;
 
27193
 }
 
27194
 
 
27195
+/* Add a REG_CFA_ADJUST_CFA REG note to INSN.
 
27196
+   SIZE is the offset to be adjusted.
 
27197
+   DEST and SRC might be stack_pointer_rtx or hard_frame_pointer_rtx.  */
 
27198
+static void
 
27199
+arm_add_cfa_adjust_cfa_note (rtx insn, int size, rtx dest, rtx src)
 
27200
+{
 
27201
+  rtx dwarf;
 
27202
+
 
27203
+  RTX_FRAME_RELATED_P (insn) = 1;
 
27204
+  dwarf = gen_rtx_SET (VOIDmode, dest, plus_constant (Pmode, src, size));
 
27205
+  add_reg_note (insn, REG_CFA_ADJUST_CFA, dwarf);
 
27206
+}
 
27207
+
 
27208
 /* Generate and emit an insn pattern that we will recognize as a pop_multi.
 
27209
    SAVED_REGS_MASK shows which registers need to be restored.
 
27210
 
 
27211
@@ -16608,6 +17309,17 @@
 
27212
     if (saved_regs_mask & (1 << i))
 
27213
       {
 
27214
         reg = gen_rtx_REG (SImode, i);
 
27215
+        if ((num_regs == 1) && emit_update && !return_in_pc)
 
27216
+          {
 
27217
+            /* Emit single load with writeback.  */
 
27218
+            tmp = gen_frame_mem (SImode,
 
27219
+                                 gen_rtx_POST_INC (Pmode,
 
27220
+                                                   stack_pointer_rtx));
 
27221
+            tmp = emit_insn (gen_rtx_SET (VOIDmode, reg, tmp));
 
27222
+            REG_NOTES (tmp) = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
 
27223
+            return;
 
27224
+          }
 
27225
+
 
27226
         tmp = gen_rtx_SET (VOIDmode,
 
27227
                            reg,
 
27228
                            gen_frame_mem
 
27229
@@ -16630,6 +17342,9 @@
 
27230
     par = emit_insn (par);
 
27231
 
 
27232
   REG_NOTES (par) = dwarf;
 
27233
+  if (!return_in_pc)
 
27234
+    arm_add_cfa_adjust_cfa_note (par, UNITS_PER_WORD * num_regs,
 
27235
+                                stack_pointer_rtx, stack_pointer_rtx);
 
27236
 }
 
27237
 
 
27238
 /* Generate and emit an insn pattern that we will recognize as a pop_multi
 
27239
@@ -16700,6 +17415,9 @@
 
27240
 
 
27241
   par = emit_insn (par);
 
27242
   REG_NOTES (par) = dwarf;
 
27243
+
 
27244
+  arm_add_cfa_adjust_cfa_note (par, 2 * UNITS_PER_WORD * num_regs,
 
27245
+                              base_reg, base_reg);
 
27246
 }
 
27247
 
 
27248
 /* Generate and emit a pattern that will be recognized as LDRD pattern.  If even
 
27249
@@ -16775,6 +17493,7 @@
 
27250
                pattern can be emitted now.  */
 
27251
             par = emit_insn (par);
 
27252
             REG_NOTES (par) = dwarf;
 
27253
+           RTX_FRAME_RELATED_P (par) = 1;
 
27254
           }
 
27255
 
 
27256
         i++;
 
27257
@@ -16791,7 +17510,12 @@
 
27258
                      stack_pointer_rtx,
 
27259
                      plus_constant (Pmode, stack_pointer_rtx, 4 * i));
 
27260
   RTX_FRAME_RELATED_P (tmp) = 1;
 
27261
-  emit_insn (tmp);
 
27262
+  tmp = emit_insn (tmp);
 
27263
+  if (!return_in_pc)
 
27264
+    {
 
27265
+      arm_add_cfa_adjust_cfa_note (tmp, UNITS_PER_WORD * i,
 
27266
+                                  stack_pointer_rtx, stack_pointer_rtx);
 
27267
+    }
 
27268
 
 
27269
   dwarf = NULL_RTX;
 
27270
 
 
27271
@@ -16825,9 +17549,11 @@
 
27272
       else
 
27273
         {
 
27274
           par = emit_insn (tmp);
 
27275
+         REG_NOTES (par) = dwarf;
 
27276
+         arm_add_cfa_adjust_cfa_note (par, UNITS_PER_WORD,
 
27277
+                                      stack_pointer_rtx, stack_pointer_rtx);
 
27278
         }
 
27279
 
 
27280
-      REG_NOTES (par) = dwarf;
 
27281
     }
 
27282
   else if ((num_regs % 2) == 1 && return_in_pc)
 
27283
     {
 
27284
@@ -16839,6 +17565,129 @@
 
27285
   return;
 
27286
 }
 
27287
 
 
27288
+/* LDRD in ARM mode needs consecutive registers as operands.  This function
 
27289
+   emits LDRD whenever possible, otherwise it emits single-word loads. It uses
 
27290
+   offset addressing and then generates one separate stack udpate. This provides
 
27291
+   more scheduling freedom, compared to writeback on every load.  However,
 
27292
+   if the function returns using load into PC directly
 
27293
+   (i.e., if PC is in SAVED_REGS_MASK), the stack needs to be updated
 
27294
+   before the last load.  TODO: Add a peephole optimization to recognize
 
27295
+   the new epilogue sequence as an LDM instruction whenever possible.  TODO: Add
 
27296
+   peephole optimization to merge the load at stack-offset zero
 
27297
+   with the stack update instruction using load with writeback
 
27298
+   in post-index addressing mode.  */
 
27299
+static void
 
27300
+arm_emit_ldrd_pop (unsigned long saved_regs_mask)
 
27301
+{
 
27302
+  int j = 0;
 
27303
+  int offset = 0;
 
27304
+  rtx par = NULL_RTX;
 
27305
+  rtx dwarf = NULL_RTX;
 
27306
+  rtx tmp, mem;
 
27307
+
 
27308
+  /* Restore saved registers.  */
 
27309
+  gcc_assert (!((saved_regs_mask & (1 << SP_REGNUM))));
 
27310
+  j = 0;
 
27311
+  while (j <= LAST_ARM_REGNUM)
 
27312
+    if (saved_regs_mask & (1 << j))
 
27313
+      {
 
27314
+        if ((j % 2) == 0
 
27315
+            && (saved_regs_mask & (1 << (j + 1)))
 
27316
+            && (j + 1) != PC_REGNUM)
 
27317
+          {
 
27318
+            /* Current register and next register form register pair for which
 
27319
+               LDRD can be generated. PC is always the last register popped, and
 
27320
+               we handle it separately.  */
 
27321
+            if (offset > 0)
 
27322
+              mem = gen_frame_mem (DImode,
 
27323
+                                   plus_constant (Pmode,
 
27324
+                                                  stack_pointer_rtx,
 
27325
+                                                  offset));
 
27326
+            else
 
27327
+              mem = gen_frame_mem (DImode, stack_pointer_rtx);
 
27328
+
 
27329
+            tmp = gen_rtx_SET (DImode, gen_rtx_REG (DImode, j), mem);
 
27330
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27331
+            tmp = emit_insn (tmp);
 
27332
+
 
27333
+            /* Generate dwarf info.  */
 
27334
+
 
27335
+            dwarf = alloc_reg_note (REG_CFA_RESTORE,
 
27336
+                                    gen_rtx_REG (SImode, j),
 
27337
+                                    NULL_RTX);
 
27338
+            dwarf = alloc_reg_note (REG_CFA_RESTORE,
 
27339
+                                    gen_rtx_REG (SImode, j + 1),
 
27340
+                                    dwarf);
 
27341
+
 
27342
+            REG_NOTES (tmp) = dwarf;
 
27343
+
 
27344
+            offset += 8;
 
27345
+            j += 2;
 
27346
+          }
 
27347
+        else if (j != PC_REGNUM)
 
27348
+          {
 
27349
+            /* Emit a single word load.  */
 
27350
+            if (offset > 0)
 
27351
+              mem = gen_frame_mem (SImode,
 
27352
+                                   plus_constant (Pmode,
 
27353
+                                                  stack_pointer_rtx,
 
27354
+                                                  offset));
 
27355
+            else
 
27356
+              mem = gen_frame_mem (SImode, stack_pointer_rtx);
 
27357
+
 
27358
+            tmp = gen_rtx_SET (SImode, gen_rtx_REG (SImode, j), mem);
 
27359
+            RTX_FRAME_RELATED_P (tmp) = 1;
 
27360
+            tmp = emit_insn (tmp);
 
27361
+
 
27362
+            /* Generate dwarf info.  */
 
27363
+            REG_NOTES (tmp) = alloc_reg_note (REG_CFA_RESTORE,
 
27364
+                                              gen_rtx_REG (SImode, j),
 
27365
+                                              NULL_RTX);
 
27366
+
 
27367
+            offset += 4;
 
27368
+            j += 1;
 
27369
+          }
 
27370
+        else /* j == PC_REGNUM */
 
27371
+          j++;
 
27372
+      }
 
27373
+    else
 
27374
+      j++;
 
27375
+
 
27376
+  /* Update the stack.  */
 
27377
+  if (offset > 0)
 
27378
+    {
 
27379
+      tmp = gen_rtx_SET (Pmode,
 
27380
+                         stack_pointer_rtx,
 
27381
+                         plus_constant (Pmode,
 
27382
+                                        stack_pointer_rtx,
 
27383
+                                        offset));
 
27384
+      RTX_FRAME_RELATED_P (tmp) = 1;
 
27385
+      emit_insn (tmp);
 
27386
+      offset = 0;
 
27387
+    }
 
27388
+
 
27389
+  if (saved_regs_mask & (1 << PC_REGNUM))
 
27390
+    {
 
27391
+      /* Only PC is to be popped.  */
 
27392
+      par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2));
 
27393
+      XVECEXP (par, 0, 0) = ret_rtx;
 
27394
+      tmp = gen_rtx_SET (SImode,
 
27395
+                         gen_rtx_REG (SImode, PC_REGNUM),
 
27396
+                         gen_frame_mem (SImode,
 
27397
+                                        gen_rtx_POST_INC (SImode,
 
27398
+                                                          stack_pointer_rtx)));
 
27399
+      RTX_FRAME_RELATED_P (tmp) = 1;
 
27400
+      XVECEXP (par, 0, 1) = tmp;
 
27401
+      par = emit_jump_insn (par);
 
27402
+
 
27403
+      /* Generate dwarf info.  */
 
27404
+      dwarf = alloc_reg_note (REG_CFA_RESTORE,
 
27405
+                              gen_rtx_REG (SImode, PC_REGNUM),
 
27406
+                              NULL_RTX);
 
27407
+      REG_NOTES (par) = dwarf;
 
27408
+    }
 
27409
+}
 
27410
+
 
27411
 /* Calculate the size of the return value that is passed in registers.  */
 
27412
 static unsigned
 
27413
 arm_size_return_regs (void)
 
27414
@@ -16863,11 +17712,27 @@
 
27415
             || df_regs_ever_live_p (LR_REGNUM));
 
27416
 }
 
27417
 
 
27418
+/* We do not know if r3 will be available because
 
27419
+   we do have an indirect tailcall happening in this
 
27420
+   particular case.  */
 
27421
+static bool
 
27422
+is_indirect_tailcall_p (rtx call)
 
27423
+{
 
27424
+  rtx pat = PATTERN (call);
 
27425
 
 
27426
+  /* Indirect tail call.  */
 
27427
+  pat = XVECEXP (pat, 0, 0);
 
27428
+  if (GET_CODE (pat) == SET)
 
27429
+    pat = SET_SRC (pat);
 
27430
+
 
27431
+  pat = XEXP (XEXP (pat, 0), 0);
 
27432
+  return REG_P (pat);
 
27433
+}
 
27434
+
 
27435
 /* Return true if r3 is used by any of the tail call insns in the
 
27436
    current function.  */
 
27437
 static bool
 
27438
-any_sibcall_uses_r3 (void)
 
27439
+any_sibcall_could_use_r3 (void)
 
27440
 {
 
27441
   edge_iterator ei;
 
27442
   edge e;
 
27443
@@ -16881,7 +17746,8 @@
 
27444
        if (!CALL_P (call))
 
27445
          call = prev_nonnote_nondebug_insn (call);
 
27446
        gcc_assert (CALL_P (call) && SIBLING_CALL_P (call));
 
27447
-       if (find_regno_fusage (call, USE, 3))
 
27448
+       if (find_regno_fusage (call, USE, 3)
 
27449
+           || is_indirect_tailcall_p (call))
 
27450
          return true;
 
27451
       }
 
27452
   return false;
 
27453
@@ -17048,9 +17914,11 @@
 
27454
          /* If it is safe to use r3, then do so.  This sometimes
 
27455
             generates better code on Thumb-2 by avoiding the need to
 
27456
             use 32-bit push/pop instructions.  */
 
27457
-         if (! any_sibcall_uses_r3 ()
 
27458
+          if (! any_sibcall_could_use_r3 ()
 
27459
              && arm_size_return_regs () <= 12
 
27460
-             && (offsets->saved_regs_mask & (1 << 3)) == 0)
 
27461
+             && (offsets->saved_regs_mask & (1 << 3)) == 0
 
27462
+              && (TARGET_THUMB2
 
27463
+                 || !(TARGET_LDRD && current_tune->prefer_ldrd_strd)))
 
27464
            {
 
27465
              reg = 3;
 
27466
            }
 
27467
@@ -17483,6 +18351,12 @@
 
27468
             {
 
27469
               thumb2_emit_strd_push (live_regs_mask);
 
27470
             }
 
27471
+          else if (TARGET_ARM
 
27472
+                   && !TARGET_APCS_FRAME
 
27473
+                   && !IS_INTERRUPT (func_type))
 
27474
+            {
 
27475
+              arm_emit_strd_push (live_regs_mask);
 
27476
+            }
 
27477
           else
 
27478
             {
 
27479
               insn = emit_multi_reg_push (live_regs_mask);
 
27480
@@ -18760,7 +19634,14 @@
 
27481
   enum arm_cond_code code;
 
27482
   int n;
 
27483
   int mask;
 
27484
+  int max;
 
27485
 
 
27486
+  /* Maximum number of conditionally executed instructions in a block
 
27487
+     is minimum of the two max values: maximum allowed in an IT block
 
27488
+     and maximum that is beneficial according to the cost model and tune.  */
 
27489
+  max = (max_insns_skipped < MAX_INSN_PER_IT_BLOCK) ?
 
27490
+    max_insns_skipped : MAX_INSN_PER_IT_BLOCK;
 
27491
+
 
27492
   /* Remove the previous insn from the count of insns to be output.  */
 
27493
   if (arm_condexec_count)
 
27494
       arm_condexec_count--;
 
27495
@@ -18802,9 +19683,9 @@
 
27496
       /* ??? Recognize conditional jumps, and combine them with IT blocks.  */
 
27497
       if (GET_CODE (body) != COND_EXEC)
 
27498
        break;
 
27499
-      /* Allow up to 4 conditionally executed instructions in a block.  */
 
27500
+      /* Maximum number of conditionally executed instructions in a block.  */
 
27501
       n = get_attr_ce_count (insn);
 
27502
-      if (arm_condexec_masklen + n > 4)
 
27503
+      if (arm_condexec_masklen + n > max)
 
27504
        break;
 
27505
 
 
27506
       predicate = COND_EXEC_TEST (body);
 
27507
@@ -19362,6 +20243,7 @@
 
27508
 typedef enum {
 
27509
   T_V8QI,
 
27510
   T_V4HI,
 
27511
+  T_V4HF,
 
27512
   T_V2SI,
 
27513
   T_V2SF,
 
27514
   T_DI,
 
27515
@@ -19379,14 +20261,15 @@
 
27516
 #define TYPE_MODE_BIT(X) (1 << (X))
 
27517
 
 
27518
 #define TB_DREG (TYPE_MODE_BIT (T_V8QI) | TYPE_MODE_BIT (T_V4HI)       \
 
27519
-                | TYPE_MODE_BIT (T_V2SI) | TYPE_MODE_BIT (T_V2SF)      \
 
27520
-                | TYPE_MODE_BIT (T_DI))
 
27521
+                | TYPE_MODE_BIT (T_V4HF) | TYPE_MODE_BIT (T_V2SI)      \
 
27522
+                | TYPE_MODE_BIT (T_V2SF) | TYPE_MODE_BIT (T_DI))
 
27523
 #define TB_QREG (TYPE_MODE_BIT (T_V16QI) | TYPE_MODE_BIT (T_V8HI)      \
 
27524
                 | TYPE_MODE_BIT (T_V4SI) | TYPE_MODE_BIT (T_V4SF)      \
 
27525
                 | TYPE_MODE_BIT (T_V2DI) | TYPE_MODE_BIT (T_TI))
 
27526
 
 
27527
 #define v8qi_UP  T_V8QI
 
27528
 #define v4hi_UP  T_V4HI
 
27529
+#define v4hf_UP  T_V4HF
 
27530
 #define v2si_UP  T_V2SI
 
27531
 #define v2sf_UP  T_V2SF
 
27532
 #define di_UP    T_DI
 
27533
@@ -19422,6 +20305,8 @@
 
27534
   NEON_SCALARMULH,
 
27535
   NEON_SCALARMAC,
 
27536
   NEON_CONVERT,
 
27537
+  NEON_FLOAT_WIDEN,
 
27538
+  NEON_FLOAT_NARROW,
 
27539
   NEON_FIXCONV,
 
27540
   NEON_SELECT,
 
27541
   NEON_RESULTPAIR,
 
27542
@@ -19482,7 +20367,8 @@
 
27543
   VAR9 (T, N, A, B, C, D, E, F, G, H, I), \
 
27544
   {#N, NEON_##T, UP (J), CF (N, J), 0}
 
27545
 
 
27546
-/* The mode entries in the following table correspond to the "key" type of the
 
27547
+/* The NEON builtin data can be found in arm_neon_builtins.def.
 
27548
+   The mode entries in the following table correspond to the "key" type of the
 
27549
    instruction variant, i.e. equivalent to that which would be specified after
 
27550
    the assembler mnemonic, which usually refers to the last vector operand.
 
27551
    (Signed/unsigned/polynomial types are not differentiated between though, and
 
27552
@@ -19492,196 +20378,7 @@
 
27553
 
 
27554
 static neon_builtin_datum neon_builtin_data[] =
 
27555
 {
 
27556
-  VAR10 (BINOP, vadd,
 
27557
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27558
-  VAR3 (BINOP, vaddl, v8qi, v4hi, v2si),
 
27559
-  VAR3 (BINOP, vaddw, v8qi, v4hi, v2si),
 
27560
-  VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27561
-  VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27562
-  VAR3 (BINOP, vaddhn, v8hi, v4si, v2di),
 
27563
-  VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27564
-  VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27565
-  VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si),
 
27566
-  VAR2 (TERNOP, vfma, v2sf, v4sf),
 
27567
-  VAR2 (TERNOP, vfms, v2sf, v4sf),
 
27568
-  VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27569
-  VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si),
 
27570
-  VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si),
 
27571
-  VAR2 (TERNOP, vqdmlal, v4hi, v2si),
 
27572
-  VAR2 (TERNOP, vqdmlsl, v4hi, v2si),
 
27573
-  VAR3 (BINOP, vmull, v8qi, v4hi, v2si),
 
27574
-  VAR2 (SCALARMULL, vmull_n, v4hi, v2si),
 
27575
-  VAR2 (LANEMULL, vmull_lane, v4hi, v2si),
 
27576
-  VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si),
 
27577
-  VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si),
 
27578
-  VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si),
 
27579
-  VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si),
 
27580
-  VAR2 (BINOP, vqdmull, v4hi, v2si),
 
27581
-  VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27582
-  VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27583
-  VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27584
-  VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di),
 
27585
-  VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di),
 
27586
-  VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di),
 
27587
-  VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27588
-  VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27589
-  VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27590
-  VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si),
 
27591
-  VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27592
-  VAR10 (BINOP, vsub,
 
27593
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27594
-  VAR3 (BINOP, vsubl, v8qi, v4hi, v2si),
 
27595
-  VAR3 (BINOP, vsubw, v8qi, v4hi, v2si),
 
27596
-  VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27597
-  VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27598
-  VAR3 (BINOP, vsubhn, v8hi, v4si, v2di),
 
27599
-  VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27600
-  VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27601
-  VAR6 (BINOP, vcgeu, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27602
-  VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27603
-  VAR6 (BINOP, vcgtu, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27604
-  VAR2 (BINOP, vcage, v2sf, v4sf),
 
27605
-  VAR2 (BINOP, vcagt, v2sf, v4sf),
 
27606
-  VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27607
-  VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27608
-  VAR3 (BINOP, vabdl, v8qi, v4hi, v2si),
 
27609
-  VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27610
-  VAR3 (TERNOP, vabal, v8qi, v4hi, v2si),
 
27611
-  VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27612
-  VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27613
-  VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf),
 
27614
-  VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27615
-  VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27616
-  VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf),
 
27617
-  VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf),
 
27618
-  VAR2 (BINOP, vrecps, v2sf, v4sf),
 
27619
-  VAR2 (BINOP, vrsqrts, v2sf, v4sf),
 
27620
-  VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27621
-  VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
27622
-  VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27623
-  VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27624
-  VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27625
-  VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27626
-  VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27627
-  VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27628
-  VAR2 (UNOP, vcnt, v8qi, v16qi),
 
27629
-  VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf),
 
27630
-  VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf),
 
27631
-  VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
27632
-  /* FIXME: vget_lane supports more variants than this!  */
 
27633
-  VAR10 (GETLANE, vget_lane,
 
27634
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27635
-  VAR10 (SETLANE, vset_lane,
 
27636
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27637
-  VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di),
 
27638
-  VAR10 (DUP, vdup_n,
 
27639
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27640
-  VAR10 (DUPLANE, vdup_lane,
 
27641
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27642
-  VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di),
 
27643
-  VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di),
 
27644
-  VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di),
 
27645
-  VAR3 (UNOP, vmovn, v8hi, v4si, v2di),
 
27646
-  VAR3 (UNOP, vqmovn, v8hi, v4si, v2di),
 
27647
-  VAR3 (UNOP, vqmovun, v8hi, v4si, v2di),
 
27648
-  VAR3 (UNOP, vmovl, v8qi, v4hi, v2si),
 
27649
-  VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27650
-  VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27651
-  VAR2 (LANEMAC, vmlal_lane, v4hi, v2si),
 
27652
-  VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si),
 
27653
-  VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27654
-  VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si),
 
27655
-  VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si),
 
27656
-  VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27657
-  VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27658
-  VAR2 (SCALARMAC, vmlal_n, v4hi, v2si),
 
27659
-  VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si),
 
27660
-  VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27661
-  VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si),
 
27662
-  VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si),
 
27663
-  VAR10 (BINOP, vext,
 
27664
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27665
-  VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27666
-  VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi),
 
27667
-  VAR2 (UNOP, vrev16, v8qi, v16qi),
 
27668
-  VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf),
 
27669
-  VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf),
 
27670
-  VAR10 (SELECT, vbsl,
 
27671
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27672
-  VAR2 (RINT, vrintn, v2sf, v4sf),
 
27673
-  VAR2 (RINT, vrinta, v2sf, v4sf),
 
27674
-  VAR2 (RINT, vrintp, v2sf, v4sf),
 
27675
-  VAR2 (RINT, vrintm, v2sf, v4sf),
 
27676
-  VAR2 (RINT, vrintz, v2sf, v4sf),
 
27677
-  VAR2 (RINT, vrintx, v2sf, v4sf),
 
27678
-  VAR1 (VTBL, vtbl1, v8qi),
 
27679
-  VAR1 (VTBL, vtbl2, v8qi),
 
27680
-  VAR1 (VTBL, vtbl3, v8qi),
 
27681
-  VAR1 (VTBL, vtbl4, v8qi),
 
27682
-  VAR1 (VTBX, vtbx1, v8qi),
 
27683
-  VAR1 (VTBX, vtbx2, v8qi),
 
27684
-  VAR1 (VTBX, vtbx3, v8qi),
 
27685
-  VAR1 (VTBX, vtbx4, v8qi),
 
27686
-  VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27687
-  VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27688
-  VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
27689
-  VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di),
 
27690
-  VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di),
 
27691
-  VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di),
 
27692
-  VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di),
 
27693
-  VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di),
 
27694
-  VAR5 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di),
 
27695
-  VAR5 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di),
 
27696
-  VAR5 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di),
 
27697
-  VAR5 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di),
 
27698
-  VAR5 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di),
 
27699
-  VAR10 (LOAD1, vld1,
 
27700
-         v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27701
-  VAR10 (LOAD1LANE, vld1_lane,
 
27702
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27703
-  VAR10 (LOAD1, vld1_dup,
 
27704
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27705
-  VAR10 (STORE1, vst1,
 
27706
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27707
-  VAR10 (STORE1LANE, vst1_lane,
 
27708
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27709
-  VAR9 (LOADSTRUCT,
 
27710
-       vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27711
-  VAR7 (LOADSTRUCTLANE, vld2_lane,
 
27712
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27713
-  VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di),
 
27714
-  VAR9 (STORESTRUCT, vst2,
 
27715
-       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27716
-  VAR7 (STORESTRUCTLANE, vst2_lane,
 
27717
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27718
-  VAR9 (LOADSTRUCT,
 
27719
-       vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27720
-  VAR7 (LOADSTRUCTLANE, vld3_lane,
 
27721
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27722
-  VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di),
 
27723
-  VAR9 (STORESTRUCT, vst3,
 
27724
-       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27725
-  VAR7 (STORESTRUCTLANE, vst3_lane,
 
27726
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27727
-  VAR9 (LOADSTRUCT, vld4,
 
27728
-       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27729
-  VAR7 (LOADSTRUCTLANE, vld4_lane,
 
27730
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27731
-  VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di),
 
27732
-  VAR9 (STORESTRUCT, vst4,
 
27733
-       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
27734
-  VAR7 (STORESTRUCTLANE, vst4_lane,
 
27735
-       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
27736
-  VAR10 (LOGICBINOP, vand,
 
27737
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27738
-  VAR10 (LOGICBINOP, vorr,
 
27739
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27740
-  VAR10 (BINOP, veor,
 
27741
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27742
-  VAR10 (LOGICBINOP, vbic,
 
27743
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
27744
-  VAR10 (LOGICBINOP, vorn,
 
27745
-        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
 
27746
+#include "arm_neon_builtins.def"
 
27747
 };
 
27748
 
 
27749
 #undef CF
 
27750
@@ -19696,9 +20393,36 @@
 
27751
 #undef VAR9
 
27752
 #undef VAR10
 
27753
 
 
27754
-/* Neon defines builtins from ARM_BUILTIN_MAX upwards, though they don't have
 
27755
-   symbolic names defined here (which would require too much duplication).
 
27756
-   FIXME?  */
 
27757
+#define CF(N,X) ARM_BUILTIN_NEON_##N##X
 
27758
+#define VAR1(T, N, A) \
 
27759
+  CF (N, A)
 
27760
+#define VAR2(T, N, A, B) \
 
27761
+  VAR1 (T, N, A), \
 
27762
+  CF (N, B)
 
27763
+#define VAR3(T, N, A, B, C) \
 
27764
+  VAR2 (T, N, A, B), \
 
27765
+  CF (N, C)
 
27766
+#define VAR4(T, N, A, B, C, D) \
 
27767
+  VAR3 (T, N, A, B, C), \
 
27768
+  CF (N, D)
 
27769
+#define VAR5(T, N, A, B, C, D, E) \
 
27770
+  VAR4 (T, N, A, B, C, D), \
 
27771
+  CF (N, E)
 
27772
+#define VAR6(T, N, A, B, C, D, E, F) \
 
27773
+  VAR5 (T, N, A, B, C, D, E), \
 
27774
+  CF (N, F)
 
27775
+#define VAR7(T, N, A, B, C, D, E, F, G) \
 
27776
+  VAR6 (T, N, A, B, C, D, E, F), \
 
27777
+  CF (N, G)
 
27778
+#define VAR8(T, N, A, B, C, D, E, F, G, H) \
 
27779
+  VAR7 (T, N, A, B, C, D, E, F, G), \
 
27780
+  CF (N, H)
 
27781
+#define VAR9(T, N, A, B, C, D, E, F, G, H, I) \
 
27782
+  VAR8 (T, N, A, B, C, D, E, F, G, H), \
 
27783
+  CF (N, I)
 
27784
+#define VAR10(T, N, A, B, C, D, E, F, G, H, I, J) \
 
27785
+  VAR9 (T, N, A, B, C, D, E, F, G, H, I), \
 
27786
+  CF (N, J)
 
27787
 enum arm_builtins
 
27788
 {
 
27789
   ARM_BUILTIN_GETWCGR0,
 
27790
@@ -19947,11 +20671,25 @@
 
27791
 
 
27792
   ARM_BUILTIN_WMERGE,
 
27793
 
 
27794
-  ARM_BUILTIN_NEON_BASE,
 
27795
+#include "arm_neon_builtins.def"
 
27796
 
 
27797
-  ARM_BUILTIN_MAX = ARM_BUILTIN_NEON_BASE + ARRAY_SIZE (neon_builtin_data)
 
27798
+  ,ARM_BUILTIN_MAX
 
27799
 };
 
27800
 
 
27801
+#define ARM_BUILTIN_NEON_BASE (ARM_BUILTIN_MAX - ARRAY_SIZE (neon_builtin_data))
 
27802
+
 
27803
+#undef CF
 
27804
+#undef VAR1
 
27805
+#undef VAR2
 
27806
+#undef VAR3
 
27807
+#undef VAR4
 
27808
+#undef VAR5
 
27809
+#undef VAR6
 
27810
+#undef VAR7
 
27811
+#undef VAR8
 
27812
+#undef VAR9
 
27813
+#undef VAR10
 
27814
+
 
27815
 static GTY(()) tree arm_builtin_decls[ARM_BUILTIN_MAX];
 
27816
 
 
27817
 static void
 
27818
@@ -19962,6 +20700,7 @@
 
27819
 
 
27820
   tree neon_intQI_type_node;
 
27821
   tree neon_intHI_type_node;
 
27822
+  tree neon_floatHF_type_node;
 
27823
   tree neon_polyQI_type_node;
 
27824
   tree neon_polyHI_type_node;
 
27825
   tree neon_intSI_type_node;
 
27826
@@ -19988,6 +20727,7 @@
 
27827
 
 
27828
   tree V8QI_type_node;
 
27829
   tree V4HI_type_node;
 
27830
+  tree V4HF_type_node;
 
27831
   tree V2SI_type_node;
 
27832
   tree V2SF_type_node;
 
27833
   tree V16QI_type_node;
 
27834
@@ -20042,6 +20782,9 @@
 
27835
   neon_float_type_node = make_node (REAL_TYPE);
 
27836
   TYPE_PRECISION (neon_float_type_node) = FLOAT_TYPE_SIZE;
 
27837
   layout_type (neon_float_type_node);
 
27838
+  neon_floatHF_type_node = make_node (REAL_TYPE);
 
27839
+  TYPE_PRECISION (neon_floatHF_type_node) = GET_MODE_PRECISION (HFmode);
 
27840
+  layout_type (neon_floatHF_type_node);
 
27841
 
 
27842
   /* Define typedefs which exactly correspond to the modes we are basing vector
 
27843
      types on.  If you change these names you'll need to change
 
27844
@@ -20050,6 +20793,8 @@
 
27845
                                             "__builtin_neon_qi");
 
27846
   (*lang_hooks.types.register_builtin_type) (neon_intHI_type_node,
 
27847
                                             "__builtin_neon_hi");
 
27848
+  (*lang_hooks.types.register_builtin_type) (neon_floatHF_type_node,
 
27849
+                                            "__builtin_neon_hf");
 
27850
   (*lang_hooks.types.register_builtin_type) (neon_intSI_type_node,
 
27851
                                             "__builtin_neon_si");
 
27852
   (*lang_hooks.types.register_builtin_type) (neon_float_type_node,
 
27853
@@ -20091,6 +20836,8 @@
 
27854
     build_vector_type_for_mode (neon_intQI_type_node, V8QImode);
 
27855
   V4HI_type_node =
 
27856
     build_vector_type_for_mode (neon_intHI_type_node, V4HImode);
 
27857
+  V4HF_type_node =
 
27858
+    build_vector_type_for_mode (neon_floatHF_type_node, V4HFmode);
 
27859
   V2SI_type_node =
 
27860
     build_vector_type_for_mode (neon_intSI_type_node, V2SImode);
 
27861
   V2SF_type_node =
 
27862
@@ -20213,7 +20960,7 @@
 
27863
       neon_builtin_datum *d = &neon_builtin_data[i];
 
27864
 
 
27865
       const char* const modenames[] = {
 
27866
-       "v8qi", "v4hi", "v2si", "v2sf", "di",
 
27867
+       "v8qi", "v4hi", "v4hf", "v2si", "v2sf", "di",
 
27868
        "v16qi", "v8hi", "v4si", "v4sf", "v2di",
 
27869
        "ti", "ei", "oi"
 
27870
       };
 
27871
@@ -20416,8 +21163,9 @@
 
27872
        case NEON_REINTERP:
 
27873
          {
 
27874
            /* We iterate over 5 doubleword types, then 5 quadword
 
27875
-              types.  */
 
27876
-           int rhs = d->mode % 5;
 
27877
+              types. V4HF is not a type used in reinterpret, so we translate
 
27878
+              d->mode to the correct index in reinterp_ftype_dreg.  */
 
27879
+           int rhs = (d->mode - ((d->mode > T_V4HF) ? 1 : 0)) % 5;
 
27880
            switch (insn_data[d->code].operand[0].mode)
 
27881
              {
 
27882
              case V8QImode: ftype = reinterp_ftype_dreg[0][rhs]; break;
 
27883
@@ -20434,7 +21182,38 @@
 
27884
              }
 
27885
          }
 
27886
          break;
 
27887
+       case NEON_FLOAT_WIDEN:
 
27888
+         {
 
27889
+           tree eltype = NULL_TREE;
 
27890
+           tree return_type = NULL_TREE;
 
27891
 
 
27892
+           switch (insn_data[d->code].operand[1].mode)
 
27893
+           {
 
27894
+             case V4HFmode:
 
27895
+               eltype = V4HF_type_node;
 
27896
+               return_type = V4SF_type_node;
 
27897
+               break;
 
27898
+             default: gcc_unreachable ();
 
27899
+           }
 
27900
+           ftype = build_function_type_list (return_type, eltype, NULL);
 
27901
+           break;
 
27902
+         }
 
27903
+       case NEON_FLOAT_NARROW:
 
27904
+         {
 
27905
+           tree eltype = NULL_TREE;
 
27906
+           tree return_type = NULL_TREE;
 
27907
+
 
27908
+           switch (insn_data[d->code].operand[1].mode)
 
27909
+           {
 
27910
+             case V4SFmode:
 
27911
+               eltype = V4SF_type_node;
 
27912
+               return_type = V4HF_type_node;
 
27913
+               break;
 
27914
+             default: gcc_unreachable ();
 
27915
+           }
 
27916
+           ftype = build_function_type_list (return_type, eltype, NULL);
 
27917
+           break;
 
27918
+         }
 
27919
        default:
 
27920
          gcc_unreachable ();
 
27921
        }
 
27922
@@ -21431,6 +22210,8 @@
 
27923
     case NEON_DUP:
 
27924
     case NEON_RINT:
 
27925
     case NEON_SPLIT:
 
27926
+    case NEON_FLOAT_WIDEN:
 
27927
+    case NEON_FLOAT_NARROW:
 
27928
     case NEON_REINTERP:
 
27929
       return arm_expand_neon_args (target, icode, 1, type_mode, exp, fcode,
 
27930
         NEON_ARG_COPY_TO_REG, NEON_ARG_STOP);
 
27931
@@ -21628,7 +22409,7 @@
 
27932
   rtx               op1;
 
27933
   rtx               op2;
 
27934
   rtx               pat;
 
27935
-  int               fcode = DECL_FUNCTION_CODE (fndecl);
 
27936
+  unsigned int      fcode = DECL_FUNCTION_CODE (fndecl);
 
27937
   size_t            i;
 
27938
   enum machine_mode tmode;
 
27939
   enum machine_mode mode0;
 
27940
@@ -23345,7 +24126,7 @@
 
27941
    all we really need to check here is if single register is to be
 
27942
    returned, or multiple register return.  */
 
27943
 void
 
27944
-thumb2_expand_return (void)
 
27945
+thumb2_expand_return (bool simple_return)
 
27946
 {
 
27947
   int i, num_regs;
 
27948
   unsigned long saved_regs_mask;
 
27949
@@ -23358,7 +24139,7 @@
 
27950
     if (saved_regs_mask & (1 << i))
 
27951
       num_regs++;
 
27952
 
 
27953
-  if (saved_regs_mask)
 
27954
+  if (!simple_return && saved_regs_mask)
 
27955
     {
 
27956
       if (num_regs == 1)
 
27957
         {
 
27958
@@ -23636,6 +24417,7 @@
 
27959
 
 
27960
   if (frame_pointer_needed)
 
27961
     {
 
27962
+      rtx insn;
 
27963
       /* Restore stack pointer if necessary.  */
 
27964
       if (TARGET_ARM)
 
27965
         {
 
27966
@@ -23646,9 +24428,12 @@
 
27967
           /* Force out any pending memory operations that reference stacked data
 
27968
              before stack de-allocation occurs.  */
 
27969
           emit_insn (gen_blockage ());
 
27970
-          emit_insn (gen_addsi3 (stack_pointer_rtx,
 
27971
-                                 hard_frame_pointer_rtx,
 
27972
-                                 GEN_INT (amount)));
 
27973
+         insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
 
27974
+                           hard_frame_pointer_rtx,
 
27975
+                           GEN_INT (amount)));
 
27976
+         arm_add_cfa_adjust_cfa_note (insn, amount,
 
27977
+                                      stack_pointer_rtx,
 
27978
+                                      hard_frame_pointer_rtx);
 
27979
 
 
27980
           /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not
 
27981
              deleted.  */
 
27982
@@ -23658,16 +24443,25 @@
 
27983
         {
 
27984
           /* In Thumb-2 mode, the frame pointer points to the last saved
 
27985
              register.  */
 
27986
-          amount = offsets->locals_base - offsets->saved_regs;
 
27987
-          if (amount)
 
27988
-            emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
 
27989
-                                   hard_frame_pointer_rtx,
 
27990
-                                   GEN_INT (amount)));
 
27991
+         amount = offsets->locals_base - offsets->saved_regs;
 
27992
+         if (amount)
 
27993
+           {
 
27994
+             insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
 
27995
+                               hard_frame_pointer_rtx,
 
27996
+                               GEN_INT (amount)));
 
27997
+             arm_add_cfa_adjust_cfa_note (insn, amount,
 
27998
+                                          hard_frame_pointer_rtx,
 
27999
+                                          hard_frame_pointer_rtx);
 
28000
+           }
 
28001
 
 
28002
           /* Force out any pending memory operations that reference stacked data
 
28003
              before stack de-allocation occurs.  */
 
28004
           emit_insn (gen_blockage ());
 
28005
-          emit_insn (gen_movsi (stack_pointer_rtx, hard_frame_pointer_rtx));
 
28006
+         insn = emit_insn (gen_movsi (stack_pointer_rtx,
 
28007
+                                      hard_frame_pointer_rtx));
 
28008
+         arm_add_cfa_adjust_cfa_note (insn, 0,
 
28009
+                                      stack_pointer_rtx,
 
28010
+                                      hard_frame_pointer_rtx);
 
28011
           /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not
 
28012
              deleted.  */
 
28013
           emit_insn (gen_force_register_use (stack_pointer_rtx));
 
28014
@@ -23680,12 +24474,15 @@
 
28015
       amount = offsets->outgoing_args - offsets->saved_regs;
 
28016
       if (amount)
 
28017
         {
 
28018
+         rtx tmp;
 
28019
           /* Force out any pending memory operations that reference stacked data
 
28020
              before stack de-allocation occurs.  */
 
28021
           emit_insn (gen_blockage ());
 
28022
-          emit_insn (gen_addsi3 (stack_pointer_rtx,
 
28023
-                                 stack_pointer_rtx,
 
28024
-                                 GEN_INT (amount)));
 
28025
+         tmp = emit_insn (gen_addsi3 (stack_pointer_rtx,
 
28026
+                                      stack_pointer_rtx,
 
28027
+                                      GEN_INT (amount)));
 
28028
+         arm_add_cfa_adjust_cfa_note (tmp, amount,
 
28029
+                                      stack_pointer_rtx, stack_pointer_rtx);
 
28030
           /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is
 
28031
              not deleted.  */
 
28032
           emit_insn (gen_force_register_use (stack_pointer_rtx));
 
28033
@@ -23738,6 +24535,8 @@
 
28034
           REG_NOTES (insn) = alloc_reg_note (REG_CFA_RESTORE,
 
28035
                                              gen_rtx_REG (V2SImode, i),
 
28036
                                              NULL_RTX);
 
28037
+         arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD,
 
28038
+                                      stack_pointer_rtx, stack_pointer_rtx);
 
28039
         }
 
28040
 
 
28041
   if (saved_regs_mask)
 
28042
@@ -23785,6 +24584,9 @@
 
28043
                     REG_NOTES (insn) = alloc_reg_note (REG_CFA_RESTORE,
 
28044
                                                        gen_rtx_REG (SImode, i),
 
28045
                                                        NULL_RTX);
 
28046
+                   arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD,
 
28047
+                                                stack_pointer_rtx,
 
28048
+                                                stack_pointer_rtx);
 
28049
                   }
 
28050
               }
 
28051
         }
 
28052
@@ -23796,6 +24598,8 @@
 
28053
             {
 
28054
               if (TARGET_THUMB2)
 
28055
                 thumb2_emit_ldrd_pop (saved_regs_mask);
 
28056
+              else if (TARGET_ARM && !IS_INTERRUPT (func_type))
 
28057
+                arm_emit_ldrd_pop (saved_regs_mask);
 
28058
               else
 
28059
                 arm_emit_multi_reg_pop (saved_regs_mask);
 
28060
             }
 
28061
@@ -23808,10 +24612,34 @@
 
28062
     }
 
28063
 
 
28064
   if (crtl->args.pretend_args_size)
 
28065
-    emit_insn (gen_addsi3 (stack_pointer_rtx,
 
28066
-                           stack_pointer_rtx,
 
28067
-                           GEN_INT (crtl->args.pretend_args_size)));
 
28068
+    {
 
28069
+      int i, j;
 
28070
+      rtx dwarf = NULL_RTX;
 
28071
+      rtx tmp = emit_insn (gen_addsi3 (stack_pointer_rtx,
 
28072
+                          stack_pointer_rtx,
 
28073
+                          GEN_INT (crtl->args.pretend_args_size)));
 
28074
 
 
28075
+      RTX_FRAME_RELATED_P (tmp) = 1;
 
28076
+
 
28077
+      if (cfun->machine->uses_anonymous_args)
 
28078
+       {
 
28079
+         /* Restore pretend args.  Refer arm_expand_prologue on how to save
 
28080
+            pretend_args in stack.  */
 
28081
+         int num_regs = crtl->args.pretend_args_size / 4;
 
28082
+         saved_regs_mask = (0xf0 >> num_regs) & 0xf;
 
28083
+         for (j = 0, i = 0; j < num_regs; i++)
 
28084
+           if (saved_regs_mask & (1 << i))
 
28085
+             {
 
28086
+               rtx reg = gen_rtx_REG (SImode, i);
 
28087
+               dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
 
28088
+               j++;
 
28089
+             }
 
28090
+         REG_NOTES (tmp) = dwarf;
 
28091
+       }
 
28092
+      arm_add_cfa_adjust_cfa_note (tmp, crtl->args.pretend_args_size,
 
28093
+                                  stack_pointer_rtx, stack_pointer_rtx);
 
28094
+    }
 
28095
+
 
28096
   if (!really_return)
 
28097
     return;
 
28098
 
 
28099
@@ -25064,7 +25892,7 @@
 
28100
 {
 
28101
   /* Neon also supports V2SImode, etc. listed in the clause below.  */
 
28102
   if (TARGET_NEON && (mode == V2SFmode || mode == V4SImode || mode == V8HImode
 
28103
-      || mode == V16QImode || mode == V4SFmode || mode == V2DImode))
 
28104
+      || mode == V4HFmode || mode == V16QImode || mode == V4SFmode || mode == V2DImode))
 
28105
     return true;
 
28106
 
 
28107
   if ((TARGET_NEON || TARGET_IWMMXT)
 
28108
@@ -25227,9 +26055,8 @@
 
28109
 
 
28110
   nregs = GET_MODE_SIZE (GET_MODE (rtl)) / 8;
 
28111
   p = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (nregs));
 
28112
-  regno = (regno - FIRST_VFP_REGNUM) / 2;
 
28113
   for (i = 0; i < nregs; i++)
 
28114
-    XVECEXP (p, 0, i) = gen_rtx_REG (DImode, 256 + regno + i);
 
28115
+    XVECEXP (p, 0, i) = gen_rtx_REG (DImode, regno + i);
 
28116
 
 
28117
   return p;
 
28118
 }
 
28119
@@ -25479,9 +26306,17 @@
 
28120
          handled_one = true;
 
28121
          break;
 
28122
 
 
28123
+       /* The INSN is generated in epilogue.  It is set as RTX_FRAME_RELATED_P
 
28124
+          to get correct dwarf information for shrink-wrap.  We should not
 
28125
+          emit unwind information for it because these are used either for
 
28126
+          pretend arguments or notes to adjust sp and restore registers from
 
28127
+          stack.  */
 
28128
+       case REG_CFA_ADJUST_CFA:
 
28129
+       case REG_CFA_RESTORE:
 
28130
+         return;
 
28131
+
 
28132
        case REG_CFA_DEF_CFA:
 
28133
        case REG_CFA_EXPRESSION:
 
28134
-       case REG_CFA_ADJUST_CFA:
 
28135
        case REG_CFA_OFFSET:
 
28136
          /* ??? Only handling here what we actually emit.  */
 
28137
          gcc_unreachable ();
 
28138
@@ -25879,6 +26714,7 @@
 
28139
     case cortexa7:
 
28140
     case cortexa8:
 
28141
     case cortexa9:
 
28142
+    case cortexa53:
 
28143
     case fa726te:
 
28144
     case marvell_pj4:
 
28145
       return 2;
 
28146
@@ -25907,6 +26743,7 @@
 
28147
   { V8QImode,  "__builtin_neon_uqi",    "16__simd64_uint8_t" },
 
28148
   { V4HImode,  "__builtin_neon_hi",     "16__simd64_int16_t" },
 
28149
   { V4HImode,  "__builtin_neon_uhi",    "17__simd64_uint16_t" },
 
28150
+  { V4HFmode,  "__builtin_neon_hf",     "18__simd64_float16_t" },
 
28151
   { V2SImode,  "__builtin_neon_si",     "16__simd64_int32_t" },
 
28152
   { V2SImode,  "__builtin_neon_usi",    "17__simd64_uint32_t" },
 
28153
   { V2SFmode,  "__builtin_neon_sf",     "18__simd64_float32_t" },
 
28154
@@ -26005,6 +26842,60 @@
 
28155
   return !TARGET_THUMB1;
 
28156
 }
 
28157
 
 
28158
+tree
 
28159
+arm_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
 
28160
+{
 
28161
+  enum machine_mode in_mode, out_mode;
 
28162
+  int in_n, out_n;
 
28163
+
 
28164
+  if (TREE_CODE (type_out) != VECTOR_TYPE
 
28165
+      || TREE_CODE (type_in) != VECTOR_TYPE
 
28166
+      || !(TARGET_NEON && TARGET_FPU_ARMV8 && flag_unsafe_math_optimizations))
 
28167
+    return NULL_TREE;
 
28168
+
 
28169
+  out_mode = TYPE_MODE (TREE_TYPE (type_out));
 
28170
+  out_n = TYPE_VECTOR_SUBPARTS (type_out);
 
28171
+  in_mode = TYPE_MODE (TREE_TYPE (type_in));
 
28172
+  in_n = TYPE_VECTOR_SUBPARTS (type_in);
 
28173
+
 
28174
+/* ARM_CHECK_BUILTIN_MODE and ARM_FIND_VRINT_VARIANT are used to find the
 
28175
+   decl of the vectorized builtin for the appropriate vector mode.
 
28176
+   NULL_TREE is returned if no such builtin is available.  */
 
28177
+#undef ARM_CHECK_BUILTIN_MODE
 
28178
+#define ARM_CHECK_BUILTIN_MODE(C) \
 
28179
+  (out_mode == SFmode && out_n == C \
 
28180
+   && in_mode == SFmode && in_n == C)
 
28181
+
 
28182
+#undef ARM_FIND_VRINT_VARIANT
 
28183
+#define ARM_FIND_VRINT_VARIANT(N) \
 
28184
+  (ARM_CHECK_BUILTIN_MODE (2) \
 
28185
+    ? arm_builtin_decl(ARM_BUILTIN_NEON_##N##v2sf, false) \
 
28186
+    : (ARM_CHECK_BUILTIN_MODE (4) \
 
28187
+      ? arm_builtin_decl(ARM_BUILTIN_NEON_##N##v4sf, false) \
 
28188
+      : NULL_TREE))
 
28189
+
 
28190
+  if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
 
28191
+    {
 
28192
+      enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
 
28193
+      switch (fn)
 
28194
+        {
 
28195
+          case BUILT_IN_FLOORF:
 
28196
+            return ARM_FIND_VRINT_VARIANT (vrintm);
 
28197
+          case BUILT_IN_CEILF:
 
28198
+            return ARM_FIND_VRINT_VARIANT (vrintp);
 
28199
+          case BUILT_IN_TRUNCF:
 
28200
+            return ARM_FIND_VRINT_VARIANT (vrintz);
 
28201
+          case BUILT_IN_ROUNDF:
 
28202
+            return ARM_FIND_VRINT_VARIANT (vrinta);
 
28203
+          default:
 
28204
+            return NULL_TREE;
 
28205
+        }
 
28206
+    }
 
28207
+  return NULL_TREE;
 
28208
+}
 
28209
+#undef ARM_CHECK_BUILTIN_MODE
 
28210
+#undef ARM_FIND_VRINT_VARIANT
 
28211
+
 
28212
 /* The AAPCS sets the maximum alignment of a vector to 64 bits.  */
 
28213
 static HOST_WIDE_INT
 
28214
 arm_vector_alignment (const_tree type)
 
28215
@@ -26235,40 +27126,72 @@
 
28216
     emit_insn (gen_memory_barrier ());
 
28217
 }
 
28218
 
 
28219
-/* Emit the load-exclusive and store-exclusive instructions.  */
 
28220
+/* Emit the load-exclusive and store-exclusive instructions.
 
28221
+   Use acquire and release versions if necessary.  */
 
28222
 
 
28223
 static void
 
28224
-arm_emit_load_exclusive (enum machine_mode mode, rtx rval, rtx mem)
 
28225
+arm_emit_load_exclusive (enum machine_mode mode, rtx rval, rtx mem, bool acq)
 
28226
 {
 
28227
   rtx (*gen) (rtx, rtx);
 
28228
 
 
28229
-  switch (mode)
 
28230
+  if (acq)
 
28231
     {
 
28232
-    case QImode: gen = gen_arm_load_exclusiveqi; break;
 
28233
-    case HImode: gen = gen_arm_load_exclusivehi; break;
 
28234
-    case SImode: gen = gen_arm_load_exclusivesi; break;
 
28235
-    case DImode: gen = gen_arm_load_exclusivedi; break;
 
28236
-    default:
 
28237
-      gcc_unreachable ();
 
28238
+      switch (mode)
 
28239
+        {
 
28240
+        case QImode: gen = gen_arm_load_acquire_exclusiveqi; break;
 
28241
+        case HImode: gen = gen_arm_load_acquire_exclusivehi; break;
 
28242
+        case SImode: gen = gen_arm_load_acquire_exclusivesi; break;
 
28243
+        case DImode: gen = gen_arm_load_acquire_exclusivedi; break;
 
28244
+        default:
 
28245
+          gcc_unreachable ();
 
28246
+        }
 
28247
     }
 
28248
+  else
 
28249
+    {
 
28250
+      switch (mode)
 
28251
+        {
 
28252
+        case QImode: gen = gen_arm_load_exclusiveqi; break;
 
28253
+        case HImode: gen = gen_arm_load_exclusivehi; break;
 
28254
+        case SImode: gen = gen_arm_load_exclusivesi; break;
 
28255
+        case DImode: gen = gen_arm_load_exclusivedi; break;
 
28256
+        default:
 
28257
+          gcc_unreachable ();
 
28258
+        }
 
28259
+    }
 
28260
 
 
28261
   emit_insn (gen (rval, mem));
 
28262
 }
 
28263
 
 
28264
 static void
 
28265
-arm_emit_store_exclusive (enum machine_mode mode, rtx bval, rtx rval, rtx mem)
 
28266
+arm_emit_store_exclusive (enum machine_mode mode, rtx bval, rtx rval,
 
28267
+                          rtx mem, bool rel)
 
28268
 {
 
28269
   rtx (*gen) (rtx, rtx, rtx);
 
28270
 
 
28271
-  switch (mode)
 
28272
+  if (rel)
 
28273
     {
 
28274
-    case QImode: gen = gen_arm_store_exclusiveqi; break;
 
28275
-    case HImode: gen = gen_arm_store_exclusivehi; break;
 
28276
-    case SImode: gen = gen_arm_store_exclusivesi; break;
 
28277
-    case DImode: gen = gen_arm_store_exclusivedi; break;
 
28278
-    default:
 
28279
-      gcc_unreachable ();
 
28280
+      switch (mode)
 
28281
+        {
 
28282
+        case QImode: gen = gen_arm_store_release_exclusiveqi; break;
 
28283
+        case HImode: gen = gen_arm_store_release_exclusivehi; break;
 
28284
+        case SImode: gen = gen_arm_store_release_exclusivesi; break;
 
28285
+        case DImode: gen = gen_arm_store_release_exclusivedi; break;
 
28286
+        default:
 
28287
+          gcc_unreachable ();
 
28288
+        }
 
28289
     }
 
28290
+  else
 
28291
+    {
 
28292
+      switch (mode)
 
28293
+        {
 
28294
+        case QImode: gen = gen_arm_store_exclusiveqi; break;
 
28295
+        case HImode: gen = gen_arm_store_exclusivehi; break;
 
28296
+        case SImode: gen = gen_arm_store_exclusivesi; break;
 
28297
+        case DImode: gen = gen_arm_store_exclusivedi; break;
 
28298
+        default:
 
28299
+          gcc_unreachable ();
 
28300
+        }
 
28301
+    }
 
28302
 
 
28303
   emit_insn (gen (bval, rval, mem));
 
28304
 }
 
28305
@@ -26303,6 +27226,15 @@
 
28306
   mod_f = operands[7];
 
28307
   mode = GET_MODE (mem);
 
28308
 
 
28309
+  /* Normally the succ memory model must be stronger than fail, but in the
 
28310
+     unlikely event of fail being ACQUIRE and succ being RELEASE we need to
 
28311
+     promote succ to ACQ_REL so that we don't lose the acquire semantics.  */
 
28312
+
 
28313
+  if (TARGET_HAVE_LDACQ
 
28314
+      && INTVAL (mod_f) == MEMMODEL_ACQUIRE
 
28315
+      && INTVAL (mod_s) == MEMMODEL_RELEASE)
 
28316
+    mod_s = GEN_INT (MEMMODEL_ACQ_REL);
 
28317
+
 
28318
   switch (mode)
 
28319
     {
 
28320
     case QImode:
 
28321
@@ -26377,8 +27309,20 @@
 
28322
   scratch = operands[7];
 
28323
   mode = GET_MODE (mem);
 
28324
 
 
28325
-  arm_pre_atomic_barrier (mod_s);
 
28326
+  bool use_acquire = TARGET_HAVE_LDACQ
 
28327
+                     && !(mod_s == MEMMODEL_RELAXED
 
28328
+                          || mod_s == MEMMODEL_CONSUME
 
28329
+                          || mod_s == MEMMODEL_RELEASE);
 
28330
 
 
28331
+  bool use_release = TARGET_HAVE_LDACQ
 
28332
+                     && !(mod_s == MEMMODEL_RELAXED
 
28333
+                          || mod_s == MEMMODEL_CONSUME
 
28334
+                          || mod_s == MEMMODEL_ACQUIRE);
 
28335
+
 
28336
+  /* Checks whether a barrier is needed and emits one accordingly.  */
 
28337
+  if (!(use_acquire || use_release))
 
28338
+    arm_pre_atomic_barrier (mod_s);
 
28339
+
 
28340
   label1 = NULL_RTX;
 
28341
   if (!is_weak)
 
28342
     {
 
28343
@@ -26387,7 +27331,7 @@
 
28344
     }
 
28345
   label2 = gen_label_rtx ();
 
28346
 
 
28347
-  arm_emit_load_exclusive (mode, rval, mem);
 
28348
+  arm_emit_load_exclusive (mode, rval, mem, use_acquire);
 
28349
 
 
28350
   cond = arm_gen_compare_reg (NE, rval, oldval, scratch);
 
28351
   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
 
28352
@@ -26395,7 +27339,7 @@
 
28353
                            gen_rtx_LABEL_REF (Pmode, label2), pc_rtx);
 
28354
   emit_unlikely_jump (gen_rtx_SET (VOIDmode, pc_rtx, x));
 
28355
 
 
28356
-  arm_emit_store_exclusive (mode, scratch, mem, newval);
 
28357
+  arm_emit_store_exclusive (mode, scratch, mem, newval, use_release);
 
28358
 
 
28359
   /* Weak or strong, we want EQ to be true for success, so that we
 
28360
      match the flags that we got from the compare above.  */
 
28361
@@ -26414,7 +27358,9 @@
 
28362
   if (mod_f != MEMMODEL_RELAXED)
 
28363
     emit_label (label2);
 
28364
 
 
28365
-  arm_post_atomic_barrier (mod_s);
 
28366
+  /* Checks whether a barrier is needed and emits one accordingly.  */
 
28367
+  if (!(use_acquire || use_release))
 
28368
+    arm_post_atomic_barrier (mod_s);
 
28369
 
 
28370
   if (mod_f == MEMMODEL_RELAXED)
 
28371
     emit_label (label2);
 
28372
@@ -26429,8 +27375,20 @@
 
28373
   enum machine_mode wmode = (mode == DImode ? DImode : SImode);
 
28374
   rtx label, x;
 
28375
 
 
28376
-  arm_pre_atomic_barrier (model);
 
28377
+  bool use_acquire = TARGET_HAVE_LDACQ
 
28378
+                     && !(model == MEMMODEL_RELAXED
 
28379
+                          || model == MEMMODEL_CONSUME
 
28380
+                          || model == MEMMODEL_RELEASE);
 
28381
 
 
28382
+  bool use_release = TARGET_HAVE_LDACQ
 
28383
+                     && !(model == MEMMODEL_RELAXED
 
28384
+                          || model == MEMMODEL_CONSUME
 
28385
+                          || model == MEMMODEL_ACQUIRE);
 
28386
+
 
28387
+  /* Checks whether a barrier is needed and emits one accordingly.  */
 
28388
+  if (!(use_acquire || use_release))
 
28389
+    arm_pre_atomic_barrier (model);
 
28390
+
 
28391
   label = gen_label_rtx ();
 
28392
   emit_label (label);
 
28393
 
 
28394
@@ -26442,7 +27400,7 @@
 
28395
     old_out = new_out;
 
28396
   value = simplify_gen_subreg (wmode, value, mode, 0);
 
28397
 
 
28398
-  arm_emit_load_exclusive (mode, old_out, mem);
 
28399
+  arm_emit_load_exclusive (mode, old_out, mem, use_acquire);
 
28400
 
 
28401
   switch (code)
 
28402
     {
 
28403
@@ -26490,12 +27448,15 @@
 
28404
       break;
 
28405
     }
 
28406
 
 
28407
-  arm_emit_store_exclusive (mode, cond, mem, gen_lowpart (mode, new_out));
 
28408
+  arm_emit_store_exclusive (mode, cond, mem, gen_lowpart (mode, new_out),
 
28409
+                            use_release);
 
28410
 
 
28411
   x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
 
28412
   emit_unlikely_jump (gen_cbranchsi4 (x, cond, const0_rtx, label));
 
28413
 
 
28414
-  arm_post_atomic_barrier (model);
 
28415
+  /* Checks whether a barrier is needed and emits one accordingly.  */
 
28416
+  if (!(use_acquire || use_release))
 
28417
+    arm_post_atomic_barrier (model);
 
28418
 }
 
28419
 
 
28420
 #define MAX_VECT_LEN 16
 
28421
@@ -27435,4 +28396,12 @@
 
28422
 
 
28423
 }
 
28424
 
 
28425
+/* Implement the TARGET_ASAN_SHADOW_OFFSET hook.  */
 
28426
+
 
28427
+static unsigned HOST_WIDE_INT
 
28428
+arm_asan_shadow_offset (void)
 
28429
+{
 
28430
+  return (unsigned HOST_WIDE_INT) 1 << 29;
 
28431
+}
 
28432
+
 
28433
 #include "gt-arm.h"
 
28434
--- a/src/gcc/config/arm/arm.h
 
28435
+++ b/src/gcc/config/arm/arm.h
 
28436
@@ -183,6 +183,11 @@
 
28437
 
 
28438
 #define ARM_INVERSE_CONDITION_CODE(X)  ((arm_cc) (((int)X) ^ 1))
 
28439
 
 
28440
+/* The maximaum number of instructions that is beneficial to
 
28441
+   conditionally execute. */
 
28442
+#undef MAX_CONDITIONAL_EXECUTE
 
28443
+#define MAX_CONDITIONAL_EXECUTE arm_max_conditional_execute ()
 
28444
+
 
28445
 extern int arm_target_label;
 
28446
 extern int arm_ccfsm_state;
 
28447
 extern GTY(()) rtx arm_target_insn;
 
28448
@@ -350,10 +355,16 @@
 
28449
 #define TARGET_HAVE_LDREXD     (((arm_arch6k && TARGET_ARM) || arm_arch7) \
 
28450
                                 && arm_arch_notm)
 
28451
 
 
28452
+/* Nonzero if this chip supports load-acquire and store-release.  */
 
28453
+#define TARGET_HAVE_LDACQ      (TARGET_ARM_ARCH >= 8)
 
28454
+
 
28455
 /* Nonzero if integer division instructions supported.  */
 
28456
 #define TARGET_IDIV            ((TARGET_ARM && arm_arch_arm_hwdiv) \
 
28457
                                 || (TARGET_THUMB2 && arm_arch_thumb_hwdiv))
 
28458
 
 
28459
+/* Should NEON be used for 64-bits bitops.  */
 
28460
+#define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits)
 
28461
+
 
28462
 /* True iff the full BPABI is being used.  If TARGET_BPABI is true,
 
28463
    then TARGET_AAPCS_BASED must be true -- but the converse does not
 
28464
    hold.  TARGET_BPABI implies the use of the BPABI runtime library,
 
28465
@@ -539,6 +550,10 @@
 
28466
 /* Nonzero if chip supports integer division instruction in Thumb mode.  */
 
28467
 extern int arm_arch_thumb_hwdiv;
 
28468
 
 
28469
+/* Nonzero if we should use Neon to handle 64-bits operations rather
 
28470
+   than core registers.  */
 
28471
+extern int prefer_neon_for_64bits;
 
28472
+
 
28473
 #ifndef TARGET_DEFAULT
 
28474
 #define TARGET_DEFAULT  (MASK_APCS_FRAME)
 
28475
 #endif
 
28476
@@ -630,6 +645,8 @@
 
28477
 
 
28478
 #define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
 
28479
 
 
28480
+#define MALLOC_ABI_ALIGNMENT  BIGGEST_ALIGNMENT
 
28481
+
 
28482
 /* XXX Blah -- this macro is used directly by libobjc.  Since it
 
28483
    supports no vector modes, cut out the complexity and fall back
 
28484
    on BIGGEST_FIELD_ALIGNMENT.  */
 
28485
@@ -1040,7 +1057,7 @@
 
28486
 /* Modes valid for Neon D registers.  */
 
28487
 #define VALID_NEON_DREG_MODE(MODE) \
 
28488
   ((MODE) == V2SImode || (MODE) == V4HImode || (MODE) == V8QImode \
 
28489
-   || (MODE) == V2SFmode || (MODE) == DImode)
 
28490
+   || (MODE) == V4HFmode || (MODE) == V2SFmode || (MODE) == DImode)
 
28491
 
 
28492
 /* Modes valid for Neon Q registers.  */
 
28493
 #define VALID_NEON_QREG_MODE(MODE) \
 
28494
@@ -1130,6 +1147,7 @@
 
28495
   STACK_REG,
 
28496
   BASE_REGS,
 
28497
   HI_REGS,
 
28498
+  CALLER_SAVE_REGS,
 
28499
   GENERAL_REGS,
 
28500
   CORE_REGS,
 
28501
   VFP_D0_D7_REGS,
 
28502
@@ -1156,6 +1174,7 @@
 
28503
   "STACK_REG",         \
 
28504
   "BASE_REGS",         \
 
28505
   "HI_REGS",           \
 
28506
+  "CALLER_SAVE_REGS",  \
 
28507
   "GENERAL_REGS",      \
 
28508
   "CORE_REGS",         \
 
28509
   "VFP_D0_D7_REGS",    \
 
28510
@@ -1181,6 +1200,7 @@
 
28511
   { 0x00002000, 0x00000000, 0x00000000, 0x00000000 }, /* STACK_REG */  \
 
28512
   { 0x000020FF, 0x00000000, 0x00000000, 0x00000000 }, /* BASE_REGS */  \
 
28513
   { 0x00005F00, 0x00000000, 0x00000000, 0x00000000 }, /* HI_REGS */    \
 
28514
+  { 0x0000100F, 0x00000000, 0x00000000, 0x00000000 }, /* CALLER_SAVE_REGS */ \
 
28515
   { 0x00005FFF, 0x00000000, 0x00000000, 0x00000000 }, /* GENERAL_REGS */ \
 
28516
   { 0x00007FFF, 0x00000000, 0x00000000, 0x00000000 }, /* CORE_REGS */  \
 
28517
   { 0xFFFF0000, 0x00000000, 0x00000000, 0x00000000 }, /* VFP_D0_D7_REGS  */ \
 
28518
@@ -1639,7 +1659,7 @@
 
28519
    frame.  */
 
28520
 #define EXIT_IGNORE_STACK 1
 
28521
 
 
28522
-#define EPILOGUE_USES(REGNO) ((REGNO) == LR_REGNUM)
 
28523
+#define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == LR_REGNUM)
 
28524
 
 
28525
 /* Determine if the epilogue should be output as RTL.
 
28526
    You should override this if you define FUNCTION_EXTRA_EPILOGUE.  */
 
28527
--- a/src/gcc/config/arm/cortex-a8.md
 
28528
+++ b/src/gcc/config/arm/cortex-a8.md
 
28529
@@ -85,30 +85,27 @@
 
28530
 ;; (source read in E2 and destination available at the end of that cycle).
 
28531
 (define_insn_reservation "cortex_a8_alu" 2
 
28532
   (and (eq_attr "tune" "cortexa8")
 
28533
-       (ior (and (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
28534
-                     (eq_attr "neon_type" "none"))
 
28535
-                (not (eq_attr "insn" "mov,mvn")))
 
28536
-            (eq_attr "insn" "clz")))
 
28537
+       (ior (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg")
 
28538
+                 (eq_attr "neon_type" "none"))
 
28539
+            (eq_attr "type" "clz")))
 
28540
   "cortex_a8_default")
 
28541
 
 
28542
 (define_insn_reservation "cortex_a8_alu_shift" 2
 
28543
   (and (eq_attr "tune" "cortexa8")
 
28544
-       (and (eq_attr "type" "simple_alu_shift,alu_shift")
 
28545
-            (not (eq_attr "insn" "mov,mvn"))))
 
28546
+       (eq_attr "type" "extend,arlo_shift"))
 
28547
   "cortex_a8_default")
 
28548
 
 
28549
 (define_insn_reservation "cortex_a8_alu_shift_reg" 2
 
28550
   (and (eq_attr "tune" "cortexa8")
 
28551
-       (and (eq_attr "type" "alu_shift_reg")
 
28552
-            (not (eq_attr "insn" "mov,mvn"))))
 
28553
+       (eq_attr "type" "arlo_shift_reg"))
 
28554
   "cortex_a8_default")
 
28555
 
 
28556
 ;; Move instructions.
 
28557
 
 
28558
 (define_insn_reservation "cortex_a8_mov" 1
 
28559
   (and (eq_attr "tune" "cortexa8")
 
28560
-       (and (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg")
 
28561
-            (eq_attr "insn" "mov,mvn")))
 
28562
+       (eq_attr "type" "mov_imm,mov_reg,mov_shift,mov_shift_reg,\
 
28563
+                        mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg"))
 
28564
   "cortex_a8_default")
 
28565
 
 
28566
 ;; Exceptions to the default latencies for data processing instructions.
 
28567
@@ -139,22 +136,22 @@
 
28568
 
 
28569
 (define_insn_reservation "cortex_a8_mul" 6
 
28570
   (and (eq_attr "tune" "cortexa8")
 
28571
-       (eq_attr "insn" "mul,smulxy,smmul"))
 
28572
+       (eq_attr "type" "mul,smulxy,smmul"))
 
28573
   "cortex_a8_multiply_2")
 
28574
 
 
28575
 (define_insn_reservation "cortex_a8_mla" 6
 
28576
   (and (eq_attr "tune" "cortexa8")
 
28577
-       (eq_attr "insn" "mla,smlaxy,smlawy,smmla,smlad,smlsd"))
 
28578
+       (eq_attr "type" "mla,smlaxy,smlawy,smmla,smlad,smlsd"))
 
28579
   "cortex_a8_multiply_2")
 
28580
 
 
28581
 (define_insn_reservation "cortex_a8_mull" 7
 
28582
   (and (eq_attr "tune" "cortexa8")
 
28583
-       (eq_attr "insn" "smull,umull,smlal,umlal,umaal,smlalxy"))
 
28584
+       (eq_attr "type" "smull,umull,smlal,umlal,umaal,smlalxy"))
 
28585
   "cortex_a8_multiply_3")
 
28586
 
 
28587
 (define_insn_reservation "cortex_a8_smulwy" 5
 
28588
   (and (eq_attr "tune" "cortexa8")
 
28589
-       (eq_attr "insn" "smulwy,smuad,smusd"))
 
28590
+       (eq_attr "type" "smulwy,smuad,smusd"))
 
28591
   "cortex_a8_multiply")
 
28592
 
 
28593
 ;; smlald and smlsld are multiply-accumulate instructions but do not
 
28594
@@ -162,7 +159,7 @@
 
28595
 ;; cannot go in cortex_a8_mla above.  (See below for bypass details.)
 
28596
 (define_insn_reservation "cortex_a8_smlald" 6
 
28597
   (and (eq_attr "tune" "cortexa8")
 
28598
-       (eq_attr "insn" "smlald,smlsld"))
 
28599
+       (eq_attr "type" "smlald,smlsld"))
 
28600
   "cortex_a8_multiply_2")
 
28601
 
 
28602
 ;; A multiply with a single-register result or an MLA, followed by an
 
28603
--- a/src/gcc/config/arm/arm-fixed.md
 
28604
+++ b/src/gcc/config/arm/arm-fixed.md
 
28605
@@ -19,12 +19,13 @@
 
28606
 ;; This file contains ARM instructions that support fixed-point operations.
 
28607
 
 
28608
 (define_insn "add<mode>3"
 
28609
-  [(set (match_operand:FIXED 0 "s_register_operand" "=r")
 
28610
-       (plus:FIXED (match_operand:FIXED 1 "s_register_operand" "r")
 
28611
-                   (match_operand:FIXED 2 "s_register_operand" "r")))]
 
28612
+  [(set (match_operand:FIXED 0 "s_register_operand" "=l,r")
 
28613
+       (plus:FIXED (match_operand:FIXED 1 "s_register_operand" "l,r")
 
28614
+                   (match_operand:FIXED 2 "s_register_operand" "l,r")))]
 
28615
   "TARGET_32BIT"
 
28616
   "add%?\\t%0, %1, %2"
 
28617
-  [(set_attr "predicable" "yes")])
 
28618
+  [(set_attr "predicable" "yes")
 
28619
+   (set_attr "predicable_short_it" "yes,no")])
 
28620
 
 
28621
 (define_insn "add<mode>3"
 
28622
   [(set (match_operand:ADDSUB 0 "s_register_operand" "=r")
 
28623
@@ -32,7 +33,8 @@
 
28624
                     (match_operand:ADDSUB 2 "s_register_operand" "r")))]
 
28625
   "TARGET_INT_SIMD"
 
28626
   "sadd<qaddsub_suf>%?\\t%0, %1, %2"
 
28627
-  [(set_attr "predicable" "yes")])
 
28628
+  [(set_attr "predicable" "yes")
 
28629
+   (set_attr "predicable_short_it" "no")])
 
28630
 
 
28631
 (define_insn "usadd<mode>3"
 
28632
   [(set (match_operand:UQADDSUB 0 "s_register_operand" "=r")
 
28633
@@ -40,7 +42,8 @@
 
28634
                          (match_operand:UQADDSUB 2 "s_register_operand" "r")))]
 
28635
   "TARGET_INT_SIMD"
 
28636
   "uqadd<qaddsub_suf>%?\\t%0, %1, %2"
 
28637
-  [(set_attr "predicable" "yes")])
 
28638
+  [(set_attr "predicable" "yes")
 
28639
+   (set_attr "predicable_short_it" "no")])
 
28640
 
 
28641
 (define_insn "ssadd<mode>3"
 
28642
   [(set (match_operand:QADDSUB 0 "s_register_operand" "=r")
 
28643
@@ -48,15 +51,17 @@
 
28644
                         (match_operand:QADDSUB 2 "s_register_operand" "r")))]
 
28645
   "TARGET_INT_SIMD"
 
28646
   "qadd<qaddsub_suf>%?\\t%0, %1, %2"
 
28647
-  [(set_attr "predicable" "yes")])
 
28648
+  [(set_attr "predicable" "yes")
 
28649
+   (set_attr "predicable_short_it" "no")])
 
28650
 
 
28651
 (define_insn "sub<mode>3"
 
28652
-  [(set (match_operand:FIXED 0 "s_register_operand" "=r")
 
28653
-       (minus:FIXED (match_operand:FIXED 1 "s_register_operand" "r")
 
28654
-                    (match_operand:FIXED 2 "s_register_operand" "r")))]
 
28655
+  [(set (match_operand:FIXED 0 "s_register_operand" "=l,r")
 
28656
+       (minus:FIXED (match_operand:FIXED 1 "s_register_operand" "l,r")
 
28657
+                    (match_operand:FIXED 2 "s_register_operand" "l,r")))]
 
28658
   "TARGET_32BIT"
 
28659
   "sub%?\\t%0, %1, %2"
 
28660
-  [(set_attr "predicable" "yes")])
 
28661
+  [(set_attr "predicable" "yes")
 
28662
+   (set_attr "predicable_short_it" "yes,no")])
 
28663
 
 
28664
 (define_insn "sub<mode>3"
 
28665
   [(set (match_operand:ADDSUB 0 "s_register_operand" "=r")
 
28666
@@ -64,7 +69,8 @@
 
28667
                      (match_operand:ADDSUB 2 "s_register_operand" "r")))]
 
28668
   "TARGET_INT_SIMD"
 
28669
   "ssub<qaddsub_suf>%?\\t%0, %1, %2"
 
28670
-  [(set_attr "predicable" "yes")])
 
28671
+  [(set_attr "predicable" "yes")
 
28672
+   (set_attr "predicable_short_it" "no")])
 
28673
 
 
28674
 (define_insn "ussub<mode>3"
 
28675
   [(set (match_operand:UQADDSUB 0 "s_register_operand" "=r")
 
28676
@@ -73,7 +79,8 @@
 
28677
          (match_operand:UQADDSUB 2 "s_register_operand" "r")))]
 
28678
   "TARGET_INT_SIMD"
 
28679
   "uqsub<qaddsub_suf>%?\\t%0, %1, %2"
 
28680
-  [(set_attr "predicable" "yes")])
 
28681
+  [(set_attr "predicable" "yes")
 
28682
+   (set_attr "predicable_short_it" "no")])
 
28683
 
 
28684
 (define_insn "sssub<mode>3"
 
28685
   [(set (match_operand:QADDSUB 0 "s_register_operand" "=r")
 
28686
@@ -81,7 +88,8 @@
 
28687
                          (match_operand:QADDSUB 2 "s_register_operand" "r")))]
 
28688
   "TARGET_INT_SIMD"
 
28689
   "qsub<qaddsub_suf>%?\\t%0, %1, %2"
 
28690
-  [(set_attr "predicable" "yes")])
 
28691
+  [(set_attr "predicable" "yes")
 
28692
+   (set_attr "predicable_short_it" "no")])
 
28693
 
 
28694
 ;; Fractional multiplies.
 
28695
 
 
28696
@@ -96,7 +104,7 @@
 
28697
   rtx tmp1 = gen_reg_rtx (HImode);
 
28698
   rtx tmp2 = gen_reg_rtx (HImode);
 
28699
   rtx tmp3 = gen_reg_rtx (SImode);
 
28700
-  
 
28701
+
 
28702
   emit_insn (gen_extendqihi2 (tmp1, gen_lowpart (QImode, operands[1])));
 
28703
   emit_insn (gen_extendqihi2 (tmp2, gen_lowpart (QImode, operands[2])));
 
28704
   emit_insn (gen_mulhisi3 (tmp3, tmp1, tmp2));
 
28705
@@ -132,7 +140,7 @@
 
28706
   rtx tmp1 = gen_reg_rtx (DImode);
 
28707
   rtx tmp2 = gen_reg_rtx (SImode);
 
28708
   rtx tmp3 = gen_reg_rtx (SImode);
 
28709
-  
 
28710
+
 
28711
   /* s.31 * s.31 -> s.62 multiplication.  */
 
28712
   emit_insn (gen_mulsidi3 (tmp1, gen_lowpart (SImode, operands[1]),
 
28713
                           gen_lowpart (SImode, operands[2])));
 
28714
@@ -154,7 +162,7 @@
 
28715
   rtx tmp1 = gen_reg_rtx (DImode);
 
28716
   rtx tmp2 = gen_reg_rtx (SImode);
 
28717
   rtx tmp3 = gen_reg_rtx (SImode);
 
28718
-  
 
28719
+
 
28720
   emit_insn (gen_mulsidi3 (tmp1, gen_lowpart (SImode, operands[1]),
 
28721
                           gen_lowpart (SImode, operands[2])));
 
28722
   emit_insn (gen_lshrsi3 (tmp2, gen_lowpart (SImode, tmp1), GEN_INT (15)));
 
28723
@@ -173,13 +181,13 @@
 
28724
   rtx tmp1 = gen_reg_rtx (DImode);
 
28725
   rtx tmp2 = gen_reg_rtx (SImode);
 
28726
   rtx tmp3 = gen_reg_rtx (SImode);
 
28727
-  
 
28728
+
 
28729
   emit_insn (gen_umulsidi3 (tmp1, gen_lowpart (SImode, operands[1]),
 
28730
                            gen_lowpart (SImode, operands[2])));
 
28731
   emit_insn (gen_lshrsi3 (tmp2, gen_lowpart (SImode, tmp1), GEN_INT (16)));
 
28732
   emit_insn (gen_ashlsi3 (tmp3, gen_highpart (SImode, tmp1), GEN_INT (16)));
 
28733
   emit_insn (gen_iorsi3 (gen_lowpart (SImode, operands[0]), tmp2, tmp3));
 
28734
-  
 
28735
+
 
28736
   DONE;
 
28737
 })
 
28738
 
 
28739
@@ -209,7 +217,7 @@
 
28740
     }
 
28741
 
 
28742
   /* We have:
 
28743
-      31  high word  0     31  low word  0 
 
28744
+      31  high word  0     31  low word  0
 
28745
 
 
28746
     [ S i i .... i i i ] [ i f f f ... f f ]
 
28747
                         |
 
28748
@@ -221,9 +229,18 @@
 
28749
   output_asm_insn ("ssat\\t%R3, #15, %R3", operands);
 
28750
   output_asm_insn ("mrs\\t%4, APSR", operands);
 
28751
   output_asm_insn ("tst\\t%4, #1<<27", operands);
 
28752
-  if (TARGET_THUMB2)
 
28753
-    output_asm_insn ("it\\tne", operands);
 
28754
-  output_asm_insn ("mvnne\\t%Q3, %R3, asr #32", operands);
 
28755
+  if (arm_restrict_it)
 
28756
+    {
 
28757
+      output_asm_insn ("mvn\\t%4, %R3, asr #32", operands);
 
28758
+      output_asm_insn ("it\\tne", operands);
 
28759
+      output_asm_insn ("movne\\t%Q3, %4", operands);
 
28760
+    }
 
28761
+  else
 
28762
+    {
 
28763
+      if (TARGET_THUMB2)
 
28764
+        output_asm_insn ("it\\tne", operands);
 
28765
+      output_asm_insn ("mvnne\\t%Q3, %R3, asr #32", operands);
 
28766
+    }
 
28767
   output_asm_insn ("mov\\t%0, %Q3, lsr #15", operands);
 
28768
   output_asm_insn ("orr\\t%0, %0, %R3, asl #17", operands);
 
28769
   return "";
 
28770
@@ -231,7 +248,9 @@
 
28771
   [(set_attr "conds" "clob")
 
28772
    (set (attr "length")
 
28773
        (if_then_else (eq_attr "is_thumb" "yes")
 
28774
-                     (const_int 38)
 
28775
+                     (if_then_else (match_test "arm_restrict_it")
 
28776
+                                   (const_int 40)
 
28777
+                                   (const_int 38))
 
28778
                      (const_int 32)))])
 
28779
 
 
28780
 ;; Same goes for this.
 
28781
@@ -257,7 +276,7 @@
 
28782
     }
 
28783
 
 
28784
   /* We have:
 
28785
-      31  high word  0     31  low word  0 
 
28786
+      31  high word  0     31  low word  0
 
28787
 
 
28788
     [ i i i .... i i i ] [ f f f f ... f f ]
 
28789
                         |
 
28790
@@ -269,9 +288,18 @@
 
28791
   output_asm_insn ("usat\\t%R3, #16, %R3", operands);
 
28792
   output_asm_insn ("mrs\\t%4, APSR", operands);
 
28793
   output_asm_insn ("tst\\t%4, #1<<27", operands);
 
28794
-  if (TARGET_THUMB2)
 
28795
-    output_asm_insn ("it\\tne", operands);
 
28796
-  output_asm_insn ("sbfxne\\t%Q3, %R3, #15, #1", operands);
 
28797
+  if (arm_restrict_it)
 
28798
+    {
 
28799
+      output_asm_insn ("sbfx\\t%4, %R3, #15, #1", operands);
 
28800
+      output_asm_insn ("it\\tne", operands);
 
28801
+      output_asm_insn ("movne\\t%Q3, %4", operands);
 
28802
+    }
 
28803
+  else
 
28804
+    {
 
28805
+      if (TARGET_THUMB2)
 
28806
+        output_asm_insn ("it\\tne", operands);
 
28807
+      output_asm_insn ("sbfxne\\t%Q3, %R3, #15, #1", operands);
 
28808
+    }
 
28809
   output_asm_insn ("lsr\\t%0, %Q3, #16", operands);
 
28810
   output_asm_insn ("orr\\t%0, %0, %R3, asl #16", operands);
 
28811
   return "";
 
28812
@@ -279,7 +307,9 @@
 
28813
   [(set_attr "conds" "clob")
 
28814
    (set (attr "length")
 
28815
        (if_then_else (eq_attr "is_thumb" "yes")
 
28816
-                     (const_int 38)
 
28817
+                     (if_then_else (match_test "arm_restrict_it")
 
28818
+                                   (const_int 40)
 
28819
+                                   (const_int 38))
 
28820
                      (const_int 32)))])
 
28821
 
 
28822
 (define_expand "mulha3"
 
28823
@@ -289,7 +319,7 @@
 
28824
   "TARGET_DSP_MULTIPLY && arm_arch_thumb2"
 
28825
 {
 
28826
   rtx tmp = gen_reg_rtx (SImode);
 
28827
-  
 
28828
+
 
28829
   emit_insn (gen_mulhisi3 (tmp, gen_lowpart (HImode, operands[1]),
 
28830
                           gen_lowpart (HImode, operands[2])));
 
28831
   emit_insn (gen_extv (gen_lowpart (SImode, operands[0]), tmp, GEN_INT (16),
 
28832
@@ -307,7 +337,7 @@
 
28833
   rtx tmp1 = gen_reg_rtx (SImode);
 
28834
   rtx tmp2 = gen_reg_rtx (SImode);
 
28835
   rtx tmp3 = gen_reg_rtx (SImode);
 
28836
-  
 
28837
+
 
28838
   /* 8.8 * 8.8 -> 16.16 multiply.  */
 
28839
   emit_insn (gen_zero_extendhisi2 (tmp1, gen_lowpart (HImode, operands[1])));
 
28840
   emit_insn (gen_zero_extendhisi2 (tmp2, gen_lowpart (HImode, operands[2])));
 
28841
@@ -326,7 +356,7 @@
 
28842
 {
 
28843
   rtx tmp = gen_reg_rtx (SImode);
 
28844
   rtx rshift;
 
28845
-  
 
28846
+
 
28847
   emit_insn (gen_mulhisi3 (tmp, gen_lowpart (HImode, operands[1]),
 
28848
                           gen_lowpart (HImode, operands[2])));
 
28849
 
 
28850
@@ -348,12 +378,12 @@
 
28851
   rtx tmp2 = gen_reg_rtx (SImode);
 
28852
   rtx tmp3 = gen_reg_rtx (SImode);
 
28853
   rtx rshift_tmp = gen_reg_rtx (SImode);
 
28854
-  
 
28855
+
 
28856
   /* Note: there's no smul[bt][bt] equivalent for unsigned multiplies.  Use a
 
28857
      normal 32x32->32-bit multiply instead.  */
 
28858
   emit_insn (gen_zero_extendhisi2 (tmp1, gen_lowpart (HImode, operands[1])));
 
28859
   emit_insn (gen_zero_extendhisi2 (tmp2, gen_lowpart (HImode, operands[2])));
 
28860
-  
 
28861
+
 
28862
   emit_insn (gen_mulsi3 (tmp3, tmp1, tmp2));
 
28863
 
 
28864
   /* The operand to "usat" is signed, so we cannot use the "..., asr #8"
 
28865
@@ -374,9 +404,9 @@
 
28866
   "TARGET_32BIT && arm_arch6"
 
28867
   "ssat%?\\t%0, #16, %2%S1"
 
28868
   [(set_attr "predicable" "yes")
 
28869
-   (set_attr "insn" "sat")
 
28870
+   (set_attr "predicable_short_it" "no")
 
28871
    (set_attr "shift" "1")
 
28872
-   (set_attr "type" "alu_shift")])
 
28873
+   (set_attr "type" "arlo_shift")])
 
28874
 
 
28875
 (define_insn "arm_usatsihi"
 
28876
   [(set (match_operand:HI 0 "s_register_operand" "=r")
 
28877
@@ -384,4 +414,5 @@
 
28878
   "TARGET_INT_SIMD"
 
28879
   "usat%?\\t%0, #16, %1"
 
28880
   [(set_attr "predicable" "yes")
 
28881
-   (set_attr "insn" "sat")])
 
28882
+   (set_attr "predicable_short_it" "no")]
 
28883
+)
 
28884
--- a/src/gcc/config/arm/unspecs.md
 
28885
+++ b/src/gcc/config/arm/unspecs.md
 
28886
@@ -139,6 +139,10 @@
 
28887
   VUNSPEC_ATOMIC_OP    ; Represent an atomic operation.
 
28888
   VUNSPEC_LL           ; Represent a load-register-exclusive.
 
28889
   VUNSPEC_SC           ; Represent a store-register-exclusive.
 
28890
+  VUNSPEC_LAX          ; Represent a load-register-acquire-exclusive.
 
28891
+  VUNSPEC_SLX          ; Represent a store-register-release-exclusive.
 
28892
+  VUNSPEC_LDA          ; Represent a store-register-acquire.
 
28893
+  VUNSPEC_STL          ; Represent a store-register-release.
 
28894
 ])
 
28895
 
 
28896
 ;; Enumerators for NEON unspecs.
 
28897
--- a/src/gcc/config/arm/cortex-m4.md
 
28898
+++ b/src/gcc/config/arm/cortex-m4.md
 
28899
@@ -31,7 +31,12 @@
 
28900
 ;; ALU and multiply is one cycle.
 
28901
 (define_insn_reservation "cortex_m4_alu" 1
 
28902
   (and (eq_attr "tune" "cortexm4")
 
28903
-       (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg,mult"))
 
28904
+       (ior (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,extend,\
 
28905
+                             arlo_shift,arlo_shift_reg,\
 
28906
+                             mov_imm,mov_reg,mov_shift,mov_shift_reg,\
 
28907
+                             mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg")
 
28908
+           (ior (eq_attr "mul32" "yes")
 
28909
+                (eq_attr "mul64" "yes"))))
 
28910
   "cortex_m4_ex")
 
28911
 
 
28912
 ;; Byte, half-word and word load is two cycles.
 
28913
--- a/src/gcc/config/arm/linux-eabi.h
 
28914
+++ b/src/gcc/config/arm/linux-eabi.h
 
28915
@@ -84,10 +84,14 @@
 
28916
   LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC,                         \
 
28917
                       LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
 
28918
 
 
28919
+#undef  ASAN_CC1_SPEC
 
28920
+#define ASAN_CC1_SPEC "%{fsanitize=*:-funwind-tables}"
 
28921
+
 
28922
 #undef  CC1_SPEC
 
28923
 #define CC1_SPEC                                                       \
 
28924
-  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC,                       \
 
28925
-                      GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
 
28926
+  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,     \
 
28927
+                      GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "   \
 
28928
+                      ANDROID_CC1_SPEC)
 
28929
 
 
28930
 #define CC1PLUS_SPEC \
 
28931
   LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
 
28932
@@ -95,7 +99,7 @@
 
28933
 #undef  LIB_SPEC
 
28934
 #define LIB_SPEC                                                       \
 
28935
   LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC,                       \
 
28936
-                      GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
 
28937
+                   GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
 
28938
 
 
28939
 #undef STARTFILE_SPEC
 
28940
 #define STARTFILE_SPEC \
 
28941
--- a/src/gcc/config/arm/arm-cores.def
 
28942
+++ b/src/gcc/config/arm/arm-cores.def
 
28943
@@ -129,9 +129,11 @@
 
28944
 ARM_CORE("cortex-a8",    cortexa8,     7A,                              FL_LDSCHED, cortex)
 
28945
 ARM_CORE("cortex-a9",    cortexa9,     7A,                              FL_LDSCHED, cortex_a9)
 
28946
 ARM_CORE("cortex-a15",   cortexa15,    7A,                              FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a15)
 
28947
+ARM_CORE("cortex-a53",   cortexa53,    8A,                              FL_LDSCHED, cortex_a5)
 
28948
 ARM_CORE("cortex-r4",    cortexr4,     7R,                              FL_LDSCHED, cortex)
 
28949
 ARM_CORE("cortex-r4f",   cortexr4f,    7R,                              FL_LDSCHED, cortex)
 
28950
 ARM_CORE("cortex-r5",    cortexr5,     7R,                              FL_LDSCHED | FL_ARM_DIV, cortex)
 
28951
+ARM_CORE("cortex-r7",    cortexr7,     7R,                              FL_LDSCHED | FL_ARM_DIV, cortex)
 
28952
 ARM_CORE("cortex-m4",    cortexm4,     7EM,                             FL_LDSCHED, cortex)
 
28953
 ARM_CORE("cortex-m3",    cortexm3,     7M,                              FL_LDSCHED, cortex)
 
28954
 ARM_CORE("cortex-m1",    cortexm1,     6M,                              FL_LDSCHED, v6m)
 
28955
--- a/src/gcc/config/arm/cortex-r4.md
 
28956
+++ b/src/gcc/config/arm/cortex-r4.md
 
28957
@@ -78,24 +78,22 @@
 
28958
 ;; for the purposes of the dual-issue constraints above.
 
28959
 (define_insn_reservation "cortex_r4_alu" 2
 
28960
   (and (eq_attr "tune_cortexr4" "yes")
 
28961
-       (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
28962
-            (not (eq_attr "insn" "mov"))))
 
28963
+       (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,mvn_imm,mvn_reg"))
 
28964
   "cortex_r4_alu")
 
28965
 
 
28966
 (define_insn_reservation "cortex_r4_mov" 2
 
28967
   (and (eq_attr "tune_cortexr4" "yes")
 
28968
-       (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
28969
-            (eq_attr "insn" "mov")))
 
28970
+       (eq_attr "type" "mov_imm,mov_reg"))
 
28971
   "cortex_r4_mov")
 
28972
 
 
28973
 (define_insn_reservation "cortex_r4_alu_shift" 2
 
28974
   (and (eq_attr "tune_cortexr4" "yes")
 
28975
-       (eq_attr "type" "simple_alu_shift,alu_shift"))
 
28976
+       (eq_attr "type" "extend,arlo_shift,mov_shift,mvn_shift"))
 
28977
   "cortex_r4_alu")
 
28978
 
 
28979
 (define_insn_reservation "cortex_r4_alu_shift_reg" 2
 
28980
   (and (eq_attr "tune_cortexr4" "yes")
 
28981
-       (eq_attr "type" "alu_shift_reg"))
 
28982
+       (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg"))
 
28983
   "cortex_r4_alu_shift_reg")
 
28984
 
 
28985
 ;; An ALU instruction followed by an ALU instruction with no early dep.
 
28986
@@ -128,32 +126,32 @@
 
28987
 
 
28988
 (define_insn_reservation "cortex_r4_mul_4" 4
 
28989
   (and (eq_attr "tune_cortexr4" "yes")
 
28990
-       (eq_attr "insn" "mul,smmul"))
 
28991
+       (eq_attr "type" "mul,smmul"))
 
28992
   "cortex_r4_mul_2")
 
28993
 
 
28994
 (define_insn_reservation "cortex_r4_mul_3" 3
 
28995
   (and (eq_attr "tune_cortexr4" "yes")
 
28996
-       (eq_attr "insn" "smulxy,smulwy,smuad,smusd"))
 
28997
+       (eq_attr "type" "smulxy,smulwy,smuad,smusd"))
 
28998
   "cortex_r4_mul")
 
28999
 
 
29000
 (define_insn_reservation "cortex_r4_mla_4" 4
 
29001
   (and (eq_attr "tune_cortexr4" "yes")
 
29002
-       (eq_attr "insn" "mla,smmla"))
 
29003
+       (eq_attr "type" "mla,smmla"))
 
29004
   "cortex_r4_mul_2")
 
29005
 
 
29006
 (define_insn_reservation "cortex_r4_mla_3" 3
 
29007
   (and (eq_attr "tune_cortexr4" "yes")
 
29008
-       (eq_attr "insn" "smlaxy,smlawy,smlad,smlsd"))
 
29009
+       (eq_attr "type" "smlaxy,smlawy,smlad,smlsd"))
 
29010
   "cortex_r4_mul")
 
29011
 
 
29012
 (define_insn_reservation "cortex_r4_smlald" 3
 
29013
   (and (eq_attr "tune_cortexr4" "yes")
 
29014
-       (eq_attr "insn" "smlald,smlsld"))
 
29015
+       (eq_attr "type" "smlald,smlsld"))
 
29016
   "cortex_r4_mul")
 
29017
 
 
29018
 (define_insn_reservation "cortex_r4_mull" 4
 
29019
   (and (eq_attr "tune_cortexr4" "yes")
 
29020
-       (eq_attr "insn" "smull,umull,umlal,umaal"))
 
29021
+       (eq_attr "type" "smull,umull,umlal,umaal"))
 
29022
   "cortex_r4_mul_2")
 
29023
 
 
29024
 ;; A multiply or an MLA with a single-register result, followed by an
 
29025
@@ -196,12 +194,12 @@
 
29026
 ;; This gives a latency of nine for udiv and ten for sdiv.
 
29027
 (define_insn_reservation "cortex_r4_udiv" 9
 
29028
   (and (eq_attr "tune_cortexr4" "yes")
 
29029
-       (eq_attr "insn" "udiv"))
 
29030
+       (eq_attr "type" "udiv"))
 
29031
   "cortex_r4_div_9")
 
29032
 
 
29033
 (define_insn_reservation "cortex_r4_sdiv" 10
 
29034
   (and (eq_attr "tune_cortexr4" "yes")
 
29035
-       (eq_attr "insn" "sdiv"))
 
29036
+       (eq_attr "type" "sdiv"))
 
29037
   "cortex_r4_div_10")
 
29038
 
 
29039
 ;; Branches.  We assume correct prediction.
 
29040
--- a/src/gcc/config/arm/arm-tune.md
 
29041
+++ b/src/gcc/config/arm/arm-tune.md
 
29042
@@ -1,5 +1,5 @@
 
29043
 ;; -*- buffer-read-only: t -*-
 
29044
 ;; Generated automatically by gentune.sh from arm-cores.def
 
29045
 (define_attr "tune"
 
29046
-       "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,fa526,fa626,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,arm1156t2fs,genericv7a,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexr4,cortexr4f,cortexr5,cortexm4,cortexm3,cortexm1,cortexm0,cortexm0plus,marvell_pj4"
 
29047
+       "arm2,arm250,arm3,arm6,arm60,arm600,arm610,arm620,arm7,arm7d,arm7di,arm70,arm700,arm700i,arm710,arm720,arm710c,arm7100,arm7500,arm7500fe,arm7m,arm7dm,arm7dmi,arm8,arm810,strongarm,strongarm110,strongarm1100,strongarm1110,fa526,fa626,arm7tdmi,arm7tdmis,arm710t,arm720t,arm740t,arm9,arm9tdmi,arm920,arm920t,arm922t,arm940t,ep9312,arm10tdmi,arm1020t,arm9e,arm946es,arm966es,arm968es,arm10e,arm1020e,arm1022e,xscale,iwmmxt,iwmmxt2,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1026ejs,arm1136js,arm1136jfs,arm1176jzs,arm1176jzfs,mpcorenovfp,mpcore,arm1156t2s,arm1156t2fs,genericv7a,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexa53,cortexr4,cortexr4f,cortexr5,cortexr7,cortexm4,cortexm3,cortexm1,cortexm0,cortexm0plus,marvell_pj4"
 
29048
        (const (symbol_ref "((enum attr_tune) arm_tune)")))
 
29049
--- a/src/gcc/config/arm/arm-protos.h
 
29050
+++ b/src/gcc/config/arm/arm-protos.h
 
29051
@@ -24,12 +24,13 @@
 
29052
 
 
29053
 extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
 
29054
 extern int use_return_insn (int, rtx);
 
29055
+extern bool use_simple_return_p (void);
 
29056
 extern enum reg_class arm_regno_class (int);
 
29057
 extern void arm_load_pic_register (unsigned long);
 
29058
 extern int arm_volatile_func (void);
 
29059
 extern void arm_expand_prologue (void);
 
29060
 extern void arm_expand_epilogue (bool);
 
29061
-extern void thumb2_expand_return (void);
 
29062
+extern void thumb2_expand_return (bool);
 
29063
 extern const char *arm_strip_name_encoding (const char *);
 
29064
 extern void arm_asm_output_labelref (FILE *, const char *);
 
29065
 extern void thumb2_asm_output_opcode (FILE *);
 
29066
@@ -78,6 +79,7 @@
 
29067
 extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
 
29068
                                  rtx (*) (rtx, rtx, rtx));
 
29069
 extern rtx neon_make_constant (rtx);
 
29070
+extern tree arm_builtin_vectorized_function (tree, tree, tree);
 
29071
 extern void neon_expand_vector_init (rtx, rtx);
 
29072
 extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
 
29073
 extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
 
29074
@@ -117,7 +119,9 @@
 
29075
 extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
 
29076
 extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT);
 
29077
 extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool);
 
29078
+extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool);
 
29079
 extern int arm_gen_movmemqi (rtx *);
 
29080
+extern bool gen_movmem_ldrd_strd (rtx *);
 
29081
 extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
 
29082
 extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
 
29083
                                                       HOST_WIDE_INT);
 
29084
@@ -224,6 +228,8 @@
 
29085
 
 
29086
 extern void arm_order_regs_for_local_alloc (void);
 
29087
 
 
29088
+extern int arm_max_conditional_execute ();
 
29089
+
 
29090
 /* Vectorizer cost model implementation.  */
 
29091
 struct cpu_vec_costs {
 
29092
   const int scalar_stmt_cost;   /* Cost of any scalar operation, excluding
 
29093
@@ -253,8 +259,7 @@
 
29094
   bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
 
29095
   bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
 
29096
   int constant_limit;
 
29097
-  /* Maximum number of instructions to conditionalise in
 
29098
-     arm_final_prescan_insn.  */
 
29099
+  /* Maximum number of instructions to conditionalise.  */
 
29100
   int max_insns_skipped;
 
29101
   int num_prefetch_slots;
 
29102
   int l1_cache_size;
 
29103
@@ -269,6 +274,8 @@
 
29104
   bool logical_op_non_short_circuit[2];
 
29105
   /* Vectorizer costs.  */
 
29106
   const struct cpu_vec_costs* vec_costs;
 
29107
+  /* Prefer Neon for 64-bit bitops.  */
 
29108
+  bool prefer_neon_for_64bits;
 
29109
 };
 
29110
 
 
29111
 extern const struct tune_params *current_tune;
 
29112
--- a/src/gcc/config/arm/vfp.md
 
29113
+++ b/src/gcc/config/arm/vfp.md
 
29114
@@ -18,31 +18,6 @@
 
29115
 ;; along with GCC; see the file COPYING3.  If not see
 
29116
 ;; <http://www.gnu.org/licenses/>.  */
 
29117
 
 
29118
-;; The VFP "type" attributes differ from those used in the FPA model.
 
29119
-;; fcpys       Single precision cpy.
 
29120
-;; ffariths    Single precision abs, neg.
 
29121
-;; ffarithd    Double precision abs, neg, cpy.
 
29122
-;; fadds       Single precision add/sub.
 
29123
-;; faddd       Double precision add/sub.
 
29124
-;; fconsts     Single precision load immediate.
 
29125
-;; fconstd     Double precision load immediate.
 
29126
-;; fcmps       Single precision comparison.
 
29127
-;; fcmpd       Double precision comparison.
 
29128
-;; fmuls       Single precision multiply.
 
29129
-;; fmuld       Double precision multiply.
 
29130
-;; fmacs       Single precision multiply-accumulate.
 
29131
-;; fmacd       Double precision multiply-accumulate.
 
29132
-;; ffmas       Single precision fused multiply-accumulate.
 
29133
-;; ffmad       Double precision fused multiply-accumulate.
 
29134
-;; fdivs       Single precision sqrt or division.
 
29135
-;; fdivd       Double precision sqrt or division.
 
29136
-;; f_flag      fmstat operation
 
29137
-;; f_load[sd]  Floating point load from memory.
 
29138
-;; f_store[sd] Floating point store to memory.
 
29139
-;; f_2_r       Transfer vfp to arm reg.
 
29140
-;; r_2_f       Transfer arm to vfp reg.
 
29141
-;; f_cvt       Convert floating<->integral
 
29142
-
 
29143
 ;; SImode moves
 
29144
 ;; ??? For now do not allow loading constants into vfp regs.  This causes
 
29145
 ;; problems because small constants get converted into adds.
 
29146
@@ -78,62 +53,67 @@
 
29147
     }
 
29148
   "
 
29149
   [(set_attr "predicable" "yes")
 
29150
-   (set_attr "type" "*,*,simple_alu_imm,simple_alu_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
29151
+   (set_attr "type" "mov_reg,mov_reg,mvn_imm,mov_imm,load1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
29152
    (set_attr "neon_type" "*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*")
 
29153
-   (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*")
 
29154
    (set_attr "pool_range"     "*,*,*,*,4096,*,*,*,*,1020,*")
 
29155
    (set_attr "neg_pool_range" "*,*,*,*,4084,*,*,*,*,1008,*")]
 
29156
 )
 
29157
 
 
29158
 ;; See thumb2.md:thumb2_movsi_insn for an explanation of the split
 
29159
 ;; high/low register alternatives for loads and stores here.
 
29160
+;; The l/Py alternative should come after r/I to ensure that the short variant
 
29161
+;; is chosen with length 2 when the instruction is predicated for
 
29162
+;; arm_restrict_it.
 
29163
 (define_insn "*thumb2_movsi_vfp"
 
29164
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r, l,*hk,m, *m,*t, r,*t,*t,  *Uv")
 
29165
-       (match_operand:SI 1 "general_operand"      "rk, I,K,j,mi,*mi,l,*hk, r,*t,*t,*Uvi,*t"))]
 
29166
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,l,r,r, l,*hk,m, *m,*t, r,*t,*t,  *Uv")
 
29167
+       (match_operand:SI 1 "general_operand"      "rk,I,Py,K,j,mi,*mi,l,*hk, r,*t,*t,*Uvi,*t"))]
 
29168
   "TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT
 
29169
    && (   s_register_operand (operands[0], SImode)
 
29170
        || s_register_operand (operands[1], SImode))"
 
29171
   "*
 
29172
   switch (which_alternative)
 
29173
     {
 
29174
-    case 0: case 1:
 
29175
+    case 0:
 
29176
+    case 1:
 
29177
+    case 2:
 
29178
       return \"mov%?\\t%0, %1\";
 
29179
-    case 2:
 
29180
+    case 3:
 
29181
       return \"mvn%?\\t%0, #%B1\";
 
29182
-    case 3:
 
29183
+    case 4:
 
29184
       return \"movw%?\\t%0, %1\";
 
29185
-    case 4:
 
29186
     case 5:
 
29187
+    case 6:
 
29188
       return \"ldr%?\\t%0, %1\";
 
29189
-    case 6:
 
29190
     case 7:
 
29191
+    case 8:
 
29192
       return \"str%?\\t%1, %0\";
 
29193
-    case 8:
 
29194
+    case 9:
 
29195
       return \"fmsr%?\\t%0, %1\\t%@ int\";
 
29196
-    case 9:
 
29197
+    case 10:
 
29198
       return \"fmrs%?\\t%0, %1\\t%@ int\";
 
29199
-    case 10:
 
29200
+    case 11:
 
29201
       return \"fcpys%?\\t%0, %1\\t%@ int\";
 
29202
-    case 11: case 12:
 
29203
+    case 12: case 13:
 
29204
       return output_move_vfp (operands);
 
29205
     default:
 
29206
       gcc_unreachable ();
 
29207
     }
 
29208
   "
 
29209
   [(set_attr "predicable" "yes")
 
29210
-   (set_attr "type" "*,*,*,*,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
29211
-   (set_attr "neon_type" "*,*,*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*")
 
29212
-   (set_attr "insn" "mov,mov,mvn,mov,*,*,*,*,*,*,*,*,*")
 
29213
-   (set_attr "pool_range"     "*,*,*,*,1018,4094,*,*,*,*,*,1018,*")
 
29214
-   (set_attr "neg_pool_range" "*,*,*,*,   0,   0,*,*,*,*,*,1008,*")]
 
29215
+   (set_attr "predicable_short_it" "yes,no,yes,no,no,no,no,no,no,no,no,no,no,no")
 
29216
+   (set_attr "type" "mov_reg,mov_reg,mov_reg,mvn_reg,mov_reg,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
29217
+   (set_attr "length" "2,4,2,4,4,4,4,4,4,4,4,4,4,4")
 
29218
+   (set_attr "neon_type" "*,*,*,*,*,*,*,*,*,neon_mcr,neon_mrc,neon_vmov,*,*")
 
29219
+   (set_attr "pool_range"     "*,*,*,*,*,1018,4094,*,*,*,*,*,1018,*")
 
29220
+   (set_attr "neg_pool_range" "*,*,*,*,*,   0,   0,*,*,*,*,*,1008,*")]
 
29221
 )
 
29222
 
 
29223
 
 
29224
 ;; DImode moves
 
29225
 
 
29226
 (define_insn "*movdi_vfp"
 
29227
-  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,r,r,m,w,r,w,w, Uv")
 
29228
-       (match_operand:DI 1 "di_operand"              "r,rDa,Db,Dc,mi,mi,r,r,w,w,Uvi,w"))]
 
29229
+  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,r,w,w, Uv")
 
29230
+       (match_operand:DI 1 "di_operand"              "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))]
 
29231
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune != cortexa8
 
29232
    && (   register_operand (operands[0], DImode)
 
29233
        || register_operand (operands[1], DImode))
 
29234
@@ -375,9 +355,8 @@
 
29235
   "
 
29236
   [(set_attr "predicable" "yes")
 
29237
    (set_attr "type"
 
29238
-     "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*")
 
29239
+     "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,mov_reg")
 
29240
    (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*")
 
29241
-   (set_attr "insn" "*,*,*,*,*,*,*,*,mov")
 
29242
    (set_attr "pool_range" "*,*,*,1020,*,4096,*,*,*")
 
29243
    (set_attr "neg_pool_range" "*,*,*,1008,*,4080,*,*,*")]
 
29244
 )
 
29245
@@ -412,15 +391,14 @@
 
29246
     }
 
29247
   "
 
29248
   [(set_attr "predicable" "yes")
 
29249
+   (set_attr "predicable_short_it" "no")
 
29250
    (set_attr "type"
 
29251
-     "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,*")
 
29252
+     "r_2_f,f_2_r,fconsts,f_loads,f_stores,load1,store1,fcpys,mov_reg")
 
29253
    (set_attr "neon_type" "neon_mcr,neon_mrc,*,*,*,*,*,neon_vmov,*")
 
29254
-   (set_attr "insn" "*,*,*,*,*,*,*,*,mov")
 
29255
    (set_attr "pool_range" "*,*,*,1018,*,4090,*,*,*")
 
29256
    (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")]
 
29257
 )
 
29258
 
 
29259
-
 
29260
 ;; DFmode moves
 
29261
 
 
29262
 (define_insn "*movdf_vfp"
 
29263
@@ -550,7 +528,7 @@
 
29264
            [(match_operand 4 "cc_register" "") (const_int 0)])
 
29265
          (match_operand:SF 1 "s_register_operand" "0,t,t,0,?r,?r,0,t,t")
 
29266
          (match_operand:SF 2 "s_register_operand" "t,0,t,?r,0,?r,t,0,t")))]
 
29267
-  "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP"
 
29268
+  "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP && !arm_restrict_it"
 
29269
   "@
 
29270
    it\\t%D3\;fcpys%D3\\t%0, %2
 
29271
    it\\t%d3\;fcpys%d3\\t%0, %1
 
29272
@@ -598,7 +576,7 @@
 
29273
            [(match_operand 4 "cc_register" "") (const_int 0)])
 
29274
          (match_operand:DF 1 "s_register_operand" "0,w,w,0,?r,?r,0,w,w")
 
29275
          (match_operand:DF 2 "s_register_operand" "w,0,w,?r,0,?r,w,0,w")))]
 
29276
-  "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29277
+  "TARGET_THUMB2 && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE && !arm_restrict_it"
 
29278
   "@
 
29279
    it\\t%D3\;fcpyd%D3\\t%P0, %P2
 
29280
    it\\t%d3\;fcpyd%d3\\t%P0, %P1
 
29281
@@ -624,6 +602,7 @@
 
29282
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29283
   "fabss%?\\t%0, %1"
 
29284
   [(set_attr "predicable" "yes")
 
29285
+   (set_attr "predicable_short_it" "no")
 
29286
    (set_attr "type" "ffariths")]
 
29287
 )
 
29288
 
 
29289
@@ -633,6 +612,7 @@
 
29290
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29291
   "fabsd%?\\t%P0, %P1"
 
29292
   [(set_attr "predicable" "yes")
 
29293
+   (set_attr "predicable_short_it" "no")
 
29294
    (set_attr "type" "ffarithd")]
 
29295
 )
 
29296
 
 
29297
@@ -644,6 +624,7 @@
 
29298
    fnegs%?\\t%0, %1
 
29299
    eor%?\\t%0, %1, #-2147483648"
 
29300
   [(set_attr "predicable" "yes")
 
29301
+   (set_attr "predicable_short_it" "no")
 
29302
    (set_attr "type" "ffariths")]
 
29303
 )
 
29304
 
 
29305
@@ -689,6 +670,7 @@
 
29306
     }
 
29307
   "
 
29308
   [(set_attr "predicable" "yes")
 
29309
+   (set_attr "predicable_short_it" "no")
 
29310
    (set_attr "length" "4,4,8")
 
29311
    (set_attr "type" "ffarithd")]
 
29312
 )
 
29313
@@ -703,6 +685,7 @@
 
29314
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29315
   "fadds%?\\t%0, %1, %2"
 
29316
   [(set_attr "predicable" "yes")
 
29317
+   (set_attr "predicable_short_it" "no")
 
29318
    (set_attr "type" "fadds")]
 
29319
 )
 
29320
 
 
29321
@@ -713,6 +696,7 @@
 
29322
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29323
   "faddd%?\\t%P0, %P1, %P2"
 
29324
   [(set_attr "predicable" "yes")
 
29325
+   (set_attr "predicable_short_it" "no")
 
29326
    (set_attr "type" "faddd")]
 
29327
 )
 
29328
 
 
29329
@@ -724,6 +708,7 @@
 
29330
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29331
   "fsubs%?\\t%0, %1, %2"
 
29332
   [(set_attr "predicable" "yes")
 
29333
+   (set_attr "predicable_short_it" "no")
 
29334
    (set_attr "type" "fadds")]
 
29335
 )
 
29336
 
 
29337
@@ -734,6 +719,7 @@
 
29338
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29339
   "fsubd%?\\t%P0, %P1, %P2"
 
29340
   [(set_attr "predicable" "yes")
 
29341
+   (set_attr "predicable_short_it" "no")
 
29342
    (set_attr "type" "faddd")]
 
29343
 )
 
29344
 
 
29345
@@ -747,6 +733,7 @@
 
29346
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29347
   "fdivs%?\\t%0, %1, %2"
 
29348
   [(set_attr "predicable" "yes")
 
29349
+   (set_attr "predicable_short_it" "no")
 
29350
    (set_attr "type" "fdivs")]
 
29351
 )
 
29352
 
 
29353
@@ -757,6 +744,7 @@
 
29354
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29355
   "fdivd%?\\t%P0, %P1, %P2"
 
29356
   [(set_attr "predicable" "yes")
 
29357
+   (set_attr "predicable_short_it" "no")
 
29358
    (set_attr "type" "fdivd")]
 
29359
 )
 
29360
 
 
29361
@@ -770,6 +758,7 @@
 
29362
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29363
   "fmuls%?\\t%0, %1, %2"
 
29364
   [(set_attr "predicable" "yes")
 
29365
+   (set_attr "predicable_short_it" "no")
 
29366
    (set_attr "type" "fmuls")]
 
29367
 )
 
29368
 
 
29369
@@ -780,6 +769,7 @@
 
29370
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29371
   "fmuld%?\\t%P0, %P1, %P2"
 
29372
   [(set_attr "predicable" "yes")
 
29373
+   (set_attr "predicable_short_it" "no")
 
29374
    (set_attr "type" "fmuld")]
 
29375
 )
 
29376
 
 
29377
@@ -790,6 +780,7 @@
 
29378
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29379
   "fnmuls%?\\t%0, %1, %2"
 
29380
   [(set_attr "predicable" "yes")
 
29381
+   (set_attr "predicable_short_it" "no")
 
29382
    (set_attr "type" "fmuls")]
 
29383
 )
 
29384
 
 
29385
@@ -800,6 +791,7 @@
 
29386
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29387
   "fnmuld%?\\t%P0, %P1, %P2"
 
29388
   [(set_attr "predicable" "yes")
 
29389
+   (set_attr "predicable_short_it" "no")
 
29390
    (set_attr "type" "fmuld")]
 
29391
 )
 
29392
 
 
29393
@@ -815,6 +807,7 @@
 
29394
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29395
   "fmacs%?\\t%0, %2, %3"
 
29396
   [(set_attr "predicable" "yes")
 
29397
+   (set_attr "predicable_short_it" "no")
 
29398
    (set_attr "type" "fmacs")]
 
29399
 )
 
29400
 
 
29401
@@ -826,6 +819,7 @@
 
29402
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29403
   "fmacd%?\\t%P0, %P2, %P3"
 
29404
   [(set_attr "predicable" "yes")
 
29405
+   (set_attr "predicable_short_it" "no")
 
29406
    (set_attr "type" "fmacd")]
 
29407
 )
 
29408
 
 
29409
@@ -838,6 +832,7 @@
 
29410
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29411
   "fmscs%?\\t%0, %2, %3"
 
29412
   [(set_attr "predicable" "yes")
 
29413
+   (set_attr "predicable_short_it" "no")
 
29414
    (set_attr "type" "fmacs")]
 
29415
 )
 
29416
 
 
29417
@@ -849,6 +844,7 @@
 
29418
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29419
   "fmscd%?\\t%P0, %P2, %P3"
 
29420
   [(set_attr "predicable" "yes")
 
29421
+   (set_attr "predicable_short_it" "no")
 
29422
    (set_attr "type" "fmacd")]
 
29423
 )
 
29424
 
 
29425
@@ -861,6 +857,7 @@
 
29426
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29427
   "fnmacs%?\\t%0, %2, %3"
 
29428
   [(set_attr "predicable" "yes")
 
29429
+   (set_attr "predicable_short_it" "no")
 
29430
    (set_attr "type" "fmacs")]
 
29431
 )
 
29432
 
 
29433
@@ -872,6 +869,7 @@
 
29434
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29435
   "fnmacd%?\\t%P0, %P2, %P3"
 
29436
   [(set_attr "predicable" "yes")
 
29437
+   (set_attr "predicable_short_it" "no")
 
29438
    (set_attr "type" "fmacd")]
 
29439
 )
 
29440
 
 
29441
@@ -886,6 +884,7 @@
 
29442
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29443
   "fnmscs%?\\t%0, %2, %3"
 
29444
   [(set_attr "predicable" "yes")
 
29445
+   (set_attr "predicable_short_it" "no")
 
29446
    (set_attr "type" "fmacs")]
 
29447
 )
 
29448
 
 
29449
@@ -898,6 +897,7 @@
 
29450
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29451
   "fnmscd%?\\t%P0, %P2, %P3"
 
29452
   [(set_attr "predicable" "yes")
 
29453
+   (set_attr "predicable_short_it" "no")
 
29454
    (set_attr "type" "fmacd")]
 
29455
 )
 
29456
 
 
29457
@@ -911,6 +911,7 @@
 
29458
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
 
29459
   "vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
 
29460
   [(set_attr "predicable" "yes")
 
29461
+   (set_attr "predicable_short_it" "no")
 
29462
    (set_attr "type" "ffma<vfp_type>")]
 
29463
 )
 
29464
 
 
29465
@@ -923,6 +924,7 @@
 
29466
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
 
29467
   "vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
 
29468
   [(set_attr "predicable" "yes")
 
29469
+   (set_attr "predicable_short_it" "no")
 
29470
    (set_attr "type" "ffma<vfp_type>")]
 
29471
 )
 
29472
 
 
29473
@@ -934,6 +936,7 @@
 
29474
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
 
29475
   "vfnms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
 
29476
   [(set_attr "predicable" "yes")
 
29477
+   (set_attr "predicable_short_it" "no")
 
29478
    (set_attr "type" "ffma<vfp_type>")]
 
29479
 )
 
29480
 
 
29481
@@ -946,6 +949,7 @@
 
29482
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
 
29483
   "vfnma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
 
29484
   [(set_attr "predicable" "yes")
 
29485
+   (set_attr "predicable_short_it" "no")
 
29486
    (set_attr "type" "ffma<vfp_type>")]
 
29487
 )
 
29488
 
 
29489
@@ -958,6 +962,7 @@
 
29490
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29491
   "fcvtds%?\\t%P0, %1"
 
29492
   [(set_attr "predicable" "yes")
 
29493
+   (set_attr "predicable_short_it" "no")
 
29494
    (set_attr "type" "f_cvt")]
 
29495
 )
 
29496
 
 
29497
@@ -967,6 +972,7 @@
 
29498
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29499
   "fcvtsd%?\\t%0, %P1"
 
29500
   [(set_attr "predicable" "yes")
 
29501
+   (set_attr "predicable_short_it" "no")
 
29502
    (set_attr "type" "f_cvt")]
 
29503
 )
 
29504
 
 
29505
@@ -976,6 +982,7 @@
 
29506
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16"
 
29507
   "vcvtb%?.f32.f16\\t%0, %1"
 
29508
   [(set_attr "predicable" "yes")
 
29509
+   (set_attr "predicable_short_it" "no")
 
29510
    (set_attr "type" "f_cvt")]
 
29511
 )
 
29512
 
 
29513
@@ -985,6 +992,7 @@
 
29514
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16"
 
29515
   "vcvtb%?.f16.f32\\t%0, %1"
 
29516
   [(set_attr "predicable" "yes")
 
29517
+   (set_attr "predicable_short_it" "no")
 
29518
    (set_attr "type" "f_cvt")]
 
29519
 )
 
29520
 
 
29521
@@ -994,6 +1002,7 @@
 
29522
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29523
   "ftosizs%?\\t%0, %1"
 
29524
   [(set_attr "predicable" "yes")
 
29525
+   (set_attr "predicable_short_it" "no")
 
29526
    (set_attr "type" "f_cvt")]
 
29527
 )
 
29528
 
 
29529
@@ -1003,6 +1012,7 @@
 
29530
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29531
   "ftosizd%?\\t%0, %P1"
 
29532
   [(set_attr "predicable" "yes")
 
29533
+   (set_attr "predicable_short_it" "no")
 
29534
    (set_attr "type" "f_cvt")]
 
29535
 )
 
29536
 
 
29537
@@ -1013,6 +1023,7 @@
 
29538
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29539
   "ftouizs%?\\t%0, %1"
 
29540
   [(set_attr "predicable" "yes")
 
29541
+   (set_attr "predicable_short_it" "no")
 
29542
    (set_attr "type" "f_cvt")]
 
29543
 )
 
29544
 
 
29545
@@ -1022,6 +1033,7 @@
 
29546
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29547
   "ftouizd%?\\t%0, %P1"
 
29548
   [(set_attr "predicable" "yes")
 
29549
+   (set_attr "predicable_short_it" "no")
 
29550
    (set_attr "type" "f_cvt")]
 
29551
 )
 
29552
 
 
29553
@@ -1032,6 +1044,7 @@
 
29554
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29555
   "fsitos%?\\t%0, %1"
 
29556
   [(set_attr "predicable" "yes")
 
29557
+   (set_attr "predicable_short_it" "no")
 
29558
    (set_attr "type" "f_cvt")]
 
29559
 )
 
29560
 
 
29561
@@ -1041,6 +1054,7 @@
 
29562
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29563
   "fsitod%?\\t%P0, %1"
 
29564
   [(set_attr "predicable" "yes")
 
29565
+   (set_attr "predicable_short_it" "no")
 
29566
    (set_attr "type" "f_cvt")]
 
29567
 )
 
29568
 
 
29569
@@ -1051,6 +1065,7 @@
 
29570
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29571
   "fuitos%?\\t%0, %1"
 
29572
   [(set_attr "predicable" "yes")
 
29573
+   (set_attr "predicable_short_it" "no")
 
29574
    (set_attr "type" "f_cvt")]
 
29575
 )
 
29576
 
 
29577
@@ -1060,6 +1075,7 @@
 
29578
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29579
   "fuitod%?\\t%P0, %1"
 
29580
   [(set_attr "predicable" "yes")
 
29581
+   (set_attr "predicable_short_it" "no")
 
29582
    (set_attr "type" "f_cvt")]
 
29583
 )
 
29584
 
 
29585
@@ -1072,6 +1088,7 @@
 
29586
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
 
29587
   "fsqrts%?\\t%0, %1"
 
29588
   [(set_attr "predicable" "yes")
 
29589
+   (set_attr "predicable_short_it" "no")
 
29590
    (set_attr "type" "fdivs")]
 
29591
 )
 
29592
 
 
29593
@@ -1081,6 +1098,7 @@
 
29594
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
29595
   "fsqrtd%?\\t%P0, %P1"
 
29596
   [(set_attr "predicable" "yes")
 
29597
+   (set_attr "predicable_short_it" "no")
 
29598
    (set_attr "type" "fdivd")]
 
29599
 )
 
29600
 
 
29601
@@ -1168,6 +1186,7 @@
 
29602
    fcmps%?\\t%0, %1
 
29603
    fcmpzs%?\\t%0"
 
29604
   [(set_attr "predicable" "yes")
 
29605
+   (set_attr "predicable_short_it" "no")
 
29606
    (set_attr "type" "fcmps")]
 
29607
 )
 
29608
 
 
29609
@@ -1180,6 +1199,7 @@
 
29610
    fcmpes%?\\t%0, %1
 
29611
    fcmpezs%?\\t%0"
 
29612
   [(set_attr "predicable" "yes")
 
29613
+   (set_attr "predicable_short_it" "no")
 
29614
    (set_attr "type" "fcmps")]
 
29615
 )
 
29616
 
 
29617
@@ -1192,6 +1212,7 @@
 
29618
    fcmpd%?\\t%P0, %P1
 
29619
    fcmpzd%?\\t%P0"
 
29620
   [(set_attr "predicable" "yes")
 
29621
+   (set_attr "predicable_short_it" "no")
 
29622
    (set_attr "type" "fcmpd")]
 
29623
 )
 
29624
 
 
29625
@@ -1204,6 +1225,7 @@
 
29626
    fcmped%?\\t%P0, %P1
 
29627
    fcmpezd%?\\t%P0"
 
29628
   [(set_attr "predicable" "yes")
 
29629
+   (set_attr "predicable_short_it" "no")
 
29630
    (set_attr "type" "fcmpd")]
 
29631
 )
 
29632
 
 
29633
@@ -1264,6 +1286,7 @@
 
29634
   "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 <vfp_double_cond>"
 
29635
   "vrint<vrint_variant>%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1"
 
29636
   [(set_attr "predicable" "<vrint_predicable>")
 
29637
+   (set_attr "predicable_short_it" "no")
 
29638
    (set_attr "type" "f_rint<vfp_type>")]
 
29639
 )
 
29640
 
 
29641
--- a/src/gcc/config/arm/t-linux-eabi
 
29642
+++ b/src/gcc/config/arm/t-linux-eabi
 
29643
@@ -18,6 +18,8 @@
 
29644
 
 
29645
 # We do not build a Thumb multilib for Linux because the definition of
 
29646
 # CLEAR_INSN_CACHE in linux-gas.h does not work in Thumb mode.
 
29647
+# If you set MULTILIB_OPTIONS to a non-empty value you should also set
 
29648
+# MULTILIB_DEFAULTS in linux-elf.h.
 
29649
 MULTILIB_OPTIONS       =
 
29650
 MULTILIB_DIRNAMES      =
 
29651
 
 
29652
--- a/src/gcc/config/arm/neon.md
 
29653
+++ b/src/gcc/config/arm/neon.md
 
29654
@@ -61,8 +61,7 @@
 
29655
     }
 
29656
 }
 
29657
  [(set_attr "neon_type" "neon_int_1,*,neon_vmov,*,neon_mrrc,neon_mcr_2_mcrr,*,*,*")
 
29658
-  (set_attr "type" "*,f_stored,*,f_loadd,*,*,alu_reg,load2,store2")
 
29659
-  (set_attr "insn" "*,*,*,*,*,*,mov,*,*")
 
29660
+  (set_attr "type" "*,f_stored,*,f_loadd,*,*,mov_reg,load2,store2")
 
29661
   (set_attr "length" "4,4,4,4,4,4,8,8,8")
 
29662
   (set_attr "arm_pool_range"     "*,*,*,1020,*,*,*,1020,*")
 
29663
   (set_attr "thumb2_pool_range"     "*,*,*,1018,*,*,*,1018,*")
 
29664
@@ -107,8 +106,7 @@
 
29665
 }
 
29666
   [(set_attr "neon_type" "neon_int_1,neon_stm_2,neon_vmov,neon_ldm_2,\
 
29667
                           neon_mrrc,neon_mcr_2_mcrr,*,*,*")
 
29668
-   (set_attr "type" "*,*,*,*,*,*,alu_reg,load4,store4")
 
29669
-   (set_attr "insn" "*,*,*,*,*,*,mov,*,*")
 
29670
+   (set_attr "type" "*,*,*,*,*,*,mov_reg,load4,store4")
 
29671
    (set_attr "length" "4,8,4,8,8,8,16,8,16")
 
29672
    (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*")
 
29673
    (set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*")
 
29674
@@ -487,7 +485,7 @@
 
29675
   [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1,*,*,*")
 
29676
    (set_attr "conds" "*,clob,clob,*,clob,clob,clob")
 
29677
    (set_attr "length" "*,8,8,*,8,8,8")
 
29678
-   (set_attr "arch" "nota8,*,*,onlya8,*,*,*")]
 
29679
+   (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits,*,*,*")]
 
29680
 )
 
29681
 
 
29682
 (define_insn "*sub<mode>3_neon"
 
29683
@@ -524,7 +522,7 @@
 
29684
   [(set_attr "neon_type" "neon_int_2,*,*,*,neon_int_2")
 
29685
    (set_attr "conds" "*,clob,clob,clob,*")
 
29686
    (set_attr "length" "*,8,8,8,*")
 
29687
-   (set_attr "arch" "nota8,*,*,*,onlya8")]
 
29688
+   (set_attr "arch" "neon_for_64bits,*,*,*,avoid_neon_for_64bits")]
 
29689
 )
 
29690
 
 
29691
 (define_insn "*mul<mode>3_neon"
 
29692
@@ -679,29 +677,6 @@
 
29693
   [(set_attr "neon_type" "neon_int_1")]
 
29694
 )
 
29695
 
 
29696
-(define_insn "iordi3_neon"
 
29697
-  [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r,?w,?w")
 
29698
-        (ior:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r,w,0")
 
29699
-               (match_operand:DI 2 "neon_logic_op2" "w,Dl,r,r,w,Dl")))]
 
29700
-  "TARGET_NEON"
 
29701
-{
 
29702
-  switch (which_alternative)
 
29703
-    {
 
29704
-    case 0: /* fall through */
 
29705
-    case 4: return "vorr\t%P0, %P1, %P2";
 
29706
-    case 1: /* fall through */
 
29707
-    case 5: return neon_output_logic_immediate ("vorr", &operands[2],
 
29708
-                    DImode, 0, VALID_NEON_QREG_MODE (DImode));
 
29709
-    case 2: return "#";
 
29710
-    case 3: return "#";
 
29711
-    default: gcc_unreachable ();
 
29712
-    }
 
29713
-}
 
29714
-  [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,neon_int_1,neon_int_1")
 
29715
-   (set_attr "length" "*,*,8,8,*,*")
 
29716
-   (set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")]
 
29717
-)
 
29718
-
 
29719
 ;; The concrete forms of the Neon immediate-logic instructions are vbic and
 
29720
 ;; vorr. We support the pseudo-instruction vand instead, because that
 
29721
 ;; corresponds to the canonical form the middle-end expects to use for
 
29722
@@ -724,29 +699,6 @@
 
29723
   [(set_attr "neon_type" "neon_int_1")]
 
29724
 )
 
29725
 
 
29726
-(define_insn "anddi3_neon"
 
29727
-  [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r,?w,?w")
 
29728
-        (and:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r,w,0")
 
29729
-               (match_operand:DI 2 "neon_inv_logic_op2" "w,DL,r,r,w,DL")))]
 
29730
-  "TARGET_NEON"
 
29731
-{
 
29732
-  switch (which_alternative)
 
29733
-    {
 
29734
-    case 0: /* fall through */
 
29735
-    case 4: return "vand\t%P0, %P1, %P2";
 
29736
-    case 1: /* fall through */
 
29737
-    case 5: return neon_output_logic_immediate ("vand", &operands[2],
 
29738
-                    DImode, 1, VALID_NEON_QREG_MODE (DImode));
 
29739
-    case 2: return "#";
 
29740
-    case 3: return "#";
 
29741
-    default: gcc_unreachable ();
 
29742
-    }
 
29743
-}
 
29744
-  [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,neon_int_1,neon_int_1")
 
29745
-   (set_attr "length" "*,*,8,8,*,*")
 
29746
-   (set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")]
 
29747
-)
 
29748
-
 
29749
 (define_insn "orn<mode>3_neon"
 
29750
   [(set (match_operand:VDQ 0 "s_register_operand" "=w")
 
29751
        (ior:VDQ (not:VDQ (match_operand:VDQ 2 "s_register_operand" "w"))
 
29752
@@ -828,21 +780,6 @@
 
29753
   [(set_attr "neon_type" "neon_int_1")]
 
29754
 )
 
29755
 
 
29756
-(define_insn "xordi3_neon"
 
29757
-  [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r,?w")
 
29758
-        (xor:DI (match_operand:DI 1 "s_register_operand" "%w,0,r,w")
 
29759
-               (match_operand:DI 2 "s_register_operand" "w,r,r,w")))]
 
29760
-  "TARGET_NEON"
 
29761
-  "@
 
29762
-   veor\t%P0, %P1, %P2
 
29763
-   #
 
29764
-   #
 
29765
-   veor\t%P0, %P1, %P2"
 
29766
-  [(set_attr "neon_type" "neon_int_1,*,*,neon_int_1")
 
29767
-   (set_attr "length" "*,8,8,*")
 
29768
-   (set_attr "arch" "nota8,*,*,onlya8")]
 
29769
-)
 
29770
-
 
29771
 (define_insn "one_cmpl<mode>2"
 
29772
   [(set (match_operand:VDQ 0 "s_register_operand" "=w")
 
29773
         (not:VDQ (match_operand:VDQ 1 "s_register_operand" "w")))]
 
29774
@@ -1162,7 +1099,7 @@
 
29775
       }
 
29776
     DONE;
 
29777
   }"
 
29778
-  [(set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")
 
29779
+  [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
 
29780
    (set_attr "opt" "*,*,speed,speed,*,*")]
 
29781
 )
 
29782
 
 
29783
@@ -1263,7 +1200,7 @@
 
29784
 
 
29785
     DONE;
 
29786
   }"
 
29787
-  [(set_attr "arch" "nota8,nota8,*,*,onlya8,onlya8")
 
29788
+  [(set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")
 
29789
    (set_attr "opt" "*,*,speed,speed,*,*")]
 
29790
 )
 
29791
 
 
29792
@@ -3305,6 +3242,24 @@
 
29793
                    (const_string "neon_fp_vadd_qqq_vabs_qq")))]
 
29794
 )
 
29795
 
 
29796
+(define_insn "neon_vcvtv4sfv4hf"
 
29797
+  [(set (match_operand:V4SF 0 "s_register_operand" "=w")
 
29798
+       (unspec:V4SF [(match_operand:V4HF 1 "s_register_operand" "w")]
 
29799
+                         UNSPEC_VCVT))]
 
29800
+  "TARGET_NEON && TARGET_FP16"
 
29801
+  "vcvt.f32.f16\t%q0, %P1"
 
29802
+  [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")]
 
29803
+)
 
29804
+
 
29805
+(define_insn "neon_vcvtv4hfv4sf"
 
29806
+  [(set (match_operand:V4HF 0 "s_register_operand" "=w")
 
29807
+       (unspec:V4HF [(match_operand:V4SF 1 "s_register_operand" "w")]
 
29808
+                         UNSPEC_VCVT))]
 
29809
+  "TARGET_NEON && TARGET_FP16"
 
29810
+  "vcvt.f16.f32\t%P0, %q1"
 
29811
+  [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")]
 
29812
+)
 
29813
+
 
29814
 (define_insn "neon_vcvt_n<mode>"
 
29815
   [(set (match_operand:<V_CVTTO> 0 "s_register_operand" "=w")
 
29816
        (unspec:<V_CVTTO> [(match_operand:VCVTF 1 "s_register_operand" "w")
 
29817
@@ -4660,21 +4615,22 @@
 
29818
 )
 
29819
 
 
29820
 (define_insn "neon_vld1_dup<mode>"
 
29821
-  [(set (match_operand:VDX 0 "s_register_operand" "=w")
 
29822
-        (vec_duplicate:VDX (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
 
29823
+  [(set (match_operand:VD 0 "s_register_operand" "=w")
 
29824
+        (vec_duplicate:VD (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
 
29825
   "TARGET_NEON"
 
29826
-{
 
29827
-  if (GET_MODE_NUNITS (<MODE>mode) > 1)
 
29828
-    return "vld1.<V_sz_elem>\t{%P0[]}, %A1";
 
29829
-  else
 
29830
-    return "vld1.<V_sz_elem>\t%h0, %A1";
 
29831
-}
 
29832
-  [(set (attr "neon_type")
 
29833
-      (if_then_else (gt (const_string "<V_mode_nunits>") (const_string "1"))
 
29834
-                    (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes")
 
29835
-                    (const_string "neon_vld1_1_2_regs")))]
 
29836
+  "vld1.<V_sz_elem>\t{%P0[]}, %A1"
 
29837
+  [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
 
29838
 )
 
29839
 
 
29840
+;; Special case for DImode.  Treat it exactly like a simple load.
 
29841
+(define_expand "neon_vld1_dupdi"
 
29842
+  [(set (match_operand:DI 0 "s_register_operand" "")
 
29843
+        (unspec:DI [(match_operand:DI 1 "neon_struct_operand" "")]
 
29844
+                  UNSPEC_VLD1))]
 
29845
+  "TARGET_NEON"
 
29846
+  ""
 
29847
+)
 
29848
+
 
29849
 (define_insn "neon_vld1_dup<mode>"
 
29850
   [(set (match_operand:VQ 0 "s_register_operand" "=w")
 
29851
         (vec_duplicate:VQ (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
 
29852
@@ -5635,7 +5591,7 @@
 
29853
    (match_operand:SI 3 "immediate_operand" "")]
 
29854
   "TARGET_NEON"
 
29855
 {
 
29856
-  emit_insn (gen_and<mode>3<V_suf64> (operands[0], operands[1], operands[2]));
 
29857
+  emit_insn (gen_and<mode>3 (operands[0], operands[1], operands[2]));
 
29858
   DONE;
 
29859
 })
 
29860
 
 
29861
@@ -5646,7 +5602,7 @@
 
29862
    (match_operand:SI 3 "immediate_operand" "")]
 
29863
   "TARGET_NEON"
 
29864
 {
 
29865
-  emit_insn (gen_ior<mode>3<V_suf64> (operands[0], operands[1], operands[2]));
 
29866
+  emit_insn (gen_ior<mode>3 (operands[0], operands[1], operands[2]));
 
29867
   DONE;
 
29868
 })
 
29869
 
 
29870
@@ -5657,7 +5613,7 @@
 
29871
    (match_operand:SI 3 "immediate_operand" "")]
 
29872
   "TARGET_NEON"
 
29873
 {
 
29874
-  emit_insn (gen_xor<mode>3<V_suf64> (operands[0], operands[1], operands[2]));
 
29875
+  emit_insn (gen_xor<mode>3 (operands[0], operands[1], operands[2]));
 
29876
   DONE;
 
29877
 })
 
29878
 
 
29879
--- a/src/gcc/config/arm/ldmstm.md
 
29880
+++ b/src/gcc/config/arm/ldmstm.md
 
29881
@@ -37,7 +37,8 @@
 
29882
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29883
   "ldm%(ia%)\t%5, {%1, %2, %3, %4}"
 
29884
   [(set_attr "type" "load4")
 
29885
-   (set_attr "predicable" "yes")])
 
29886
+   (set_attr "predicable" "yes")
 
29887
+   (set_attr "predicable_short_it" "no")])
 
29888
 
 
29889
 (define_insn "*thumb_ldm4_ia"
 
29890
   [(match_parallel 0 "load_multiple_operation"
 
29891
@@ -74,7 +75,8 @@
 
29892
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 5"
 
29893
   "ldm%(ia%)\t%5!, {%1, %2, %3, %4}"
 
29894
   [(set_attr "type" "load4")
 
29895
-   (set_attr "predicable" "yes")])
 
29896
+   (set_attr "predicable" "yes")
 
29897
+   (set_attr "predicable_short_it" "no")])
 
29898
 
 
29899
 (define_insn "*thumb_ldm4_ia_update"
 
29900
   [(match_parallel 0 "load_multiple_operation"
 
29901
@@ -108,7 +110,8 @@
 
29902
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29903
   "stm%(ia%)\t%5, {%1, %2, %3, %4}"
 
29904
   [(set_attr "type" "store4")
 
29905
-   (set_attr "predicable" "yes")])
 
29906
+   (set_attr "predicable" "yes")
 
29907
+   (set_attr "predicable_short_it" "no")])
 
29908
 
 
29909
 (define_insn "*stm4_ia_update"
 
29910
   [(match_parallel 0 "store_multiple_operation"
 
29911
@@ -125,7 +128,8 @@
 
29912
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 5"
 
29913
   "stm%(ia%)\t%5!, {%1, %2, %3, %4}"
 
29914
   [(set_attr "type" "store4")
 
29915
-   (set_attr "predicable" "yes")])
 
29916
+   (set_attr "predicable" "yes")
 
29917
+   (set_attr "predicable_short_it" "no")])
 
29918
 
 
29919
 (define_insn "*thumb_stm4_ia_update"
 
29920
   [(match_parallel 0 "store_multiple_operation"
 
29921
@@ -302,7 +306,8 @@
 
29922
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29923
   "ldm%(db%)\t%5, {%1, %2, %3, %4}"
 
29924
   [(set_attr "type" "load4")
 
29925
-   (set_attr "predicable" "yes")])
 
29926
+   (set_attr "predicable" "yes")
 
29927
+   (set_attr "predicable_short_it" "no")])
 
29928
 
 
29929
 (define_insn "*ldm4_db_update"
 
29930
   [(match_parallel 0 "load_multiple_operation"
 
29931
@@ -323,7 +328,8 @@
 
29932
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 5"
 
29933
   "ldm%(db%)\t%5!, {%1, %2, %3, %4}"
 
29934
   [(set_attr "type" "load4")
 
29935
-   (set_attr "predicable" "yes")])
 
29936
+   (set_attr "predicable" "yes")
 
29937
+   (set_attr "predicable_short_it" "no")])
 
29938
 
 
29939
 (define_insn "*stm4_db"
 
29940
   [(match_parallel 0 "store_multiple_operation"
 
29941
@@ -338,7 +344,8 @@
 
29942
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29943
   "stm%(db%)\t%5, {%1, %2, %3, %4}"
 
29944
   [(set_attr "type" "store4")
 
29945
-   (set_attr "predicable" "yes")])
 
29946
+   (set_attr "predicable" "yes")
 
29947
+   (set_attr "predicable_short_it" "no")])
 
29948
 
 
29949
 (define_insn "*stm4_db_update"
 
29950
   [(match_parallel 0 "store_multiple_operation"
 
29951
@@ -355,7 +362,8 @@
 
29952
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 5"
 
29953
   "stm%(db%)\t%5!, {%1, %2, %3, %4}"
 
29954
   [(set_attr "type" "store4")
 
29955
-   (set_attr "predicable" "yes")])
 
29956
+   (set_attr "predicable" "yes")
 
29957
+   (set_attr "predicable_short_it" "no")])
 
29958
 
 
29959
 (define_peephole2
 
29960
   [(set (match_operand:SI 0 "s_register_operand" "")
 
29961
@@ -477,7 +485,8 @@
 
29962
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
29963
   "ldm%(ia%)\t%4, {%1, %2, %3}"
 
29964
   [(set_attr "type" "load3")
 
29965
-   (set_attr "predicable" "yes")])
 
29966
+   (set_attr "predicable" "yes")
 
29967
+   (set_attr "predicable_short_it" "no")])
 
29968
 
 
29969
 (define_insn "*thumb_ldm3_ia"
 
29970
   [(match_parallel 0 "load_multiple_operation"
 
29971
@@ -508,7 +517,8 @@
 
29972
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29973
   "ldm%(ia%)\t%4!, {%1, %2, %3}"
 
29974
   [(set_attr "type" "load3")
 
29975
-   (set_attr "predicable" "yes")])
 
29976
+   (set_attr "predicable" "yes")
 
29977
+   (set_attr "predicable_short_it" "no")])
 
29978
 
 
29979
 (define_insn "*thumb_ldm3_ia_update"
 
29980
   [(match_parallel 0 "load_multiple_operation"
 
29981
@@ -537,7 +547,8 @@
 
29982
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
29983
   "stm%(ia%)\t%4, {%1, %2, %3}"
 
29984
   [(set_attr "type" "store3")
 
29985
-   (set_attr "predicable" "yes")])
 
29986
+   (set_attr "predicable" "yes")
 
29987
+   (set_attr "predicable_short_it" "no")])
 
29988
 
 
29989
 (define_insn "*stm3_ia_update"
 
29990
   [(match_parallel 0 "store_multiple_operation"
 
29991
@@ -552,7 +563,8 @@
 
29992
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
29993
   "stm%(ia%)\t%4!, {%1, %2, %3}"
 
29994
   [(set_attr "type" "store3")
 
29995
-   (set_attr "predicable" "yes")])
 
29996
+   (set_attr "predicable" "yes")
 
29997
+   (set_attr "predicable_short_it" "no")])
 
29998
 
 
29999
 (define_insn "*thumb_stm3_ia_update"
 
30000
   [(match_parallel 0 "store_multiple_operation"
 
30001
@@ -704,7 +716,8 @@
 
30002
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30003
   "ldm%(db%)\t%4, {%1, %2, %3}"
 
30004
   [(set_attr "type" "load3")
 
30005
-   (set_attr "predicable" "yes")])
 
30006
+   (set_attr "predicable" "yes")
 
30007
+   (set_attr "predicable_short_it" "no")])
 
30008
 
 
30009
 (define_insn "*ldm3_db_update"
 
30010
   [(match_parallel 0 "load_multiple_operation"
 
30011
@@ -722,7 +735,8 @@
 
30012
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
30013
   "ldm%(db%)\t%4!, {%1, %2, %3}"
 
30014
   [(set_attr "type" "load3")
 
30015
-   (set_attr "predicable" "yes")])
 
30016
+   (set_attr "predicable" "yes")
 
30017
+   (set_attr "predicable_short_it" "no")])
 
30018
 
 
30019
 (define_insn "*stm3_db"
 
30020
   [(match_parallel 0 "store_multiple_operation"
 
30021
@@ -735,7 +749,8 @@
 
30022
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30023
   "stm%(db%)\t%4, {%1, %2, %3}"
 
30024
   [(set_attr "type" "store3")
 
30025
-   (set_attr "predicable" "yes")])
 
30026
+   (set_attr "predicable" "yes")
 
30027
+   (set_attr "predicable_short_it" "no")])
 
30028
 
 
30029
 (define_insn "*stm3_db_update"
 
30030
   [(match_parallel 0 "store_multiple_operation"
 
30031
@@ -750,7 +765,8 @@
 
30032
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 4"
 
30033
   "stm%(db%)\t%4!, {%1, %2, %3}"
 
30034
   [(set_attr "type" "store3")
 
30035
-   (set_attr "predicable" "yes")])
 
30036
+   (set_attr "predicable" "yes")
 
30037
+   (set_attr "predicable_short_it" "no")])
 
30038
 
 
30039
 (define_peephole2
 
30040
   [(set (match_operand:SI 0 "s_register_operand" "")
 
30041
@@ -855,7 +871,8 @@
 
30042
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 2"
 
30043
   "ldm%(ia%)\t%3, {%1, %2}"
 
30044
   [(set_attr "type" "load2")
 
30045
-   (set_attr "predicable" "yes")])
 
30046
+   (set_attr "predicable" "yes")
 
30047
+   (set_attr "predicable_short_it" "no")])
 
30048
 
 
30049
 (define_insn "*thumb_ldm2_ia"
 
30050
   [(match_parallel 0 "load_multiple_operation"
 
30051
@@ -880,7 +897,8 @@
 
30052
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30053
   "ldm%(ia%)\t%3!, {%1, %2}"
 
30054
   [(set_attr "type" "load2")
 
30055
-   (set_attr "predicable" "yes")])
 
30056
+   (set_attr "predicable" "yes")
 
30057
+   (set_attr "predicable_short_it" "no")])
 
30058
 
 
30059
 (define_insn "*thumb_ldm2_ia_update"
 
30060
   [(match_parallel 0 "load_multiple_operation"
 
30061
@@ -904,7 +922,8 @@
 
30062
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 2"
 
30063
   "stm%(ia%)\t%3, {%1, %2}"
 
30064
   [(set_attr "type" "store2")
 
30065
-   (set_attr "predicable" "yes")])
 
30066
+   (set_attr "predicable" "yes")
 
30067
+   (set_attr "predicable_short_it" "no")])
 
30068
 
 
30069
 (define_insn "*stm2_ia_update"
 
30070
   [(match_parallel 0 "store_multiple_operation"
 
30071
@@ -917,7 +936,8 @@
 
30072
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30073
   "stm%(ia%)\t%3!, {%1, %2}"
 
30074
   [(set_attr "type" "store2")
 
30075
-   (set_attr "predicable" "yes")])
 
30076
+   (set_attr "predicable" "yes")
 
30077
+   (set_attr "predicable_short_it" "no")])
 
30078
 
 
30079
 (define_insn "*thumb_stm2_ia_update"
 
30080
   [(match_parallel 0 "store_multiple_operation"
 
30081
@@ -1044,7 +1064,8 @@
 
30082
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 2"
 
30083
   "ldm%(db%)\t%3, {%1, %2}"
 
30084
   [(set_attr "type" "load2")
 
30085
-   (set_attr "predicable" "yes")])
 
30086
+   (set_attr "predicable" "yes")
 
30087
+   (set_attr "predicable_short_it" "no")])
 
30088
 
 
30089
 (define_insn "*ldm2_db_update"
 
30090
   [(match_parallel 0 "load_multiple_operation"
 
30091
@@ -1059,7 +1080,8 @@
 
30092
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30093
   "ldm%(db%)\t%3!, {%1, %2}"
 
30094
   [(set_attr "type" "load2")
 
30095
-   (set_attr "predicable" "yes")])
 
30096
+   (set_attr "predicable" "yes")
 
30097
+   (set_attr "predicable_short_it" "no")])
 
30098
 
 
30099
 (define_insn "*stm2_db"
 
30100
   [(match_parallel 0 "store_multiple_operation"
 
30101
@@ -1070,7 +1092,8 @@
 
30102
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 2"
 
30103
   "stm%(db%)\t%3, {%1, %2}"
 
30104
   [(set_attr "type" "store2")
 
30105
-   (set_attr "predicable" "yes")])
 
30106
+   (set_attr "predicable" "yes")
 
30107
+   (set_attr "predicable_short_it" "no")])
 
30108
 
 
30109
 (define_insn "*stm2_db_update"
 
30110
   [(match_parallel 0 "store_multiple_operation"
 
30111
@@ -1083,7 +1106,8 @@
 
30112
   "TARGET_32BIT && XVECLEN (operands[0], 0) == 3"
 
30113
   "stm%(db%)\t%3!, {%1, %2}"
 
30114
   [(set_attr "type" "store2")
 
30115
-   (set_attr "predicable" "yes")])
 
30116
+   (set_attr "predicable" "yes")
 
30117
+   (set_attr "predicable_short_it" "no")])
 
30118
 
 
30119
 (define_peephole2
 
30120
   [(set (match_operand:SI 0 "s_register_operand" "")
 
30121
--- a/src/gcc/config/arm/arm_neon_builtins.def
 
30122
+++ b/src/gcc/config/arm/arm_neon_builtins.def
 
30123
@@ -0,0 +1,212 @@
 
30124
+/* NEON builtin definitions for ARM.
 
30125
+   Copyright (C) 2013
 
30126
+   Free Software Foundation, Inc.
 
30127
+   Contributed by ARM Ltd.
 
30128
+
 
30129
+   This file is part of GCC.
 
30130
+
 
30131
+   GCC is free software; you can redistribute it and/or modify it
 
30132
+   under the terms of the GNU General Public License as published
 
30133
+   by the Free Software Foundation; either version 3, or (at your
 
30134
+   option) any later version.
 
30135
+
 
30136
+   GCC is distributed in the hope that it will be useful, but WITHOUT
 
30137
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 
30138
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
 
30139
+   License for more details.
 
30140
+
 
30141
+   You should have received a copy of the GNU General Public License
 
30142
+   along with GCC; see the file COPYING3.  If not see
 
30143
+   <http://www.gnu.org/licenses/>.  */
 
30144
+
 
30145
+VAR10 (BINOP, vadd,
 
30146
+       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30147
+VAR3 (BINOP, vaddl, v8qi, v4hi, v2si),
 
30148
+VAR3 (BINOP, vaddw, v8qi, v4hi, v2si),
 
30149
+VAR6 (BINOP, vhadd, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30150
+VAR8 (BINOP, vqadd, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30151
+VAR3 (BINOP, vaddhn, v8hi, v4si, v2di),
 
30152
+VAR8 (BINOP, vmul, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30153
+VAR8 (TERNOP, vmla, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30154
+VAR3 (TERNOP, vmlal, v8qi, v4hi, v2si),
 
30155
+VAR2 (TERNOP, vfma, v2sf, v4sf),
 
30156
+VAR2 (TERNOP, vfms, v2sf, v4sf),
 
30157
+VAR8 (TERNOP, vmls, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30158
+VAR3 (TERNOP, vmlsl, v8qi, v4hi, v2si),
 
30159
+VAR4 (BINOP, vqdmulh, v4hi, v2si, v8hi, v4si),
 
30160
+VAR2 (TERNOP, vqdmlal, v4hi, v2si),
 
30161
+VAR2 (TERNOP, vqdmlsl, v4hi, v2si),
 
30162
+VAR3 (BINOP, vmull, v8qi, v4hi, v2si),
 
30163
+VAR2 (SCALARMULL, vmull_n, v4hi, v2si),
 
30164
+VAR2 (LANEMULL, vmull_lane, v4hi, v2si),
 
30165
+VAR2 (SCALARMULL, vqdmull_n, v4hi, v2si),
 
30166
+VAR2 (LANEMULL, vqdmull_lane, v4hi, v2si),
 
30167
+VAR4 (SCALARMULH, vqdmulh_n, v4hi, v2si, v8hi, v4si),
 
30168
+VAR4 (LANEMULH, vqdmulh_lane, v4hi, v2si, v8hi, v4si),
 
30169
+VAR2 (BINOP, vqdmull, v4hi, v2si),
 
30170
+VAR8 (BINOP, vshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30171
+VAR8 (BINOP, vqshl, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30172
+VAR8 (SHIFTIMM, vshr_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30173
+VAR3 (SHIFTIMM, vshrn_n, v8hi, v4si, v2di),
 
30174
+VAR3 (SHIFTIMM, vqshrn_n, v8hi, v4si, v2di),
 
30175
+VAR3 (SHIFTIMM, vqshrun_n, v8hi, v4si, v2di),
 
30176
+VAR8 (SHIFTIMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30177
+VAR8 (SHIFTIMM, vqshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30178
+VAR8 (SHIFTIMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30179
+VAR3 (SHIFTIMM, vshll_n, v8qi, v4hi, v2si),
 
30180
+VAR8 (SHIFTACC, vsra_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30181
+VAR10 (BINOP, vsub, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30182
+VAR3 (BINOP, vsubl, v8qi, v4hi, v2si),
 
30183
+VAR3 (BINOP, vsubw, v8qi, v4hi, v2si),
 
30184
+VAR8 (BINOP, vqsub, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30185
+VAR6 (BINOP, vhsub, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30186
+VAR3 (BINOP, vsubhn, v8hi, v4si, v2di),
 
30187
+VAR8 (BINOP, vceq, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30188
+VAR8 (BINOP, vcge, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30189
+VAR6 (BINOP, vcgeu, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30190
+VAR8 (BINOP, vcgt, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30191
+VAR6 (BINOP, vcgtu, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30192
+VAR2 (BINOP, vcage, v2sf, v4sf),
 
30193
+VAR2 (BINOP, vcagt, v2sf, v4sf),
 
30194
+VAR6 (BINOP, vtst, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30195
+VAR8 (BINOP, vabd, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30196
+VAR3 (BINOP, vabdl, v8qi, v4hi, v2si),
 
30197
+VAR6 (TERNOP, vaba, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30198
+VAR3 (TERNOP, vabal, v8qi, v4hi, v2si),
 
30199
+VAR8 (BINOP, vmax, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30200
+VAR8 (BINOP, vmin, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30201
+VAR4 (BINOP, vpadd, v8qi, v4hi, v2si, v2sf),
 
30202
+VAR6 (UNOP, vpaddl, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30203
+VAR6 (BINOP, vpadal, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30204
+VAR4 (BINOP, vpmax, v8qi, v4hi, v2si, v2sf),
 
30205
+VAR4 (BINOP, vpmin, v8qi, v4hi, v2si, v2sf),
 
30206
+VAR2 (BINOP, vrecps, v2sf, v4sf),
 
30207
+VAR2 (BINOP, vrsqrts, v2sf, v4sf),
 
30208
+VAR8 (SHIFTINSERT, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30209
+VAR8 (SHIFTINSERT, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di),
 
30210
+VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30211
+VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30212
+VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30213
+VAR6 (UNOP, vqneg, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30214
+VAR6 (UNOP, vcls, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30215
+VAR6 (UNOP, vclz, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30216
+VAR2 (UNOP, vcnt, v8qi, v16qi),
 
30217
+VAR4 (UNOP, vrecpe, v2si, v2sf, v4si, v4sf),
 
30218
+VAR4 (UNOP, vrsqrte, v2si, v2sf, v4si, v4sf),
 
30219
+VAR6 (UNOP, vmvn, v8qi, v4hi, v2si, v16qi, v8hi, v4si),
 
30220
+  /* FIXME: vget_lane supports more variants than this!  */
 
30221
+VAR10 (GETLANE, vget_lane,
 
30222
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30223
+VAR10 (SETLANE, vset_lane,
 
30224
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30225
+VAR5 (CREATE, vcreate, v8qi, v4hi, v2si, v2sf, di),
 
30226
+VAR10 (DUP, vdup_n,
 
30227
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30228
+VAR10 (DUPLANE, vdup_lane,
 
30229
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30230
+VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di),
 
30231
+VAR5 (SPLIT, vget_high, v16qi, v8hi, v4si, v4sf, v2di),
 
30232
+VAR5 (SPLIT, vget_low, v16qi, v8hi, v4si, v4sf, v2di),
 
30233
+VAR3 (UNOP, vmovn, v8hi, v4si, v2di),
 
30234
+VAR3 (UNOP, vqmovn, v8hi, v4si, v2di),
 
30235
+VAR3 (UNOP, vqmovun, v8hi, v4si, v2di),
 
30236
+VAR3 (UNOP, vmovl, v8qi, v4hi, v2si),
 
30237
+VAR6 (LANEMUL, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30238
+VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30239
+VAR2 (LANEMAC, vmlal_lane, v4hi, v2si),
 
30240
+VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si),
 
30241
+VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30242
+VAR2 (LANEMAC, vmlsl_lane, v4hi, v2si),
 
30243
+VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si),
 
30244
+VAR6 (SCALARMUL, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30245
+VAR6 (SCALARMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30246
+VAR2 (SCALARMAC, vmlal_n, v4hi, v2si),
 
30247
+VAR2 (SCALARMAC, vqdmlal_n, v4hi, v2si),
 
30248
+VAR6 (SCALARMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30249
+VAR2 (SCALARMAC, vmlsl_n, v4hi, v2si),
 
30250
+VAR2 (SCALARMAC, vqdmlsl_n, v4hi, v2si),
 
30251
+VAR10 (BINOP, vext,
 
30252
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30253
+VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30254
+VAR4 (UNOP, vrev32, v8qi, v4hi, v16qi, v8hi),
 
30255
+VAR2 (UNOP, vrev16, v8qi, v16qi),
 
30256
+VAR4 (CONVERT, vcvt, v2si, v2sf, v4si, v4sf),
 
30257
+VAR4 (FIXCONV, vcvt_n, v2si, v2sf, v4si, v4sf),
 
30258
+VAR1 (FLOAT_WIDEN, vcvtv4sf, v4hf),
 
30259
+VAR1 (FLOAT_NARROW, vcvtv4hf, v4sf),
 
30260
+VAR10 (SELECT, vbsl,
 
30261
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30262
+VAR2 (RINT, vrintn, v2sf, v4sf),
 
30263
+VAR2 (RINT, vrinta, v2sf, v4sf),
 
30264
+VAR2 (RINT, vrintp, v2sf, v4sf),
 
30265
+VAR2 (RINT, vrintm, v2sf, v4sf),
 
30266
+VAR2 (RINT, vrintz, v2sf, v4sf),
 
30267
+VAR2 (RINT, vrintx, v2sf, v4sf),
 
30268
+VAR1 (VTBL, vtbl1, v8qi),
 
30269
+VAR1 (VTBL, vtbl2, v8qi),
 
30270
+VAR1 (VTBL, vtbl3, v8qi),
 
30271
+VAR1 (VTBL, vtbl4, v8qi),
 
30272
+VAR1 (VTBX, vtbx1, v8qi),
 
30273
+VAR1 (VTBX, vtbx2, v8qi),
 
30274
+VAR1 (VTBX, vtbx3, v8qi),
 
30275
+VAR1 (VTBX, vtbx4, v8qi),
 
30276
+VAR8 (RESULTPAIR, vtrn, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30277
+VAR8 (RESULTPAIR, vzip, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30278
+VAR8 (RESULTPAIR, vuzp, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf),
 
30279
+VAR5 (REINTERP, vreinterpretv8qi, v8qi, v4hi, v2si, v2sf, di),
 
30280
+VAR5 (REINTERP, vreinterpretv4hi, v8qi, v4hi, v2si, v2sf, di),
 
30281
+VAR5 (REINTERP, vreinterpretv2si, v8qi, v4hi, v2si, v2sf, di),
 
30282
+VAR5 (REINTERP, vreinterpretv2sf, v8qi, v4hi, v2si, v2sf, di),
 
30283
+VAR5 (REINTERP, vreinterpretdi, v8qi, v4hi, v2si, v2sf, di),
 
30284
+VAR5 (REINTERP, vreinterpretv16qi, v16qi, v8hi, v4si, v4sf, v2di),
 
30285
+VAR5 (REINTERP, vreinterpretv8hi, v16qi, v8hi, v4si, v4sf, v2di),
 
30286
+VAR5 (REINTERP, vreinterpretv4si, v16qi, v8hi, v4si, v4sf, v2di),
 
30287
+VAR5 (REINTERP, vreinterpretv4sf, v16qi, v8hi, v4si, v4sf, v2di),
 
30288
+VAR5 (REINTERP, vreinterpretv2di, v16qi, v8hi, v4si, v4sf, v2di),
 
30289
+VAR10 (LOAD1, vld1,
 
30290
+         v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30291
+VAR10 (LOAD1LANE, vld1_lane,
 
30292
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30293
+VAR10 (LOAD1, vld1_dup,
 
30294
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30295
+VAR10 (STORE1, vst1,
 
30296
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30297
+VAR10 (STORE1LANE, vst1_lane,
 
30298
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30299
+VAR9 (LOADSTRUCT,
 
30300
+       vld2, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30301
+VAR7 (LOADSTRUCTLANE, vld2_lane,
 
30302
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30303
+VAR5 (LOADSTRUCT, vld2_dup, v8qi, v4hi, v2si, v2sf, di),
 
30304
+VAR9 (STORESTRUCT, vst2,
 
30305
+       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30306
+VAR7 (STORESTRUCTLANE, vst2_lane,
 
30307
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30308
+VAR9 (LOADSTRUCT,
 
30309
+       vld3, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30310
+VAR7 (LOADSTRUCTLANE, vld3_lane,
 
30311
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30312
+VAR5 (LOADSTRUCT, vld3_dup, v8qi, v4hi, v2si, v2sf, di),
 
30313
+VAR9 (STORESTRUCT, vst3,
 
30314
+       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30315
+VAR7 (STORESTRUCTLANE, vst3_lane,
 
30316
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30317
+VAR9 (LOADSTRUCT, vld4,
 
30318
+       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30319
+VAR7 (LOADSTRUCTLANE, vld4_lane,
 
30320
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30321
+VAR5 (LOADSTRUCT, vld4_dup, v8qi, v4hi, v2si, v2sf, di),
 
30322
+VAR9 (STORESTRUCT, vst4,
 
30323
+       v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf),
 
30324
+VAR7 (STORESTRUCTLANE, vst4_lane,
 
30325
+       v8qi, v4hi, v2si, v2sf, v8hi, v4si, v4sf),
 
30326
+VAR10 (LOGICBINOP, vand,
 
30327
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30328
+VAR10 (LOGICBINOP, vorr,
 
30329
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30330
+VAR10 (BINOP, veor,
 
30331
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30332
+VAR10 (LOGICBINOP, vbic,
 
30333
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di),
 
30334
+VAR10 (LOGICBINOP, vorn,
 
30335
+        v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di)
 
30336
--- a/src/gcc/config/arm/neon.ml
 
30337
+++ b/src/gcc/config/arm/neon.ml
 
30338
@@ -21,7 +21,7 @@
 
30339
    <http://www.gnu.org/licenses/>.  *)
 
30340
 
 
30341
 (* Shorthand types for vector elements.  *)
 
30342
-type elts = S8 | S16 | S32 | S64 | F32 | U8 | U16 | U32 | U64 | P8 | P16
 
30343
+type elts = S8 | S16 | S32 | S64 | F16 | F32 | U8 | U16 | U32 | U64 | P8 | P16
 
30344
           | I8 | I16 | I32 | I64 | B8 | B16 | B32 | B64 | Conv of elts * elts
 
30345
           | Cast of elts * elts | NoElts
 
30346
 
 
30347
@@ -37,6 +37,7 @@
 
30348
             | T_uint16x4  | T_uint16x8
 
30349
             | T_uint32x2  | T_uint32x4
 
30350
             | T_uint64x1  | T_uint64x2
 
30351
+            | T_float16x4
 
30352
             | T_float32x2 | T_float32x4
 
30353
             | T_poly8x8   | T_poly8x16
 
30354
             | T_poly16x4  | T_poly16x8
 
30355
@@ -46,11 +47,13 @@
 
30356
              | T_uint8     | T_uint16
 
30357
              | T_uint32    | T_uint64
 
30358
              | T_poly8     | T_poly16
 
30359
-             | T_float32   | T_arrayof of int * vectype
 
30360
+             | T_float16   | T_float32
 
30361
+             | T_arrayof of int * vectype
 
30362
              | T_ptrto of vectype | T_const of vectype
 
30363
              | T_void      | T_intQI
 
30364
              | T_intHI     | T_intSI
 
30365
-             | T_intDI     | T_floatSF
 
30366
+             | T_intDI     | T_floatHF
 
30367
+             | T_floatSF
 
30368
 
 
30369
 (* The meanings of the following are:
 
30370
      TImode : "Tetra", two registers (four words).
 
30371
@@ -92,7 +95,7 @@
 
30372
           | Arity3 of vectype * vectype * vectype * vectype
 
30373
            | Arity4 of vectype * vectype * vectype * vectype * vectype
 
30374
 
 
30375
-type vecmode = V8QI | V4HI | V2SI | V2SF | DI
 
30376
+type vecmode = V8QI | V4HI | V4HF |V2SI | V2SF | DI
 
30377
              | V16QI | V8HI | V4SI | V4SF | V2DI
 
30378
              | QI | HI | SI | SF
 
30379
 
 
30380
@@ -284,18 +287,22 @@
 
30381
   | Fixed_core_reg
 
30382
     (* Mark that the intrinsic requires __ARM_FEATURE_string to be defined.  *)
 
30383
   | Requires_feature of string
 
30384
+    (* Mark that the intrinsic requires a particular architecture version.  *)
 
30385
   | Requires_arch of int
 
30386
+    (* Mark that the intrinsic requires a particular bit in __ARM_FP to
 
30387
+    be set.   *)
 
30388
+  | Requires_FP_bit of int
 
30389
 
 
30390
 exception MixedMode of elts * elts
 
30391
 
 
30392
 let rec elt_width = function
 
30393
     S8 | U8 | P8 | I8 | B8 -> 8
 
30394
-  | S16 | U16 | P16 | I16 | B16 -> 16
 
30395
+  | S16 | U16 | P16 | I16 | B16 | F16 -> 16
 
30396
   | S32 | F32 | U32 | I32 | B32 -> 32
 
30397
   | S64 | U64 | I64 | B64 -> 64
 
30398
   | Conv (a, b) ->
 
30399
       let wa = elt_width a and wb = elt_width b in
 
30400
-      if wa = wb then wa else failwith "element width?"
 
30401
+      if wa = wb then wa else raise (MixedMode (a, b))
 
30402
   | Cast (a, b) -> raise (MixedMode (a, b))
 
30403
   | NoElts -> failwith "No elts"
 
30404
 
 
30405
@@ -303,7 +310,7 @@
 
30406
     S8 | S16 | S32 | S64 -> Signed
 
30407
   | U8 | U16 | U32 | U64 -> Unsigned
 
30408
   | P8 | P16 -> Poly
 
30409
-  | F32 -> Float
 
30410
+  | F16 | F32 -> Float
 
30411
   | I8 | I16 | I32 | I64 -> Int
 
30412
   | B8 | B16 | B32 | B64 -> Bits
 
30413
   | Conv (a, b) | Cast (a, b) -> ConvClass (elt_class a, elt_class b)
 
30414
@@ -315,6 +322,7 @@
 
30415
   | Signed, 16 -> S16
 
30416
   | Signed, 32 -> S32
 
30417
   | Signed, 64 -> S64
 
30418
+  | Float, 16 -> F16
 
30419
   | Float, 32 -> F32
 
30420
   | Unsigned, 8 -> U8
 
30421
   | Unsigned, 16 -> U16
 
30422
@@ -384,7 +392,12 @@
 
30423
   in
 
30424
     scan ((Array.length operands) - 1)
 
30425
 
 
30426
-let rec mode_of_elt elt shape =
 
30427
+(* Find a vecmode from a shape_elt ELT for an instruction with shape_form
 
30428
+   SHAPE.  For a Use_operands shape, if ARGPOS is passed then return the mode
 
30429
+   for the given argument position, else determine which argument to return a
 
30430
+   mode for automatically.  *)
 
30431
+
 
30432
+let rec mode_of_elt ?argpos elt shape =
 
30433
   let flt = match elt_class elt with
 
30434
     Float | ConvClass(_, Float) -> true | _ -> false in
 
30435
   let idx =
 
30436
@@ -394,7 +407,10 @@
 
30437
   in match shape with
 
30438
     All (_, Dreg) | By_scalar Dreg | Pair_result Dreg | Unary_scalar Dreg
 
30439
   | Binary_imm Dreg | Long_noreg Dreg | Wide_noreg Dreg ->
 
30440
-      [| V8QI; V4HI; if flt then V2SF else V2SI; DI |].(idx)
 
30441
+      if flt then
 
30442
+        [| V8QI; V4HF; V2SF; DI |].(idx)
 
30443
+      else
 
30444
+        [| V8QI; V4HI; V2SI; DI |].(idx)
 
30445
   | All (_, Qreg) | By_scalar Qreg | Pair_result Qreg | Unary_scalar Qreg
 
30446
   | Binary_imm Qreg | Long_noreg Qreg | Wide_noreg Qreg ->
 
30447
       [| V16QI; V8HI; if flt then V4SF else V4SI; V2DI |].(idx)
 
30448
@@ -404,7 +420,11 @@
 
30449
   | Long_imm ->
 
30450
       [| V8QI; V4HI; V2SI; DI |].(idx)
 
30451
   | Narrow | Narrow_imm -> [| V16QI; V8HI; V4SI; V2DI |].(idx)
 
30452
-  | Use_operands ops -> mode_of_elt elt (All (0, (find_key_operand ops)))
 
30453
+  | Use_operands ops ->
 
30454
+      begin match argpos with
 
30455
+        None -> mode_of_elt ?argpos elt (All (0, (find_key_operand ops)))
 
30456
+      | Some pos -> mode_of_elt ?argpos elt (All (0, ops.(pos)))
 
30457
+      end
 
30458
   | _ -> failwith "invalid shape"
 
30459
 
 
30460
 (* Modify an element type dependent on the shape of the instruction and the
 
30461
@@ -454,10 +474,11 @@
 
30462
         | U16 -> T_uint16x4
 
30463
         | U32 -> T_uint32x2
 
30464
         | U64 -> T_uint64x1
 
30465
+        | F16 -> T_float16x4
 
30466
         | F32 -> T_float32x2
 
30467
         | P8 -> T_poly8x8
 
30468
         | P16 -> T_poly16x4
 
30469
-        | _ -> failwith "Bad elt type"
 
30470
+        | _ -> failwith "Bad elt type for Dreg"
 
30471
         end
 
30472
     | Qreg ->
 
30473
         begin match elt with
 
30474
@@ -472,7 +493,7 @@
 
30475
         | F32 -> T_float32x4
 
30476
         | P8 -> T_poly8x16
 
30477
         | P16 -> T_poly16x8
 
30478
-        | _ -> failwith "Bad elt type"
 
30479
+        | _ -> failwith "Bad elt type for Qreg"
 
30480
         end
 
30481
     | Corereg ->
 
30482
         begin match elt with
 
30483
@@ -487,7 +508,7 @@
 
30484
         | P8 -> T_poly8
 
30485
         | P16 -> T_poly16
 
30486
         | F32 -> T_float32
 
30487
-        | _ -> failwith "Bad elt type"
 
30488
+        | _ -> failwith "Bad elt type for Corereg"
 
30489
         end
 
30490
     | Immed ->
 
30491
         T_immediate (0, 0)
 
30492
@@ -506,7 +527,7 @@
 
30493
 let vectype_size = function
 
30494
     T_int8x8 | T_int16x4 | T_int32x2 | T_int64x1
 
30495
   | T_uint8x8 | T_uint16x4 | T_uint32x2 | T_uint64x1
 
30496
-  | T_float32x2 | T_poly8x8 | T_poly16x4 -> 64
 
30497
+  | T_float32x2 | T_poly8x8 | T_poly16x4 | T_float16x4 -> 64
 
30498
   | T_int8x16 | T_int16x8 | T_int32x4 | T_int64x2
 
30499
   | T_uint8x16 | T_uint16x8  | T_uint32x4  | T_uint64x2
 
30500
   | T_float32x4 | T_poly8x16 | T_poly16x8 -> 128
 
30501
@@ -1217,6 +1238,10 @@
 
30502
       [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)];
 
30503
     Vcvt, [InfoWord], All (2, Qreg), "vcvtQ", conv_1,
 
30504
       [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)];
 
30505
+    Vcvt, [Builtin_name "vcvt" ; Requires_FP_bit 1],
 
30506
+          Use_operands [| Dreg; Qreg; |], "vcvt", conv_1, [Conv (F16, F32)];
 
30507
+    Vcvt, [Builtin_name "vcvt" ; Requires_FP_bit 1],
 
30508
+          Use_operands [| Qreg; Dreg; |], "vcvt", conv_1, [Conv (F32, F16)];
 
30509
     Vcvt_n, [InfoWord], Use_operands [| Dreg; Dreg; Immed |], "vcvt_n", conv_2,
 
30510
       [Conv (S32, F32); Conv (U32, F32); Conv (F32, S32); Conv (F32, U32)];
 
30511
     Vcvt_n, [InfoWord], Use_operands [| Qreg; Qreg; Immed |], "vcvtQ_n", conv_2,
 
30512
@@ -1782,7 +1807,7 @@
 
30513
   | U8 -> "u8" | U16 -> "u16" | U32 -> "u32" | U64 -> "u64"
 
30514
   | I8 -> "i8" | I16 -> "i16" | I32 -> "i32" | I64 -> "i64"
 
30515
   | B8 -> "8" | B16 -> "16" | B32 -> "32" | B64 -> "64"
 
30516
-  | F32 -> "f32" | P8 -> "p8" | P16 -> "p16"
 
30517
+  | F16 -> "f16" | F32 -> "f32" | P8 -> "p8" | P16 -> "p16"
 
30518
   | Conv (a, b) | Cast (a, b) -> string_of_elt a ^ "_" ^ string_of_elt b
 
30519
   | NoElts -> failwith "No elts"
 
30520
 
 
30521
@@ -1809,6 +1834,7 @@
 
30522
   | T_uint32x4 -> affix "uint32x4"
 
30523
   | T_uint64x1 -> affix "uint64x1"
 
30524
   | T_uint64x2 -> affix "uint64x2"
 
30525
+  | T_float16x4 -> affix "float16x4"
 
30526
   | T_float32x2 -> affix "float32x2"
 
30527
   | T_float32x4 -> affix "float32x4"
 
30528
   | T_poly8x8 -> affix "poly8x8"
 
30529
@@ -1825,6 +1851,7 @@
 
30530
   | T_uint64 -> affix "uint64"
 
30531
   | T_poly8 -> affix "poly8"
 
30532
   | T_poly16 -> affix "poly16"
 
30533
+  | T_float16 -> affix "float16"
 
30534
   | T_float32 -> affix "float32"
 
30535
   | T_immediate _ -> "const int"
 
30536
   | T_void -> "void"
 
30537
@@ -1832,6 +1859,7 @@
 
30538
   | T_intHI -> "__builtin_neon_hi"
 
30539
   | T_intSI -> "__builtin_neon_si"
 
30540
   | T_intDI -> "__builtin_neon_di"
 
30541
+  | T_floatHF -> "__builtin_neon_hf"
 
30542
   | T_floatSF -> "__builtin_neon_sf"
 
30543
   | T_arrayof (num, base) ->
 
30544
       let basename = name (fun x -> x) base in
 
30545
@@ -1853,10 +1881,10 @@
 
30546
   | B_XImode -> "__builtin_neon_xi"
 
30547
 
 
30548
 let string_of_mode = function
 
30549
-    V8QI -> "v8qi" | V4HI  -> "v4hi"  | V2SI -> "v2si" | V2SF -> "v2sf"
 
30550
-  | DI   -> "di"   | V16QI -> "v16qi" | V8HI -> "v8hi" | V4SI -> "v4si"
 
30551
-  | V4SF -> "v4sf" | V2DI  -> "v2di"  | QI -> "qi" | HI -> "hi" | SI -> "si"
 
30552
-  | SF -> "sf"
 
30553
+    V8QI -> "v8qi" | V4HI -> "v4hi" | V4HF  -> "v4hf"  | V2SI -> "v2si"
 
30554
+  | V2SF -> "v2sf" | DI   -> "di"   | V16QI -> "v16qi" | V8HI -> "v8hi"
 
30555
+  | V4SI -> "v4si" | V4SF -> "v4sf" | V2DI  -> "v2di"  | QI   -> "qi"
 
30556
+  | HI -> "hi" | SI -> "si" | SF -> "sf"
 
30557
 
 
30558
 (* Use uppercase chars for letters which form part of the intrinsic name, but
 
30559
    should be omitted from the builtin name (the info is passed in an extra
 
30560
--- a/src/gcc/config/arm/constraints.md
 
30561
+++ b/src/gcc/config/arm/constraints.md
 
30562
@@ -21,7 +21,7 @@
 
30563
 ;; The following register constraints have been used:
 
30564
 ;; - in ARM/Thumb-2 state: t, w, x, y, z
 
30565
 ;; - in Thumb state: h, b
 
30566
-;; - in both states: l, c, k
 
30567
+;; - in both states: l, c, k, q, US
 
30568
 ;; In ARM state, 'l' is an alias for 'r'
 
30569
 ;; 'f' and 'v' were previously used for FPA and MAVERICK registers.
 
30570
 
 
30571
@@ -86,6 +86,9 @@
 
30572
 (define_register_constraint "k" "STACK_REG"
 
30573
  "@internal The stack register.")
 
30574
 
 
30575
+(define_register_constraint "q" "(TARGET_ARM && TARGET_LDRD) ? CORE_REGS : GENERAL_REGS"
 
30576
+  "@internal In ARM state with LDRD support, core registers, otherwise general registers.")
 
30577
+
 
30578
 (define_register_constraint "b" "TARGET_THUMB ? BASE_REGS : NO_REGS"
 
30579
  "@internal
 
30580
   Thumb only.  The union of the low registers and the stack register.")
 
30581
@@ -93,6 +96,9 @@
 
30582
 (define_register_constraint "c" "CC_REG"
 
30583
  "@internal The condition code register.")
 
30584
 
 
30585
+(define_register_constraint "Cs" "CALLER_SAVE_REGS"
 
30586
+ "@internal The caller save registers.  Useful for sibcalls.")
 
30587
+
 
30588
 (define_constraint "I"
 
30589
  "In ARM/Thumb-2 state a constant that can be used as an immediate value in a
 
30590
   Data Processing instruction.  In Thumb-1 state a constant in the range
 
30591
@@ -164,9 +170,9 @@
 
30592
                    && ival > 1020 && ival <= 1275")))
 
30593
 
 
30594
 (define_constraint "Pd"
 
30595
-  "@internal In Thumb-1 state a constant in the range 0 to 7"
 
30596
+  "@internal In Thumb state a constant in the range 0 to 7"
 
30597
   (and (match_code "const_int")
 
30598
-       (match_test "TARGET_THUMB1 && ival >= 0 && ival <= 7")))
 
30599
+       (match_test "TARGET_THUMB && ival >= 0 && ival <= 7")))
 
30600
 
 
30601
 (define_constraint "Pe"
 
30602
   "@internal In Thumb-1 state a constant in the range 256 to +510"
 
30603
@@ -208,6 +214,11 @@
 
30604
   (and (match_code "const_int")
 
30605
        (match_test "TARGET_THUMB2 && ival >= 0 && ival <= 255")))
 
30606
 
 
30607
+(define_constraint "Pz"
 
30608
+  "@internal In Thumb-2 state the constant 0"
 
30609
+  (and (match_code "const_int")
 
30610
+       (match_test "TARGET_THUMB2 && (ival == 0)")))
 
30611
+
 
30612
 (define_constraint "G"
 
30613
  "In ARM/Thumb-2 state the floating-point constant 0."
 
30614
  (and (match_code "const_double")
 
30615
@@ -248,6 +259,24 @@
 
30616
  (and (match_code "const_int")
 
30617
       (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, PLUS)")))
 
30618
 
 
30619
+(define_constraint "De"
 
30620
+ "@internal
 
30621
+  In ARM/Thumb-2 state a const_int that can be used by insn anddi."
 
30622
+ (and (match_code "const_int")
 
30623
+      (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, AND)")))
 
30624
+
 
30625
+(define_constraint "Df"
 
30626
+ "@internal
 
30627
+  In ARM/Thumb-2 state a const_int that can be used by insn iordi."
 
30628
+ (and (match_code "const_int")
 
30629
+      (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, IOR)")))
 
30630
+
 
30631
+(define_constraint "Dg"
 
30632
+ "@internal
 
30633
+  In ARM/Thumb-2 state a const_int that can be used by insn xordi."
 
30634
+ (and (match_code "const_int")
 
30635
+      (match_test "TARGET_32BIT && const_ok_for_dimode_op (ival, XOR)")))
 
30636
+
 
30637
 (define_constraint "Di"
 
30638
  "@internal
 
30639
   In ARM/Thumb-2 state a const_int or const_double where both the high
 
30640
@@ -305,6 +334,9 @@
 
30641
   (and (match_code "const_double")
 
30642
        (match_test "TARGET_32BIT && TARGET_VFP && vfp3_const_double_for_fract_bits (op)")))
 
30643
 
 
30644
+(define_register_constraint "Ts" "(arm_restrict_it) ? LO_REGS : GENERAL_REGS"
 
30645
+ "For arm_restrict_it the core registers @code{r0}-@code{r7}.  GENERAL_REGS otherwise.")
 
30646
+
 
30647
 (define_memory_constraint "Ua"
 
30648
  "@internal
 
30649
   An address valid for loading/storing register exclusive"
 
30650
@@ -385,9 +417,16 @@
 
30651
                                                   0)
 
30652
                   && GET_CODE (XEXP (op, 0)) != POST_INC")))
 
30653
 
 
30654
+(define_constraint "US"
 
30655
+ "@internal
 
30656
+  US is a symbol reference."
 
30657
+ (match_code "symbol_ref")
 
30658
+)
 
30659
+
 
30660
 ;; We used to have constraint letters for S and R in ARM state, but
 
30661
 ;; all uses of these now appear to have been removed.
 
30662
 
 
30663
 ;; Additionally, we used to have a Q constraint in Thumb state, but
 
30664
 ;; this wasn't really a valid memory constraint.  Again, all uses of
 
30665
 ;; this now seem to have been removed.
 
30666
+
 
30667
--- a/src/gcc/config/arm/cortex-a7.md
 
30668
+++ b/src/gcc/config/arm/cortex-a7.md
 
30669
@@ -88,9 +88,9 @@
 
30670
 ;; ALU instruction with an immediate operand can dual-issue.
 
30671
 (define_insn_reservation "cortex_a7_alu_imm" 2
 
30672
   (and (eq_attr "tune" "cortexa7")
 
30673
-       (and (ior (eq_attr "type" "simple_alu_imm")
 
30674
-                 (ior (eq_attr "type" "simple_alu_shift")
 
30675
-                      (and (eq_attr "insn" "mov")
 
30676
+       (and (ior (eq_attr "type" "arlo_imm,mov_imm,mvn_imm")
 
30677
+                 (ior (eq_attr "type" "extend")
 
30678
+                      (and (eq_attr "type" "mov_reg,mov_shift,mov_shift_reg")
 
30679
                            (not (eq_attr "length" "8")))))
 
30680
             (eq_attr "neon_type" "none")))
 
30681
   "cortex_a7_ex2|cortex_a7_ex1")
 
30682
@@ -99,13 +99,15 @@
 
30683
 ;; with a younger immediate-based instruction.
 
30684
 (define_insn_reservation "cortex_a7_alu_reg" 2
 
30685
   (and (eq_attr "tune" "cortexa7")
 
30686
-       (and (eq_attr "type" "alu_reg")
 
30687
+       (and (eq_attr "type" "arlo_reg,shift,shift_reg,mov_reg,mvn_reg")
 
30688
             (eq_attr "neon_type" "none")))
 
30689
   "cortex_a7_ex1")
 
30690
 
 
30691
 (define_insn_reservation "cortex_a7_alu_shift" 2
 
30692
   (and (eq_attr "tune" "cortexa7")
 
30693
-       (and (eq_attr "type" "alu_shift,alu_shift_reg")
 
30694
+       (and (eq_attr "type" "arlo_shift,arlo_shift_reg,\
 
30695
+                             mov_shift,mov_shift_reg,\
 
30696
+                             mvn_shift,mvn_shift_reg")
 
30697
             (eq_attr "neon_type" "none")))
 
30698
   "cortex_a7_ex1")
 
30699
 
 
30700
@@ -127,8 +129,9 @@
 
30701
 
 
30702
 (define_insn_reservation "cortex_a7_mul" 2
 
30703
   (and (eq_attr "tune" "cortexa7")
 
30704
-       (and (eq_attr "type" "mult")
 
30705
-            (eq_attr "neon_type" "none")))
 
30706
+       (and (eq_attr "neon_type" "none")
 
30707
+            (ior (eq_attr "mul32" "yes")
 
30708
+                 (eq_attr "mul64" "yes"))))
 
30709
   "cortex_a7_both")
 
30710
 
 
30711
 ;; Forward the result of a multiply operation to the accumulator 
 
30712
@@ -140,7 +143,7 @@
 
30713
 ;; The latency depends on the operands, so we use an estimate here.
 
30714
 (define_insn_reservation "cortex_a7_idiv" 5
 
30715
   (and (eq_attr "tune" "cortexa7")
 
30716
-       (eq_attr "insn" "udiv,sdiv"))
 
30717
+       (eq_attr "type" "udiv,sdiv"))
 
30718
   "cortex_a7_both*5")
 
30719
 
 
30720
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
30721
--- a/src/gcc/config/arm/arm-arches.def
 
30722
+++ b/src/gcc/config/arm/arm-arches.def
 
30723
@@ -53,6 +53,6 @@
 
30724
 ARM_ARCH("armv7-r", cortexr4,  7R,  FL_CO_PROC |             FL_FOR_ARCH7R)
 
30725
 ARM_ARCH("armv7-m", cortexm3,  7M,  FL_CO_PROC |             FL_FOR_ARCH7M)
 
30726
 ARM_ARCH("armv7e-m", cortexm4,  7EM, FL_CO_PROC |            FL_FOR_ARCH7EM)
 
30727
-ARM_ARCH("armv8-a", cortexa15,  8A,  FL_CO_PROC |             FL_FOR_ARCH8A)
 
30728
+ARM_ARCH("armv8-a", cortexa53,  8A,  FL_CO_PROC |             FL_FOR_ARCH8A)
 
30729
 ARM_ARCH("iwmmxt",  iwmmxt,     5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT)
 
30730
 ARM_ARCH("iwmmxt2", iwmmxt2,    5TE, FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2)
 
30731
--- a/src/gcc/config/arm/t-arm
 
30732
+++ b/src/gcc/config/arm/t-arm
 
30733
@@ -39,6 +39,7 @@
 
30734
                $(srcdir)/config/arm/cortex-a8-neon.md \
 
30735
                $(srcdir)/config/arm/cortex-a9.md \
 
30736
                $(srcdir)/config/arm/cortex-a9-neon.md \
 
30737
+               $(srcdir)/config/arm/cortex-a53.md \
 
30738
                $(srcdir)/config/arm/cortex-m4-fpu.md \
 
30739
                $(srcdir)/config/arm/cortex-m4.md \
 
30740
                $(srcdir)/config/arm/cortex-r4f.md \
 
30741
@@ -52,6 +53,7 @@
 
30742
                $(srcdir)/config/arm/iwmmxt.md \
 
30743
                $(srcdir)/config/arm/iwmmxt2.md \
 
30744
                $(srcdir)/config/arm/ldmstm.md \
 
30745
+               $(srcdir)/config/arm/ldrdstrd.md \
 
30746
                $(srcdir)/config/arm/marvell-f-iwmmxt.md \
 
30747
                $(srcdir)/config/arm/neon.md \
 
30748
                $(srcdir)/config/arm/predicates.md \
 
30749
@@ -84,7 +86,8 @@
 
30750
   $(GGC_H) except.h $(C_PRAGMA_H) $(TM_P_H) \
 
30751
   $(TARGET_H) $(TARGET_DEF_H) debug.h langhooks.h $(DF_H) \
 
30752
   intl.h libfuncs.h $(PARAMS_H) $(OPTS_H) $(srcdir)/config/arm/arm-cores.def \
 
30753
-  $(srcdir)/config/arm/arm-arches.def $(srcdir)/config/arm/arm-fpus.def
 
30754
+  $(srcdir)/config/arm/arm-arches.def $(srcdir)/config/arm/arm-fpus.def \
 
30755
+  $(srcdir)/config/arm/arm_neon_builtins.def
 
30756
 
 
30757
 arm-c.o: $(srcdir)/config/arm/arm-c.c $(CONFIG_H) $(SYSTEM_H) \
 
30758
     coretypes.h $(TM_H) $(TREE_H) output.h $(C_COMMON_H)
 
30759
--- a/src/gcc/config/arm/arm.opt
 
30760
+++ b/src/gcc/config/arm/arm.opt
 
30761
@@ -239,6 +239,10 @@
 
30762
 Target Report Var(target_word_relocations) Init(TARGET_DEFAULT_WORD_RELOCATIONS)
 
30763
 Only generate absolute relocations on word sized values.
 
30764
 
 
30765
+mrestrict-it
 
30766
+Target Report Var(arm_restrict_it) Init(2)
 
30767
+Generate IT blocks appropriate for ARMv8.
 
30768
+
 
30769
 mfix-cortex-m3-ldrd
 
30770
 Target Report Var(fix_cm3_ldrd) Init(2)
 
30771
 Avoid overlapping destination and address registers on LDRD instructions
 
30772
@@ -247,3 +251,7 @@
 
30773
 munaligned-access
 
30774
 Target Report Var(unaligned_access) Init(2)
 
30775
 Enable unaligned word and halfword accesses to packed data.
 
30776
+
 
30777
+mneon-for-64bits
 
30778
+Target Report RejectNegative Var(use_neon_for_64bits) Init(0)
 
30779
+Use Neon to perform 64-bits operations rather than core registers.
 
30780
--- a/src/gcc/config/arm/arm926ejs.md
 
30781
+++ b/src/gcc/config/arm/arm926ejs.md
 
30782
@@ -58,7 +58,9 @@
 
30783
 ;; ALU operations with no shifted operand
 
30784
 (define_insn_reservation "9_alu_op" 1 
 
30785
  (and (eq_attr "tune" "arm926ejs")
 
30786
-      (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift"))
 
30787
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,extend,arlo_shift,\
 
30788
+                       mov_imm,mov_reg,mov_shift,\
 
30789
+                       mvn_imm,mvn_reg,mvn_shift"))
 
30790
  "e,m,w")
 
30791
 
 
30792
 ;; ALU operations with a shift-by-register operand
 
30793
@@ -67,7 +69,7 @@
 
30794
 ;; the execute stage.
 
30795
 (define_insn_reservation "9_alu_shift_reg_op" 2 
 
30796
  (and (eq_attr "tune" "arm926ejs")
 
30797
-      (eq_attr "type" "alu_shift_reg"))
 
30798
+      (eq_attr "type" "arlo_shift_reg,mov_shift_reg,mvn_shift_reg"))
 
30799
  "e*2,m,w")
 
30800
 
 
30801
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
30802
@@ -81,32 +83,32 @@
 
30803
 
 
30804
 (define_insn_reservation "9_mult1" 3
 
30805
  (and (eq_attr "tune" "arm926ejs")
 
30806
-      (eq_attr "insn" "smlalxy,mul,mla"))
 
30807
+      (eq_attr "type" "smlalxy,mul,mla"))
 
30808
  "e*2,m,w")
 
30809
 
 
30810
 (define_insn_reservation "9_mult2" 4
 
30811
  (and (eq_attr "tune" "arm926ejs")
 
30812
-      (eq_attr "insn" "muls,mlas"))
 
30813
+      (eq_attr "type" "muls,mlas"))
 
30814
  "e*3,m,w")
 
30815
 
 
30816
 (define_insn_reservation "9_mult3" 4
 
30817
  (and (eq_attr "tune" "arm926ejs")
 
30818
-      (eq_attr "insn" "umull,umlal,smull,smlal"))
 
30819
+      (eq_attr "type" "umull,umlal,smull,smlal"))
 
30820
  "e*3,m,w")
 
30821
 
 
30822
 (define_insn_reservation "9_mult4" 5
 
30823
  (and (eq_attr "tune" "arm926ejs")
 
30824
-      (eq_attr "insn" "umulls,umlals,smulls,smlals"))
 
30825
+      (eq_attr "type" "umulls,umlals,smulls,smlals"))
 
30826
  "e*4,m,w")
 
30827
 
 
30828
 (define_insn_reservation "9_mult5" 2
 
30829
  (and (eq_attr "tune" "arm926ejs")
 
30830
-      (eq_attr "insn" "smulxy,smlaxy,smlawx"))
 
30831
+      (eq_attr "type" "smulxy,smlaxy,smlawx"))
 
30832
  "e,m,w")
 
30833
 
 
30834
 (define_insn_reservation "9_mult6" 3
 
30835
  (and (eq_attr "tune" "arm926ejs")
 
30836
-      (eq_attr "insn" "smlalxy"))
 
30837
+      (eq_attr "type" "smlalxy"))
 
30838
  "e*2,m,w")
 
30839
 
 
30840
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
30841
--- a/src/gcc/config/arm/ldrdstrd.md
 
30842
+++ b/src/gcc/config/arm/ldrdstrd.md
 
30843
@@ -0,0 +1,260 @@
 
30844
+;; ARM ldrd/strd peephole optimizations.
 
30845
+;;
 
30846
+;; Copyright (C) 2013 Free Software Foundation, Inc.
 
30847
+;;
 
30848
+;; Written by Greta Yorsh <greta.yorsh@arm.com>
 
30849
+
 
30850
+;; This file is part of GCC.
 
30851
+;;
 
30852
+;; GCC is free software; you can redistribute it and/or modify it
 
30853
+;; under the terms of the GNU General Public License as published by
 
30854
+;; the Free Software Foundation; either version 3, or (at your option)
 
30855
+;; any later version.
 
30856
+;;
 
30857
+;; GCC is distributed in the hope that it will be useful, but
 
30858
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
 
30859
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
30860
+;; General Public License for more details.
 
30861
+;;
 
30862
+;; You should have received a copy of the GNU General Public License
 
30863
+;; along with GCC; see the file COPYING3.  If not see
 
30864
+;; <http://www.gnu.org/licenses/>.
 
30865
+
 
30866
+;; The following peephole optimizations identify consecutive memory
 
30867
+;; accesses, and try to rearrange the operands to enable generation of
 
30868
+;; ldrd/strd.
 
30869
+
 
30870
+(define_peephole2 ; ldrd
 
30871
+  [(set (match_operand:SI 0 "arm_general_register_operand" "")
 
30872
+        (match_operand:SI 2 "memory_operand" ""))
 
30873
+   (set (match_operand:SI 1 "arm_general_register_operand" "")
 
30874
+        (match_operand:SI 3 "memory_operand" ""))]
 
30875
+  "TARGET_LDRD
 
30876
+     && current_tune->prefer_ldrd_strd
 
30877
+     && !optimize_function_for_size_p (cfun)"
 
30878
+  [(const_int 0)]
 
30879
+{
 
30880
+  if (!gen_operands_ldrd_strd (operands, true, false, false))
 
30881
+    FAIL;
 
30882
+  else if (TARGET_ARM)
 
30883
+  {
 
30884
+    /* In ARM state, the destination registers of LDRD/STRD must be
 
30885
+       consecutive. We emit DImode access.  */
 
30886
+    operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
 
30887
+    operands[2] = adjust_address (operands[2], DImode, 0);
 
30888
+    /* Emit [(set (match_dup 0) (match_dup 2))] */
 
30889
+    emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[2]));
 
30890
+    DONE;
 
30891
+  }
 
30892
+  else if (TARGET_THUMB2)
 
30893
+  {
 
30894
+    /* Emit the pattern:
 
30895
+       [(parallel [(set (match_dup 0) (match_dup 2))
 
30896
+                   (set (match_dup 1) (match_dup 3))])] */
 
30897
+    rtx t1 = gen_rtx_SET (VOIDmode, operands[0], operands[2]);
 
30898
+    rtx t2 = gen_rtx_SET (VOIDmode, operands[1], operands[3]);
 
30899
+    emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2)));
 
30900
+    DONE;
 
30901
+  }
 
30902
+})
 
30903
+
 
30904
+(define_peephole2 ; strd
 
30905
+  [(set (match_operand:SI 2 "memory_operand" "")
 
30906
+       (match_operand:SI 0 "arm_general_register_operand" ""))
 
30907
+   (set (match_operand:SI 3 "memory_operand" "")
 
30908
+       (match_operand:SI 1 "arm_general_register_operand" ""))]
 
30909
+  "TARGET_LDRD
 
30910
+     && current_tune->prefer_ldrd_strd
 
30911
+     && !optimize_function_for_size_p (cfun)"
 
30912
+  [(const_int 0)]
 
30913
+{
 
30914
+  if (!gen_operands_ldrd_strd (operands, false, false, false))
 
30915
+    FAIL;
 
30916
+  else if (TARGET_ARM)
 
30917
+  {
 
30918
+    /* In ARM state, the destination registers of LDRD/STRD must be
 
30919
+       consecutive. We emit DImode access.  */
 
30920
+    operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
 
30921
+    operands[2] = adjust_address (operands[2], DImode, 0);
 
30922
+    /* Emit [(set (match_dup 2) (match_dup 0))]  */
 
30923
+    emit_insn (gen_rtx_SET (VOIDmode, operands[2], operands[0]));
 
30924
+    DONE;
 
30925
+  }
 
30926
+  else if (TARGET_THUMB2)
 
30927
+  {
 
30928
+    /* Emit the pattern:
 
30929
+       [(parallel [(set (match_dup 2) (match_dup 0))
 
30930
+                   (set (match_dup 3) (match_dup 1))])]  */
 
30931
+    rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]);
 
30932
+    rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]);
 
30933
+    emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2)));
 
30934
+    DONE;
 
30935
+  }
 
30936
+})
 
30937
+
 
30938
+;; The following peepholes reorder registers to enable LDRD/STRD.
 
30939
+(define_peephole2 ; strd of constants
 
30940
+  [(set (match_operand:SI 0 "arm_general_register_operand" "")
 
30941
+        (match_operand:SI 4 "const_int_operand" ""))
 
30942
+   (set (match_operand:SI 2 "memory_operand" "")
 
30943
+        (match_dup 0))
 
30944
+   (set (match_operand:SI 1 "arm_general_register_operand" "")
 
30945
+        (match_operand:SI 5 "const_int_operand" ""))
 
30946
+   (set (match_operand:SI 3 "memory_operand" "")
 
30947
+        (match_dup 1))]
 
30948
+ "TARGET_LDRD
 
30949
+  && current_tune->prefer_ldrd_strd
 
30950
+  && !optimize_function_for_size_p (cfun)"
 
30951
+  [(const_int 0)]
 
30952
+{
 
30953
+  if (!gen_operands_ldrd_strd (operands, false, true, false))
 
30954
+    FAIL;
 
30955
+  else if (TARGET_ARM)
 
30956
+  {
 
30957
+   rtx tmp = gen_rtx_REG (DImode, REGNO (operands[0]));
 
30958
+   operands[2] = adjust_address (operands[2], DImode, 0);
 
30959
+   /* Emit the pattern:
 
30960
+      [(set (match_dup 0) (match_dup 4))
 
30961
+      (set (match_dup 1) (match_dup 5))
 
30962
+      (set (match_dup 2) tmp)]  */
 
30963
+   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4]));
 
30964
+   emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5]));
 
30965
+   emit_insn (gen_rtx_SET (VOIDmode, operands[2], tmp));
 
30966
+   DONE;
 
30967
+  }
 
30968
+  else if (TARGET_THUMB2)
 
30969
+  {
 
30970
+    /* Emit the pattern:
 
30971
+       [(set (match_dup 0) (match_dup 4))
 
30972
+        (set (match_dup 1) (match_dup 5))
 
30973
+        (parallel [(set (match_dup 2) (match_dup 0))
 
30974
+                   (set (match_dup 3) (match_dup 1))])]  */
 
30975
+    emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4]));
 
30976
+    emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5]));
 
30977
+    rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]);
 
30978
+    rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]);
 
30979
+    emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2)));
 
30980
+    DONE;
 
30981
+  }
 
30982
+})
 
30983
+
 
30984
+(define_peephole2 ; strd of constants
 
30985
+  [(set (match_operand:SI 0 "arm_general_register_operand" "")
 
30986
+        (match_operand:SI 4 "const_int_operand" ""))
 
30987
+   (set (match_operand:SI 1 "arm_general_register_operand" "")
 
30988
+        (match_operand:SI 5 "const_int_operand" ""))
 
30989
+   (set (match_operand:SI 2 "memory_operand" "")
 
30990
+        (match_dup 0))
 
30991
+   (set (match_operand:SI 3 "memory_operand" "")
 
30992
+        (match_dup 1))]
 
30993
+ "TARGET_LDRD
 
30994
+  && current_tune->prefer_ldrd_strd
 
30995
+  && !optimize_function_for_size_p (cfun)"
 
30996
+   [(const_int 0)]
 
30997
+{
 
30998
+  if (!gen_operands_ldrd_strd (operands, false, true, false))
 
30999
+     FAIL;
 
31000
+  else if (TARGET_ARM)
 
31001
+  {
 
31002
+   rtx tmp = gen_rtx_REG (DImode, REGNO (operands[0]));
 
31003
+   operands[2] = adjust_address (operands[2], DImode, 0);
 
31004
+   /* Emit the pattern
 
31005
+      [(set (match_dup 0) (match_dup 4))
 
31006
+       (set (match_dup 1) (match_dup 5))
 
31007
+       (set (match_dup 2) tmp)]  */
 
31008
+   emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4]));
 
31009
+   emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5]));
 
31010
+   emit_insn (gen_rtx_SET (VOIDmode, operands[2], tmp));
 
31011
+   DONE;
 
31012
+  }
 
31013
+  else if (TARGET_THUMB2)
 
31014
+  {
 
31015
+    /*  Emit the pattern:
 
31016
+        [(set (match_dup 0) (match_dup 4))
 
31017
+         (set (match_dup 1) (match_dup 5))
 
31018
+         (parallel [(set (match_dup 2) (match_dup 0))
 
31019
+                    (set (match_dup 3) (match_dup 1))])]  */
 
31020
+    emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[4]));
 
31021
+    emit_insn (gen_rtx_SET (VOIDmode, operands[1], operands[5]));
 
31022
+    rtx t1 = gen_rtx_SET (VOIDmode, operands[2], operands[0]);
 
31023
+    rtx t2 = gen_rtx_SET (VOIDmode, operands[3], operands[1]);
 
31024
+    emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, t1, t2)));
 
31025
+    DONE;
 
31026
+  }
 
31027
+})
 
31028
+
 
31029
+;; The following two peephole optimizations are only relevant for ARM
 
31030
+;; mode where LDRD/STRD require consecutive registers.
 
31031
+
 
31032
+(define_peephole2 ; swap the destination registers of two loads
 
31033
+                 ; before a commutative operation.
 
31034
+  [(set (match_operand:SI 0 "arm_general_register_operand" "")
 
31035
+        (match_operand:SI 2 "memory_operand" ""))
 
31036
+   (set (match_operand:SI 1 "arm_general_register_operand" "")
 
31037
+        (match_operand:SI 3 "memory_operand" ""))
 
31038
+   (set (match_operand:SI 4 "arm_general_register_operand" "")
 
31039
+        (match_operator:SI 5 "commutative_binary_operator"
 
31040
+                          [(match_operand 6 "arm_general_register_operand" "")
 
31041
+                           (match_operand 7 "arm_general_register_operand" "") ]))]
 
31042
+  "TARGET_LDRD && TARGET_ARM
 
31043
+   && current_tune->prefer_ldrd_strd
 
31044
+   && !optimize_function_for_size_p (cfun)
 
31045
+   && (  ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7])))
 
31046
+        ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6]))))
 
31047
+   && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4]))
 
31048
+   && (peep2_reg_dead_p (3, operands[1]) || rtx_equal_p (operands[1], operands[4]))"
 
31049
+  [(set (match_dup 0) (match_dup 2))
 
31050
+   (set (match_dup 4) (match_op_dup 5 [(match_dup 6) (match_dup 7)]))]
 
31051
+  {
 
31052
+    if (!gen_operands_ldrd_strd (operands, true, false, true))
 
31053
+     {
 
31054
+        FAIL;
 
31055
+     }
 
31056
+    else
 
31057
+     {
 
31058
+        operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
 
31059
+        operands[2] = adjust_address (operands[2], DImode, 0);
 
31060
+     }
 
31061
+   }
 
31062
+)
 
31063
+
 
31064
+(define_peephole2 ; swap the destination registers of two loads
 
31065
+                 ; before a commutative operation that sets the flags.
 
31066
+  [(set (match_operand:SI 0 "arm_general_register_operand" "")
 
31067
+        (match_operand:SI 2 "memory_operand" ""))
 
31068
+   (set (match_operand:SI 1 "arm_general_register_operand" "")
 
31069
+        (match_operand:SI 3 "memory_operand" ""))
 
31070
+   (parallel
 
31071
+      [(set (match_operand:SI 4 "arm_general_register_operand" "")
 
31072
+           (match_operator:SI 5 "commutative_binary_operator"
 
31073
+                              [(match_operand 6 "arm_general_register_operand" "")
 
31074
+                               (match_operand 7 "arm_general_register_operand" "") ]))
 
31075
+       (clobber (reg:CC CC_REGNUM))])]
 
31076
+  "TARGET_LDRD && TARGET_ARM
 
31077
+   && current_tune->prefer_ldrd_strd
 
31078
+   && !optimize_function_for_size_p (cfun)
 
31079
+   && (  ((rtx_equal_p(operands[0], operands[6])) && (rtx_equal_p(operands[1], operands[7])))
 
31080
+       ||((rtx_equal_p(operands[0], operands[7])) && (rtx_equal_p(operands[1], operands[6]))))
 
31081
+   && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4]))
 
31082
+   && (peep2_reg_dead_p (3, operands[1]) || rtx_equal_p (operands[1], operands[4]))"
 
31083
+  [(set (match_dup 0) (match_dup 2))
 
31084
+   (parallel
 
31085
+      [(set (match_dup 4)
 
31086
+           (match_op_dup 5 [(match_dup 6) (match_dup 7)]))
 
31087
+       (clobber (reg:CC CC_REGNUM))])]
 
31088
+  {
 
31089
+    if (!gen_operands_ldrd_strd (operands, true, false, true))
 
31090
+     {
 
31091
+        FAIL;
 
31092
+     }
 
31093
+    else
 
31094
+     {
 
31095
+        operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
 
31096
+        operands[2] = adjust_address (operands[2], DImode, 0);
 
31097
+     }
 
31098
+   }
 
31099
+)
 
31100
+
 
31101
+;; TODO: Handle LDRD/STRD with writeback:
 
31102
+;; (a) memory operands can be POST_INC, POST_DEC, PRE_MODIFY, POST_MODIFY
 
31103
+;; (b) Patterns may be followed by an update of the base address.
 
31104
--- a/src/gcc/config/arm/predicates.md
 
31105
+++ b/src/gcc/config/arm/predicates.md
 
31106
@@ -31,6 +31,28 @@
 
31107
              || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
 
31108
 })
 
31109
 
 
31110
+(define_predicate "imm_for_neon_inv_logic_operand"
 
31111
+  (match_code "const_vector")
 
31112
+{
 
31113
+  return (TARGET_NEON
 
31114
+          && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL));
 
31115
+})
 
31116
+
 
31117
+(define_predicate "neon_inv_logic_op2"
 
31118
+  (ior (match_operand 0 "imm_for_neon_inv_logic_operand")
 
31119
+       (match_operand 0 "s_register_operand")))
 
31120
+
 
31121
+(define_predicate "imm_for_neon_logic_operand"
 
31122
+  (match_code "const_vector")
 
31123
+{
 
31124
+  return (TARGET_NEON
 
31125
+          && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL));
 
31126
+})
 
31127
+
 
31128
+(define_predicate "neon_logic_op2"
 
31129
+  (ior (match_operand 0 "imm_for_neon_logic_operand")
 
31130
+       (match_operand 0 "s_register_operand")))
 
31131
+
 
31132
 ;; Any hard register.
 
31133
 (define_predicate "arm_hard_register_operand"
 
31134
   (match_code "reg")
 
31135
@@ -145,6 +167,23 @@
 
31136
   (ior (match_operand 0 "arm_rhs_operand")
 
31137
        (match_operand 0 "arm_neg_immediate_operand")))
 
31138
 
 
31139
+(define_predicate "arm_anddi_operand_neon"
 
31140
+  (ior (match_operand 0 "s_register_operand")
 
31141
+       (and (match_code "const_int")
 
31142
+           (match_test "const_ok_for_dimode_op (INTVAL (op), AND)"))
 
31143
+       (match_operand 0 "neon_inv_logic_op2")))
 
31144
+
 
31145
+(define_predicate "arm_iordi_operand_neon"
 
31146
+  (ior (match_operand 0 "s_register_operand")
 
31147
+       (and (match_code "const_int")
 
31148
+           (match_test "const_ok_for_dimode_op (INTVAL (op), IOR)"))
 
31149
+       (match_operand 0 "neon_logic_op2")))
 
31150
+
 
31151
+(define_predicate "arm_xordi_operand"
 
31152
+  (ior (match_operand 0 "s_register_operand")
 
31153
+       (and (match_code "const_int")
 
31154
+           (match_test "const_ok_for_dimode_op (INTVAL (op), XOR)"))))
 
31155
+
 
31156
 (define_predicate "arm_adddi_operand"
 
31157
   (ior (match_operand 0 "s_register_operand")
 
31158
        (and (match_code "const_int")
 
31159
@@ -207,6 +246,10 @@
 
31160
   (and (match_code "plus,minus,ior,xor,and")
 
31161
        (match_test "mode == GET_MODE (op)")))
 
31162
 
 
31163
+(define_special_predicate "shiftable_operator_strict_it"
 
31164
+  (and (match_code "plus,and")
 
31165
+       (match_test "mode == GET_MODE (op)")))
 
31166
+
 
31167
 ;; True for logical binary operators.
 
31168
 (define_special_predicate "logical_binary_operator"
 
31169
   (and (match_code "ior,xor,and")
 
31170
@@ -270,6 +313,24 @@
 
31171
 (define_special_predicate "lt_ge_comparison_operator"
 
31172
   (match_code "lt,ge"))
 
31173
 
 
31174
+;; The vsel instruction only accepts the ARM condition codes listed below.
 
31175
+(define_special_predicate "arm_vsel_comparison_operator"
 
31176
+  (and (match_operand 0 "expandable_comparison_operator")
 
31177
+       (match_test "maybe_get_arm_condition_code (op) == ARM_GE
 
31178
+                    || maybe_get_arm_condition_code (op) == ARM_GT
 
31179
+                    || maybe_get_arm_condition_code (op) == ARM_EQ
 
31180
+                    || maybe_get_arm_condition_code (op) == ARM_VS
 
31181
+                    || maybe_get_arm_condition_code (op) == ARM_LT
 
31182
+                    || maybe_get_arm_condition_code (op) == ARM_LE
 
31183
+                    || maybe_get_arm_condition_code (op) == ARM_NE
 
31184
+                    || maybe_get_arm_condition_code (op) == ARM_VC")))
 
31185
+
 
31186
+(define_special_predicate "arm_cond_move_operator"
 
31187
+  (if_then_else (match_test "arm_restrict_it")
 
31188
+                (and (match_test "TARGET_FPU_ARMV8")
 
31189
+                     (match_operand 0 "arm_vsel_comparison_operator"))
 
31190
+                (match_operand 0 "expandable_comparison_operator")))
 
31191
+
 
31192
 (define_special_predicate "noov_comparison_operator"
 
31193
   (match_code "lt,ge,eq,ne"))
 
31194
 
 
31195
@@ -506,28 +567,6 @@
 
31196
   (ior (match_operand 0 "s_register_operand")
 
31197
        (match_operand 0 "imm_for_neon_rshift_operand")))
 
31198
 
 
31199
-(define_predicate "imm_for_neon_logic_operand"
 
31200
-  (match_code "const_vector")
 
31201
-{
 
31202
-  return (TARGET_NEON
 
31203
-          && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL));
 
31204
-})
 
31205
-
 
31206
-(define_predicate "imm_for_neon_inv_logic_operand"
 
31207
-  (match_code "const_vector")
 
31208
-{
 
31209
-  return (TARGET_NEON
 
31210
-          && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL));
 
31211
-})
 
31212
-
 
31213
-(define_predicate "neon_logic_op2"
 
31214
-  (ior (match_operand 0 "imm_for_neon_logic_operand")
 
31215
-       (match_operand 0 "s_register_operand")))
 
31216
-
 
31217
-(define_predicate "neon_inv_logic_op2"
 
31218
-  (ior (match_operand 0 "imm_for_neon_inv_logic_operand")
 
31219
-       (match_operand 0 "s_register_operand")))
 
31220
-
 
31221
 ;; Predicates for named expanders that overlap multiple ISAs.
 
31222
 
 
31223
 (define_predicate "cmpdi_operand"
 
31224
@@ -617,3 +656,7 @@
 
31225
 (define_predicate "mem_noofs_operand"
 
31226
   (and (match_code "mem")
 
31227
        (match_code "reg" "0")))
 
31228
+
 
31229
+(define_predicate "call_insn_operand"
 
31230
+  (ior (match_code "symbol_ref")
 
31231
+       (match_operand 0 "s_register_operand")))
 
31232
--- a/src/gcc/config/arm/arm_neon.h
 
31233
+++ b/src/gcc/config/arm/arm_neon.h
 
31234
@@ -43,6 +43,7 @@
 
31235
 typedef __builtin_neon_si int32x2_t    __attribute__ ((__vector_size__ (8)));
 
31236
 typedef __builtin_neon_di int64x1_t;
 
31237
 typedef __builtin_neon_sf float32x2_t  __attribute__ ((__vector_size__ (8)));
 
31238
+typedef __builtin_neon_hf float16x4_t  __attribute__ ((__vector_size__ (8)));
 
31239
 typedef __builtin_neon_poly8 poly8x8_t __attribute__ ((__vector_size__ (8)));
 
31240
 typedef __builtin_neon_poly16 poly16x4_t       __attribute__ ((__vector_size__ (8)));
 
31241
 typedef __builtin_neon_uqi uint8x8_t   __attribute__ ((__vector_size__ (8)));
 
31242
@@ -6016,6 +6017,22 @@
 
31243
   return (uint32x4_t)__builtin_neon_vcvtv4sf (__a, 0);
 
31244
 }
 
31245
 
 
31246
+#if ((__ARM_FP & 0x2) != 0)
 
31247
+__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
 
31248
+vcvt_f16_f32 (float32x4_t __a)
 
31249
+{
 
31250
+  return (float16x4_t)__builtin_neon_vcvtv4hfv4sf (__a);
 
31251
+}
 
31252
+
 
31253
+#endif
 
31254
+#if ((__ARM_FP & 0x2) != 0)
 
31255
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
 
31256
+vcvt_f32_f16 (float16x4_t __a)
 
31257
+{
 
31258
+  return (float32x4_t)__builtin_neon_vcvtv4sfv4hf (__a);
 
31259
+}
 
31260
+
 
31261
+#endif
 
31262
 __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
 
31263
 vcvt_n_s32_f32 (float32x2_t __a, const int __b)
 
31264
 {
 
31265
--- a/src/gcc/config/arm/arm-ldmstm.ml
 
31266
+++ b/src/gcc/config/arm/arm-ldmstm.ml
 
31267
@@ -146,12 +146,15 @@
 
31268
   | IA, true, true -> true
 
31269
   | _ -> false
 
31270
 
 
31271
+exception InvalidAddrMode of string;;
 
31272
+
 
31273
 let target addrmode thumb =
 
31274
   match addrmode, thumb with
 
31275
     IA, true -> "TARGET_THUMB1"
 
31276
   | IA, false -> "TARGET_32BIT"
 
31277
   | DB, false -> "TARGET_32BIT"
 
31278
   | _, false -> "TARGET_ARM"
 
31279
+  | _, _ -> raise (InvalidAddrMode "ERROR: Invalid Addressing mode for Thumb1.")
 
31280
 
 
31281
 let write_pattern_1 name ls addrmode nregs write_set_fn update thumb =
 
31282
   let astr = string_of_addrmode addrmode in
 
31283
@@ -181,8 +184,10 @@
 
31284
   done;
 
31285
   Printf.printf "}\"\n";
 
31286
   Printf.printf "  [(set_attr \"type\" \"%s%d\")" ls nregs;
 
31287
-  begin if not thumb then
 
31288
+  if not thumb then begin
 
31289
     Printf.printf "\n   (set_attr \"predicable\" \"yes\")";
 
31290
+    if addrmode == IA || addrmode == DB then
 
31291
+      Printf.printf "\n   (set_attr \"predicable_short_it\" \"no\")";
 
31292
   end;
 
31293
   Printf.printf "])\n\n"
 
31294
 
 
31295
--- a/src/gcc/config/arm/iwmmxt.md
 
31296
+++ b/src/gcc/config/arm/iwmmxt.md
 
31297
@@ -33,7 +33,7 @@
 
31298
   "TARGET_REALLY_IWMMXT"
 
31299
   "tbcstb%?\\t%0, %1"
 
31300
   [(set_attr "predicable" "yes")
 
31301
-   (set_attr "wtype" "tbcst")]
 
31302
+   (set_attr "type" "wmmx_tbcst")]
 
31303
 )
 
31304
 
 
31305
 (define_insn "tbcstv4hi"
 
31306
@@ -42,7 +42,7 @@
 
31307
   "TARGET_REALLY_IWMMXT"
 
31308
   "tbcsth%?\\t%0, %1"
 
31309
   [(set_attr "predicable" "yes")
 
31310
-   (set_attr "wtype" "tbcst")]
 
31311
+   (set_attr "type" "wmmx_tbcst")]
 
31312
 )
 
31313
 
 
31314
 (define_insn "tbcstv2si"
 
31315
@@ -51,7 +51,7 @@
 
31316
   "TARGET_REALLY_IWMMXT"
 
31317
   "tbcstw%?\\t%0, %1"
 
31318
   [(set_attr "predicable" "yes")
 
31319
-   (set_attr "wtype" "tbcst")]
 
31320
+   (set_attr "type" "wmmx_tbcst")]
 
31321
 )
 
31322
 
 
31323
 (define_insn "iwmmxt_iordi3"
 
31324
@@ -65,7 +65,7 @@
 
31325
    #"
 
31326
   [(set_attr "predicable" "yes")
 
31327
    (set_attr "length" "4,8,8")
 
31328
-   (set_attr "wtype" "wor,none,none")]
 
31329
+   (set_attr "type" "wmmx_wor,*,*")]
 
31330
 )
 
31331
 
 
31332
 (define_insn "iwmmxt_xordi3"
 
31333
@@ -79,7 +79,7 @@
 
31334
    #"
 
31335
   [(set_attr "predicable" "yes")
 
31336
    (set_attr "length" "4,8,8")
 
31337
-   (set_attr "wtype" "wxor,none,none")]
 
31338
+   (set_attr "type" "wmmx_wxor,*,*")]
 
31339
 )
 
31340
 
 
31341
 (define_insn "iwmmxt_anddi3"
 
31342
@@ -93,7 +93,7 @@
 
31343
    #"
 
31344
   [(set_attr "predicable" "yes")
 
31345
    (set_attr "length" "4,8,8")
 
31346
-   (set_attr "wtype" "wand,none,none")]
 
31347
+   (set_attr "type" "wmmx_wand,*,*")]
 
31348
 )
 
31349
 
 
31350
 (define_insn "iwmmxt_nanddi3"
 
31351
@@ -103,7 +103,7 @@
 
31352
   "TARGET_REALLY_IWMMXT"
 
31353
   "wandn%?\\t%0, %1, %2"
 
31354
   [(set_attr "predicable" "yes")
 
31355
-   (set_attr "wtype" "wandn")]
 
31356
+   (set_attr "type" "wmmx_wandn")]
 
31357
 )
 
31358
 
 
31359
 (define_insn "*iwmmxt_arm_movdi"
 
31360
@@ -155,10 +155,9 @@
 
31361
                                  (const_int 8)
 
31362
                                  (const_int 4))]
 
31363
                               (const_int 4)))
 
31364
-   (set_attr "type" "*,*,*,load2,store2,*,*,*,*,*,r_2_f,f_2_r,ffarithd,f_loadd,f_stored")
 
31365
+   (set_attr "type" "*,*,*,load2,store2,wmmx_wmov,wmmx_tmcrr,wmmx_tmrrc,wmmx_wldr,wmmx_wstr,r_2_f,f_2_r,ffarithd,f_loadd,f_stored")
 
31366
    (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,*,*,*,*,*,*,1020,*")
 
31367
-   (set_attr "arm_neg_pool_range" "*,*,*,1008,*,*,*,*,*,*,*,*,*,1008,*")
 
31368
-   (set_attr "wtype" "*,*,*,*,*,wmov,tmcrr,tmrrc,wldr,wstr,*,*,*,*,*")]
 
31369
+   (set_attr "arm_neg_pool_range" "*,*,*,1008,*,*,*,*,*,*,*,*,*,1008,*")]
 
31370
 )
 
31371
 
 
31372
 (define_insn "*iwmmxt_movsi_insn"
 
31373
@@ -188,7 +187,7 @@
 
31374
      default:
 
31375
        gcc_unreachable ();
 
31376
      }"
 
31377
-  [(set_attr "type"           "*,*,*,*,load1,store1,*,*,*,*,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
31378
+  [(set_attr "type"           "*,*,*,*,load1,store1,wmmx_tmcr,wmmx_tmrc,wmmx_wldr,wmmx_wstr,r_2_f,f_2_r,fcpys,f_loads,f_stores")
 
31379
    (set_attr "length"         "*,*,*,*,*,        *,*,*,  16,     *,*,*,*,*,*")
 
31380
    (set_attr "pool_range"     "*,*,*,*,4096,     *,*,*,1024,     *,*,*,*,1020,*")
 
31381
    (set_attr "neg_pool_range" "*,*,*,*,4084,     *,*,*,   *,  1012,*,*,*,1008,*")
 
31382
@@ -200,8 +199,7 @@
 
31383
    ;; Also - we have to pretend that these insns clobber the condition code
 
31384
    ;; bits as otherwise arm_final_prescan_insn() will try to conditionalize
 
31385
    ;; them.
 
31386
-   (set_attr "conds" "clob")
 
31387
-   (set_attr "wtype" "*,*,*,*,*,*,tmcr,tmrc,wldr,wstr,*,*,*,*,*")]
 
31388
+   (set_attr "conds" "clob")]
 
31389
 )
 
31390
 
 
31391
 ;; Because iwmmxt_movsi_insn is not predicable, we provide the
 
31392
@@ -249,10 +247,9 @@
 
31393
    }"
 
31394
   [(set_attr "predicable" "yes")
 
31395
    (set_attr "length"         "4,     4,   4,4,4,8,   8,8")
 
31396
-   (set_attr "type"           "*,*,*,*,*,*,load1,store1")
 
31397
+   (set_attr "type"           "wmmx_wmov,wmmx_wstr,wmmx_wldr,wmmx_tmrrc,wmmx_tmcrr,*,load1,store1")
 
31398
    (set_attr "pool_range"     "*,     *, 256,*,*,*, 256,*")
 
31399
-   (set_attr "neg_pool_range" "*,     *, 244,*,*,*, 244,*")
 
31400
-   (set_attr "wtype"          "wmov,wstr,wldr,tmrrc,tmcrr,*,*,*")]
 
31401
+   (set_attr "neg_pool_range" "*,     *, 244,*,*,*, 244,*")]
 
31402
 )
 
31403
 
 
31404
 (define_expand "iwmmxt_setwcgr0"
 
31405
@@ -318,7 +315,7 @@
 
31406
   "TARGET_REALLY_IWMMXT"
 
31407
   "wand\\t%0, %1, %2"
 
31408
   [(set_attr "predicable" "yes")
 
31409
-   (set_attr "wtype" "wand")]
 
31410
+   (set_attr "type" "wmmx_wand")]
 
31411
 )
 
31412
 
 
31413
 (define_insn "*ior<mode>3_iwmmxt"
 
31414
@@ -328,7 +325,7 @@
 
31415
   "TARGET_REALLY_IWMMXT"
 
31416
   "wor\\t%0, %1, %2"
 
31417
   [(set_attr "predicable" "yes")
 
31418
-   (set_attr "wtype" "wor")]
 
31419
+   (set_attr "type" "wmmx_wor")]
 
31420
 )
 
31421
 
 
31422
 (define_insn "*xor<mode>3_iwmmxt"
 
31423
@@ -338,7 +335,7 @@
 
31424
   "TARGET_REALLY_IWMMXT"
 
31425
   "wxor\\t%0, %1, %2"
 
31426
   [(set_attr "predicable" "yes")
 
31427
-   (set_attr "wtype" "wxor")]
 
31428
+   (set_attr "type" "wmmx_wxor")]
 
31429
 )
 
31430
 
 
31431
 
 
31432
@@ -351,7 +348,7 @@
 
31433
   "TARGET_REALLY_IWMMXT"
 
31434
   "wadd<MMX_char>%?\\t%0, %1, %2"
 
31435
   [(set_attr "predicable" "yes")
 
31436
-   (set_attr "wtype" "wadd")]
 
31437
+   (set_attr "type" "wmmx_wadd")]
 
31438
 )
 
31439
 
 
31440
 (define_insn "ssaddv8qi3"
 
31441
@@ -361,7 +358,7 @@
 
31442
   "TARGET_REALLY_IWMMXT"
 
31443
   "waddbss%?\\t%0, %1, %2"
 
31444
   [(set_attr "predicable" "yes")
 
31445
-   (set_attr "wtype" "wadd")]
 
31446
+   (set_attr "type" "wmmx_wadd")]
 
31447
 )
 
31448
 
 
31449
 (define_insn "ssaddv4hi3"
 
31450
@@ -371,7 +368,7 @@
 
31451
   "TARGET_REALLY_IWMMXT"
 
31452
   "waddhss%?\\t%0, %1, %2"
 
31453
   [(set_attr "predicable" "yes")
 
31454
-   (set_attr "wtype" "wadd")]
 
31455
+   (set_attr "type" "wmmx_wadd")]
 
31456
 )
 
31457
 
 
31458
 (define_insn "ssaddv2si3"
 
31459
@@ -381,7 +378,7 @@
 
31460
   "TARGET_REALLY_IWMMXT"
 
31461
   "waddwss%?\\t%0, %1, %2"
 
31462
   [(set_attr "predicable" "yes")
 
31463
-   (set_attr "wtype" "wadd")]
 
31464
+   (set_attr "type" "wmmx_wadd")]
 
31465
 )
 
31466
 
 
31467
 (define_insn "usaddv8qi3"
 
31468
@@ -391,7 +388,7 @@
 
31469
   "TARGET_REALLY_IWMMXT"
 
31470
   "waddbus%?\\t%0, %1, %2"
 
31471
   [(set_attr "predicable" "yes")
 
31472
-   (set_attr "wtype" "wadd")]
 
31473
+   (set_attr "type" "wmmx_wadd")]
 
31474
 )
 
31475
 
 
31476
 (define_insn "usaddv4hi3"
 
31477
@@ -401,7 +398,7 @@
 
31478
   "TARGET_REALLY_IWMMXT"
 
31479
   "waddhus%?\\t%0, %1, %2"
 
31480
   [(set_attr "predicable" "yes")
 
31481
-   (set_attr "wtype" "wadd")]
 
31482
+   (set_attr "type" "wmmx_wadd")]
 
31483
 )
 
31484
 
 
31485
 (define_insn "usaddv2si3"
 
31486
@@ -411,7 +408,7 @@
 
31487
   "TARGET_REALLY_IWMMXT"
 
31488
   "waddwus%?\\t%0, %1, %2"
 
31489
   [(set_attr "predicable" "yes")
 
31490
-   (set_attr "wtype" "wadd")]
 
31491
+   (set_attr "type" "wmmx_wadd")]
 
31492
 )
 
31493
 
 
31494
 (define_insn "*sub<mode>3_iwmmxt"
 
31495
@@ -421,7 +418,7 @@
 
31496
   "TARGET_REALLY_IWMMXT"
 
31497
   "wsub<MMX_char>%?\\t%0, %1, %2"
 
31498
   [(set_attr "predicable" "yes")
 
31499
-   (set_attr "wtype" "wsub")]
 
31500
+   (set_attr "type" "wmmx_wsub")]
 
31501
 )
 
31502
 
 
31503
 (define_insn "sssubv8qi3"
 
31504
@@ -431,7 +428,7 @@
 
31505
   "TARGET_REALLY_IWMMXT"
 
31506
   "wsubbss%?\\t%0, %1, %2"
 
31507
   [(set_attr "predicable" "yes")
 
31508
-   (set_attr "wtype" "wsub")]
 
31509
+   (set_attr "type" "wmmx_wsub")]
 
31510
 )
 
31511
 
 
31512
 (define_insn "sssubv4hi3"
 
31513
@@ -441,7 +438,7 @@
 
31514
   "TARGET_REALLY_IWMMXT"
 
31515
   "wsubhss%?\\t%0, %1, %2"
 
31516
   [(set_attr "predicable" "yes")
 
31517
-   (set_attr "wtype" "wsub")]
 
31518
+   (set_attr "type" "wmmx_wsub")]
 
31519
 )
 
31520
 
 
31521
 (define_insn "sssubv2si3"
 
31522
@@ -451,7 +448,7 @@
 
31523
   "TARGET_REALLY_IWMMXT"
 
31524
   "wsubwss%?\\t%0, %1, %2"
 
31525
   [(set_attr "predicable" "yes")
 
31526
-   (set_attr "wtype" "wsub")]
 
31527
+   (set_attr "type" "wmmx_wsub")]
 
31528
 )
 
31529
 
 
31530
 (define_insn "ussubv8qi3"
 
31531
@@ -461,7 +458,7 @@
 
31532
   "TARGET_REALLY_IWMMXT"
 
31533
   "wsubbus%?\\t%0, %1, %2"
 
31534
   [(set_attr "predicable" "yes")
 
31535
-   (set_attr "wtype" "wsub")]
 
31536
+   (set_attr "type" "wmmx_wsub")]
 
31537
 )
 
31538
 
 
31539
 (define_insn "ussubv4hi3"
 
31540
@@ -471,7 +468,7 @@
 
31541
   "TARGET_REALLY_IWMMXT"
 
31542
   "wsubhus%?\\t%0, %1, %2"
 
31543
   [(set_attr "predicable" "yes")
 
31544
-   (set_attr "wtype" "wsub")]
 
31545
+   (set_attr "type" "wmmx_wsub")]
 
31546
 )
 
31547
 
 
31548
 (define_insn "ussubv2si3"
 
31549
@@ -481,7 +478,7 @@
 
31550
   "TARGET_REALLY_IWMMXT"
 
31551
   "wsubwus%?\\t%0, %1, %2"
 
31552
   [(set_attr "predicable" "yes")
 
31553
-   (set_attr "wtype" "wsub")]
 
31554
+   (set_attr "type" "wmmx_wsub")]
 
31555
 )
 
31556
 
 
31557
 (define_insn "*mulv4hi3_iwmmxt"
 
31558
@@ -491,7 +488,7 @@
 
31559
   "TARGET_REALLY_IWMMXT"
 
31560
   "wmulul%?\\t%0, %1, %2"
 
31561
   [(set_attr "predicable" "yes")
 
31562
-   (set_attr "wtype" "wmul")]
 
31563
+   (set_attr "type" "wmmx_wmul")]
 
31564
 )
 
31565
 
 
31566
 (define_insn "smulv4hi3_highpart"
 
31567
@@ -504,7 +501,7 @@
 
31568
   "TARGET_REALLY_IWMMXT"
 
31569
   "wmulsm%?\\t%0, %1, %2"
 
31570
   [(set_attr "predicable" "yes")
 
31571
-   (set_attr "wtype" "wmul")]
 
31572
+   (set_attr "type" "wmmx_wmul")]
 
31573
 )
 
31574
 
 
31575
 (define_insn "umulv4hi3_highpart"
 
31576
@@ -517,7 +514,7 @@
 
31577
   "TARGET_REALLY_IWMMXT"
 
31578
   "wmulum%?\\t%0, %1, %2"
 
31579
   [(set_attr "predicable" "yes")
 
31580
-   (set_attr "wtype" "wmul")]
 
31581
+   (set_attr "type" "wmmx_wmul")]
 
31582
 )
 
31583
 
 
31584
 (define_insn "iwmmxt_wmacs"
 
31585
@@ -528,7 +525,7 @@
 
31586
   "TARGET_REALLY_IWMMXT"
 
31587
   "wmacs%?\\t%0, %2, %3"
 
31588
   [(set_attr "predicable" "yes")
 
31589
-   (set_attr "wtype" "wmac")]
 
31590
+   (set_attr "type" "wmmx_wmac")]
 
31591
 )
 
31592
 
 
31593
 (define_insn "iwmmxt_wmacsz"
 
31594
@@ -538,7 +535,7 @@
 
31595
   "TARGET_REALLY_IWMMXT"
 
31596
   "wmacsz%?\\t%0, %1, %2"
 
31597
   [(set_attr "predicable" "yes")
 
31598
-   (set_attr "wtype" "wmac")]
 
31599
+   (set_attr "type" "wmmx_wmac")]
 
31600
 )
 
31601
 
 
31602
 (define_insn "iwmmxt_wmacu"
 
31603
@@ -549,7 +546,7 @@
 
31604
   "TARGET_REALLY_IWMMXT"
 
31605
   "wmacu%?\\t%0, %2, %3"
 
31606
   [(set_attr "predicable" "yes")
 
31607
-   (set_attr "wtype" "wmac")]
 
31608
+   (set_attr "type" "wmmx_wmac")]
 
31609
 )
 
31610
 
 
31611
 (define_insn "iwmmxt_wmacuz"
 
31612
@@ -559,7 +556,7 @@
 
31613
   "TARGET_REALLY_IWMMXT"
 
31614
   "wmacuz%?\\t%0, %1, %2"
 
31615
   [(set_attr "predicable" "yes")
 
31616
-   (set_attr "wtype" "wmac")]
 
31617
+   (set_attr "type" "wmmx_wmac")]
 
31618
 )
 
31619
 
 
31620
 ;; Same as xordi3, but don't show input operands so that we don't think
 
31621
@@ -570,7 +567,7 @@
 
31622
   "TARGET_REALLY_IWMMXT"
 
31623
   "wxor%?\\t%0, %0, %0"
 
31624
   [(set_attr "predicable" "yes")
 
31625
-   (set_attr "wtype" "wxor")]
 
31626
+   (set_attr "type" "wmmx_wxor")]
 
31627
 )
 
31628
 
 
31629
 ;; Seems like cse likes to generate these, so we have to support them.
 
31630
@@ -584,7 +581,7 @@
 
31631
   "TARGET_REALLY_IWMMXT"
 
31632
   "wxor%?\\t%0, %0, %0"
 
31633
   [(set_attr "predicable" "yes")
 
31634
-   (set_attr "wtype" "wxor")]
 
31635
+   (set_attr "type" "wmmx_wxor")]
 
31636
 )
 
31637
 
 
31638
 (define_insn "iwmmxt_clrv4hi"
 
31639
@@ -594,7 +591,7 @@
 
31640
   "TARGET_REALLY_IWMMXT"
 
31641
   "wxor%?\\t%0, %0, %0"
 
31642
   [(set_attr "predicable" "yes")
 
31643
-   (set_attr "wtype" "wxor")]
 
31644
+   (set_attr "type" "wmmx_wxor")]
 
31645
 )
 
31646
 
 
31647
 (define_insn "iwmmxt_clrv2si"
 
31648
@@ -603,7 +600,7 @@
 
31649
   "TARGET_REALLY_IWMMXT"
 
31650
   "wxor%?\\t%0, %0, %0"
 
31651
   [(set_attr "predicable" "yes")
 
31652
-   (set_attr "wtype" "wxor")]
 
31653
+   (set_attr "type" "wmmx_wxor")]
 
31654
 )
 
31655
 
 
31656
 ;; Unsigned averages/sum of absolute differences
 
31657
@@ -627,7 +624,7 @@
 
31658
   "TARGET_REALLY_IWMMXT"
 
31659
   "wavg2br%?\\t%0, %1, %2"
 
31660
   [(set_attr "predicable" "yes")
 
31661
-   (set_attr "wtype" "wavg2")]
 
31662
+   (set_attr "type" "wmmx_wavg2")]
 
31663
 )
 
31664
 
 
31665
 (define_insn "iwmmxt_uavgrndv4hi3"
 
31666
@@ -645,7 +642,7 @@
 
31667
   "TARGET_REALLY_IWMMXT"
 
31668
   "wavg2hr%?\\t%0, %1, %2"
 
31669
   [(set_attr "predicable" "yes")
 
31670
-   (set_attr "wtype" "wavg2")]
 
31671
+   (set_attr "type" "wmmx_wavg2")]
 
31672
 )
 
31673
 
 
31674
 (define_insn "iwmmxt_uavgv8qi3"
 
31675
@@ -658,7 +655,7 @@
 
31676
   "TARGET_REALLY_IWMMXT"
 
31677
   "wavg2b%?\\t%0, %1, %2"
 
31678
   [(set_attr "predicable" "yes")
 
31679
-   (set_attr "wtype" "wavg2")]
 
31680
+   (set_attr "type" "wmmx_wavg2")]
 
31681
 )
 
31682
 
 
31683
 (define_insn "iwmmxt_uavgv4hi3"
 
31684
@@ -671,7 +668,7 @@
 
31685
   "TARGET_REALLY_IWMMXT"
 
31686
   "wavg2h%?\\t%0, %1, %2"
 
31687
   [(set_attr "predicable" "yes")
 
31688
-   (set_attr "wtype" "wavg2")]
 
31689
+   (set_attr "type" "wmmx_wavg2")]
 
31690
 )
 
31691
 
 
31692
 ;; Insert/extract/shuffle
 
31693
@@ -690,7 +687,7 @@
 
31694
    }
 
31695
    "
 
31696
   [(set_attr "predicable" "yes")
 
31697
-   (set_attr "wtype" "tinsr")]
 
31698
+   (set_attr "type" "wmmx_tinsr")]
 
31699
 )
 
31700
 
 
31701
 (define_insn "iwmmxt_tinsrh"
 
31702
@@ -707,7 +704,7 @@
 
31703
    }
 
31704
    "
 
31705
   [(set_attr "predicable" "yes")
 
31706
-   (set_attr "wtype" "tinsr")]
 
31707
+   (set_attr "type" "wmmx_tinsr")]
 
31708
 )
 
31709
 
 
31710
 (define_insn "iwmmxt_tinsrw"
 
31711
@@ -724,7 +721,7 @@
 
31712
    }
 
31713
    "
 
31714
   [(set_attr "predicable" "yes")
 
31715
-   (set_attr "wtype" "tinsr")]
 
31716
+   (set_attr "type" "wmmx_tinsr")]
 
31717
 )
 
31718
 
 
31719
 (define_insn "iwmmxt_textrmub"
 
31720
@@ -735,7 +732,7 @@
 
31721
   "TARGET_REALLY_IWMMXT"
 
31722
   "textrmub%?\\t%0, %1, %2"
 
31723
   [(set_attr "predicable" "yes")
 
31724
-   (set_attr "wtype" "textrm")]
 
31725
+   (set_attr "type" "wmmx_textrm")]
 
31726
 )
 
31727
 
 
31728
 (define_insn "iwmmxt_textrmsb"
 
31729
@@ -746,7 +743,7 @@
 
31730
   "TARGET_REALLY_IWMMXT"
 
31731
   "textrmsb%?\\t%0, %1, %2"
 
31732
   [(set_attr "predicable" "yes")
 
31733
-   (set_attr "wtype" "textrm")]
 
31734
+   (set_attr "type" "wmmx_textrm")]
 
31735
 )
 
31736
 
 
31737
 (define_insn "iwmmxt_textrmuh"
 
31738
@@ -757,7 +754,7 @@
 
31739
   "TARGET_REALLY_IWMMXT"
 
31740
   "textrmuh%?\\t%0, %1, %2"
 
31741
   [(set_attr "predicable" "yes")
 
31742
-   (set_attr "wtype" "textrm")]
 
31743
+   (set_attr "type" "wmmx_textrm")]
 
31744
 )
 
31745
 
 
31746
 (define_insn "iwmmxt_textrmsh"
 
31747
@@ -768,7 +765,7 @@
 
31748
   "TARGET_REALLY_IWMMXT"
 
31749
   "textrmsh%?\\t%0, %1, %2"
 
31750
   [(set_attr "predicable" "yes")
 
31751
-   (set_attr "wtype" "textrm")]
 
31752
+   (set_attr "type" "wmmx_textrm")]
 
31753
 )
 
31754
 
 
31755
 ;; There are signed/unsigned variants of this instruction, but they are
 
31756
@@ -780,7 +777,7 @@
 
31757
   "TARGET_REALLY_IWMMXT"
 
31758
   "textrmsw%?\\t%0, %1, %2"
 
31759
   [(set_attr "predicable" "yes")
 
31760
-   (set_attr "wtype" "textrm")]
 
31761
+   (set_attr "type" "wmmx_textrm")]
 
31762
 )
 
31763
 
 
31764
 (define_insn "iwmmxt_wshufh"
 
31765
@@ -790,7 +787,7 @@
 
31766
   "TARGET_REALLY_IWMMXT"
 
31767
   "wshufh%?\\t%0, %1, %2"
 
31768
   [(set_attr "predicable" "yes")
 
31769
-   (set_attr "wtype" "wshufh")]
 
31770
+   (set_attr "type" "wmmx_wshufh")]
 
31771
 )
 
31772
 
 
31773
 ;; Mask-generating comparisons
 
31774
@@ -812,7 +809,7 @@
 
31775
   "TARGET_REALLY_IWMMXT"
 
31776
   "wcmpeqb%?\\t%0, %1, %2"
 
31777
   [(set_attr "predicable" "yes")
 
31778
-   (set_attr "wtype" "wcmpeq")]
 
31779
+   (set_attr "type" "wmmx_wcmpeq")]
 
31780
 )
 
31781
 
 
31782
 (define_insn "eqv4hi3"
 
31783
@@ -823,7 +820,7 @@
 
31784
   "TARGET_REALLY_IWMMXT"
 
31785
   "wcmpeqh%?\\t%0, %1, %2"
 
31786
   [(set_attr "predicable" "yes")
 
31787
-   (set_attr "wtype" "wcmpeq")]
 
31788
+   (set_attr "type" "wmmx_wcmpeq")]
 
31789
 )
 
31790
 
 
31791
 (define_insn "eqv2si3"
 
31792
@@ -835,7 +832,7 @@
 
31793
   "TARGET_REALLY_IWMMXT"
 
31794
   "wcmpeqw%?\\t%0, %1, %2"
 
31795
   [(set_attr "predicable" "yes")
 
31796
-   (set_attr "wtype" "wcmpeq")]
 
31797
+   (set_attr "type" "wmmx_wcmpeq")]
 
31798
 )
 
31799
 
 
31800
 (define_insn "gtuv8qi3"
 
31801
@@ -846,7 +843,7 @@
 
31802
   "TARGET_REALLY_IWMMXT"
 
31803
   "wcmpgtub%?\\t%0, %1, %2"
 
31804
   [(set_attr "predicable" "yes")
 
31805
-   (set_attr "wtype" "wcmpgt")]
 
31806
+   (set_attr "type" "wmmx_wcmpgt")]
 
31807
 )
 
31808
 
 
31809
 (define_insn "gtuv4hi3"
 
31810
@@ -857,7 +854,7 @@
 
31811
   "TARGET_REALLY_IWMMXT"
 
31812
   "wcmpgtuh%?\\t%0, %1, %2"
 
31813
   [(set_attr "predicable" "yes")
 
31814
-   (set_attr "wtype" "wcmpgt")]
 
31815
+   (set_attr "type" "wmmx_wcmpgt")]
 
31816
 )
 
31817
 
 
31818
 (define_insn "gtuv2si3"
 
31819
@@ -868,7 +865,7 @@
 
31820
   "TARGET_REALLY_IWMMXT"
 
31821
   "wcmpgtuw%?\\t%0, %1, %2"
 
31822
   [(set_attr "predicable" "yes")
 
31823
-   (set_attr "wtype" "wcmpgt")]
 
31824
+   (set_attr "type" "wmmx_wcmpgt")]
 
31825
 )
 
31826
 
 
31827
 (define_insn "gtv8qi3"
 
31828
@@ -879,7 +876,7 @@
 
31829
   "TARGET_REALLY_IWMMXT"
 
31830
   "wcmpgtsb%?\\t%0, %1, %2"
 
31831
   [(set_attr "predicable" "yes")
 
31832
-   (set_attr "wtype" "wcmpgt")]
 
31833
+   (set_attr "type" "wmmx_wcmpgt")]
 
31834
 )
 
31835
 
 
31836
 (define_insn "gtv4hi3"
 
31837
@@ -890,7 +887,7 @@
 
31838
   "TARGET_REALLY_IWMMXT"
 
31839
   "wcmpgtsh%?\\t%0, %1, %2"
 
31840
   [(set_attr "predicable" "yes")
 
31841
-   (set_attr "wtype" "wcmpgt")]
 
31842
+   (set_attr "type" "wmmx_wcmpgt")]
 
31843
 )
 
31844
 
 
31845
 (define_insn "gtv2si3"
 
31846
@@ -901,7 +898,7 @@
 
31847
   "TARGET_REALLY_IWMMXT"
 
31848
   "wcmpgtsw%?\\t%0, %1, %2"
 
31849
   [(set_attr "predicable" "yes")
 
31850
-   (set_attr "wtype" "wcmpgt")]
 
31851
+   (set_attr "type" "wmmx_wcmpgt")]
 
31852
 )
 
31853
 
 
31854
 ;; Max/min insns
 
31855
@@ -913,7 +910,7 @@
 
31856
   "TARGET_REALLY_IWMMXT"
 
31857
   "wmaxs<MMX_char>%?\\t%0, %1, %2"
 
31858
   [(set_attr "predicable" "yes")
 
31859
-   (set_attr "wtype" "wmax")]
 
31860
+   (set_attr "type" "wmmx_wmax")]
 
31861
 )
 
31862
 
 
31863
 (define_insn "*umax<mode>3_iwmmxt"
 
31864
@@ -923,7 +920,7 @@
 
31865
   "TARGET_REALLY_IWMMXT"
 
31866
   "wmaxu<MMX_char>%?\\t%0, %1, %2"
 
31867
   [(set_attr "predicable" "yes")
 
31868
-   (set_attr "wtype" "wmax")]
 
31869
+   (set_attr "type" "wmmx_wmax")]
 
31870
 )
 
31871
 
 
31872
 (define_insn "*smin<mode>3_iwmmxt"
 
31873
@@ -933,7 +930,7 @@
 
31874
   "TARGET_REALLY_IWMMXT"
 
31875
   "wmins<MMX_char>%?\\t%0, %1, %2"
 
31876
   [(set_attr "predicable" "yes")
 
31877
-   (set_attr "wtype" "wmin")]
 
31878
+   (set_attr "type" "wmmx_wmin")]
 
31879
 )
 
31880
 
 
31881
 (define_insn "*umin<mode>3_iwmmxt"
 
31882
@@ -943,7 +940,7 @@
 
31883
   "TARGET_REALLY_IWMMXT"
 
31884
   "wminu<MMX_char>%?\\t%0, %1, %2"
 
31885
   [(set_attr "predicable" "yes")
 
31886
-   (set_attr "wtype" "wmin")]
 
31887
+   (set_attr "type" "wmmx_wmin")]
 
31888
 )
 
31889
 
 
31890
 ;; Pack/unpack insns.
 
31891
@@ -956,7 +953,7 @@
 
31892
   "TARGET_REALLY_IWMMXT"
 
31893
   "wpackhss%?\\t%0, %1, %2"
 
31894
   [(set_attr "predicable" "yes")
 
31895
-   (set_attr "wtype" "wpack")]
 
31896
+   (set_attr "type" "wmmx_wpack")]
 
31897
 )
 
31898
 
 
31899
 (define_insn "iwmmxt_wpackwss"
 
31900
@@ -967,7 +964,7 @@
 
31901
   "TARGET_REALLY_IWMMXT"
 
31902
   "wpackwss%?\\t%0, %1, %2"
 
31903
   [(set_attr "predicable" "yes")
 
31904
-   (set_attr "wtype" "wpack")]
 
31905
+   (set_attr "type" "wmmx_wpack")]
 
31906
 )
 
31907
 
 
31908
 (define_insn "iwmmxt_wpackdss"
 
31909
@@ -978,7 +975,7 @@
 
31910
   "TARGET_REALLY_IWMMXT"
 
31911
   "wpackdss%?\\t%0, %1, %2"
 
31912
   [(set_attr "predicable" "yes")
 
31913
-   (set_attr "wtype" "wpack")]
 
31914
+   (set_attr "type" "wmmx_wpack")]
 
31915
 )
 
31916
 
 
31917
 (define_insn "iwmmxt_wpackhus"
 
31918
@@ -989,7 +986,7 @@
 
31919
   "TARGET_REALLY_IWMMXT"
 
31920
   "wpackhus%?\\t%0, %1, %2"
 
31921
   [(set_attr "predicable" "yes")
 
31922
-   (set_attr "wtype" "wpack")]
 
31923
+   (set_attr "type" "wmmx_wpack")]
 
31924
 )
 
31925
 
 
31926
 (define_insn "iwmmxt_wpackwus"
 
31927
@@ -1000,7 +997,7 @@
 
31928
   "TARGET_REALLY_IWMMXT"
 
31929
   "wpackwus%?\\t%0, %1, %2"
 
31930
   [(set_attr "predicable" "yes")
 
31931
-   (set_attr "wtype" "wpack")]
 
31932
+   (set_attr "type" "wmmx_wpack")]
 
31933
 )
 
31934
 
 
31935
 (define_insn "iwmmxt_wpackdus"
 
31936
@@ -1011,7 +1008,7 @@
 
31937
   "TARGET_REALLY_IWMMXT"
 
31938
   "wpackdus%?\\t%0, %1, %2"
 
31939
   [(set_attr "predicable" "yes")
 
31940
-   (set_attr "wtype" "wpack")]
 
31941
+   (set_attr "type" "wmmx_wpack")]
 
31942
 )
 
31943
 
 
31944
 (define_insn "iwmmxt_wunpckihb"
 
31945
@@ -1039,7 +1036,7 @@
 
31946
   "TARGET_REALLY_IWMMXT"
 
31947
   "wunpckihb%?\\t%0, %1, %2"
 
31948
   [(set_attr "predicable" "yes")
 
31949
-   (set_attr "wtype" "wunpckih")]
 
31950
+   (set_attr "type" "wmmx_wunpckih")]
 
31951
 )
 
31952
 
 
31953
 (define_insn "iwmmxt_wunpckihh"
 
31954
@@ -1059,7 +1056,7 @@
 
31955
   "TARGET_REALLY_IWMMXT"
 
31956
   "wunpckihh%?\\t%0, %1, %2"
 
31957
   [(set_attr "predicable" "yes")
 
31958
-   (set_attr "wtype" "wunpckih")]
 
31959
+   (set_attr "type" "wmmx_wunpckih")]
 
31960
 )
 
31961
 
 
31962
 (define_insn "iwmmxt_wunpckihw"
 
31963
@@ -1075,7 +1072,7 @@
 
31964
   "TARGET_REALLY_IWMMXT"
 
31965
   "wunpckihw%?\\t%0, %1, %2"
 
31966
   [(set_attr "predicable" "yes")
 
31967
-   (set_attr "wtype" "wunpckih")]
 
31968
+   (set_attr "type" "wmmx_wunpckih")]
 
31969
 )
 
31970
 
 
31971
 (define_insn "iwmmxt_wunpckilb"
 
31972
@@ -1103,7 +1100,7 @@
 
31973
   "TARGET_REALLY_IWMMXT"
 
31974
   "wunpckilb%?\\t%0, %1, %2"
 
31975
   [(set_attr "predicable" "yes")
 
31976
-   (set_attr "wtype" "wunpckil")]
 
31977
+   (set_attr "type" "wmmx_wunpckil")]
 
31978
 )
 
31979
 
 
31980
 (define_insn "iwmmxt_wunpckilh"
 
31981
@@ -1123,7 +1120,7 @@
 
31982
   "TARGET_REALLY_IWMMXT"
 
31983
   "wunpckilh%?\\t%0, %1, %2"
 
31984
   [(set_attr "predicable" "yes")
 
31985
-   (set_attr "wtype" "wunpckil")]
 
31986
+   (set_attr "type" "wmmx_wunpckil")]
 
31987
 )
 
31988
 
 
31989
 (define_insn "iwmmxt_wunpckilw"
 
31990
@@ -1139,7 +1136,7 @@
 
31991
   "TARGET_REALLY_IWMMXT"
 
31992
   "wunpckilw%?\\t%0, %1, %2"
 
31993
   [(set_attr "predicable" "yes")
 
31994
-   (set_attr "wtype" "wunpckil")]
 
31995
+   (set_attr "type" "wmmx_wunpckil")]
 
31996
 )
 
31997
 
 
31998
 (define_insn "iwmmxt_wunpckehub"
 
31999
@@ -1151,7 +1148,7 @@
 
32000
   "TARGET_REALLY_IWMMXT"
 
32001
   "wunpckehub%?\\t%0, %1"
 
32002
   [(set_attr "predicable" "yes")
 
32003
-   (set_attr "wtype" "wunpckeh")]
 
32004
+   (set_attr "type" "wmmx_wunpckeh")]
 
32005
 )
 
32006
 
 
32007
 (define_insn "iwmmxt_wunpckehuh"
 
32008
@@ -1162,7 +1159,7 @@
 
32009
   "TARGET_REALLY_IWMMXT"
 
32010
   "wunpckehuh%?\\t%0, %1"
 
32011
   [(set_attr "predicable" "yes")
 
32012
-   (set_attr "wtype" "wunpckeh")]
 
32013
+   (set_attr "type" "wmmx_wunpckeh")]
 
32014
 )
 
32015
 
 
32016
 (define_insn "iwmmxt_wunpckehuw"
 
32017
@@ -1173,7 +1170,7 @@
 
32018
   "TARGET_REALLY_IWMMXT"
 
32019
   "wunpckehuw%?\\t%0, %1"
 
32020
   [(set_attr "predicable" "yes")
 
32021
-   (set_attr "wtype" "wunpckeh")]
 
32022
+   (set_attr "type" "wmmx_wunpckeh")]
 
32023
 )
 
32024
 
 
32025
 (define_insn "iwmmxt_wunpckehsb"
 
32026
@@ -1185,7 +1182,7 @@
 
32027
   "TARGET_REALLY_IWMMXT"
 
32028
   "wunpckehsb%?\\t%0, %1"
 
32029
   [(set_attr "predicable" "yes")
 
32030
-   (set_attr "wtype" "wunpckeh")]
 
32031
+   (set_attr "type" "wmmx_wunpckeh")]
 
32032
 )
 
32033
 
 
32034
 (define_insn "iwmmxt_wunpckehsh"
 
32035
@@ -1196,7 +1193,7 @@
 
32036
   "TARGET_REALLY_IWMMXT"
 
32037
   "wunpckehsh%?\\t%0, %1"
 
32038
   [(set_attr "predicable" "yes")
 
32039
-   (set_attr "wtype" "wunpckeh")]
 
32040
+   (set_attr "type" "wmmx_wunpckeh")]
 
32041
 )
 
32042
 
 
32043
 (define_insn "iwmmxt_wunpckehsw"
 
32044
@@ -1207,7 +1204,7 @@
 
32045
   "TARGET_REALLY_IWMMXT"
 
32046
   "wunpckehsw%?\\t%0, %1"
 
32047
   [(set_attr "predicable" "yes")
 
32048
-   (set_attr "wtype" "wunpckeh")]
 
32049
+   (set_attr "type" "wmmx_wunpckeh")]
 
32050
 )
 
32051
 
 
32052
 (define_insn "iwmmxt_wunpckelub"
 
32053
@@ -1219,7 +1216,7 @@
 
32054
   "TARGET_REALLY_IWMMXT"
 
32055
   "wunpckelub%?\\t%0, %1"
 
32056
   [(set_attr "predicable" "yes")
 
32057
-   (set_attr "wtype" "wunpckel")]
 
32058
+   (set_attr "type" "wmmx_wunpckel")]
 
32059
 )
 
32060
 
 
32061
 (define_insn "iwmmxt_wunpckeluh"
 
32062
@@ -1230,7 +1227,7 @@
 
32063
   "TARGET_REALLY_IWMMXT"
 
32064
   "wunpckeluh%?\\t%0, %1"
 
32065
   [(set_attr "predicable" "yes")
 
32066
-   (set_attr "wtype" "wunpckel")]
 
32067
+   (set_attr "type" "wmmx_wunpckel")]
 
32068
 )
 
32069
 
 
32070
 (define_insn "iwmmxt_wunpckeluw"
 
32071
@@ -1241,7 +1238,7 @@
 
32072
   "TARGET_REALLY_IWMMXT"
 
32073
   "wunpckeluw%?\\t%0, %1"
 
32074
   [(set_attr "predicable" "yes")
 
32075
-   (set_attr "wtype" "wunpckel")]
 
32076
+   (set_attr "type" "wmmx_wunpckel")]
 
32077
 )
 
32078
 
 
32079
 (define_insn "iwmmxt_wunpckelsb"
 
32080
@@ -1253,7 +1250,7 @@
 
32081
   "TARGET_REALLY_IWMMXT"
 
32082
   "wunpckelsb%?\\t%0, %1"
 
32083
   [(set_attr "predicable" "yes")
 
32084
-   (set_attr "wtype" "wunpckel")]
 
32085
+   (set_attr "type" "wmmx_wunpckel")]
 
32086
 )
 
32087
 
 
32088
 (define_insn "iwmmxt_wunpckelsh"
 
32089
@@ -1264,7 +1261,7 @@
 
32090
   "TARGET_REALLY_IWMMXT"
 
32091
   "wunpckelsh%?\\t%0, %1"
 
32092
   [(set_attr "predicable" "yes")
 
32093
-   (set_attr "wtype" "wunpckel")]
 
32094
+   (set_attr "type" "wmmx_wunpckel")]
 
32095
 )
 
32096
 
 
32097
 (define_insn "iwmmxt_wunpckelsw"
 
32098
@@ -1275,7 +1272,7 @@
 
32099
   "TARGET_REALLY_IWMMXT"
 
32100
   "wunpckelsw%?\\t%0, %1"
 
32101
   [(set_attr "predicable" "yes")
 
32102
-   (set_attr "wtype" "wunpckel")]
 
32103
+   (set_attr "type" "wmmx_wunpckel")]
 
32104
 )
 
32105
 
 
32106
 ;; Shifts
 
32107
@@ -1298,7 +1295,7 @@
 
32108
   "
 
32109
   [(set_attr "predicable" "yes")
 
32110
    (set_attr "arch" "*, iwmmxt2")
 
32111
-   (set_attr "wtype" "wror, wror")]
 
32112
+   (set_attr "type" "wmmx_wror, wmmx_wror")]
 
32113
 )
 
32114
 
 
32115
 (define_insn "ashr<mode>3_iwmmxt"
 
32116
@@ -1319,7 +1316,7 @@
 
32117
   "
 
32118
   [(set_attr "predicable" "yes")
 
32119
    (set_attr "arch" "*, iwmmxt2")
 
32120
-   (set_attr "wtype" "wsra, wsra")]
 
32121
+   (set_attr "type" "wmmx_wsra, wmmx_wsra")]
 
32122
 )
 
32123
 
 
32124
 (define_insn "lshr<mode>3_iwmmxt"
 
32125
@@ -1340,7 +1337,7 @@
 
32126
   "
 
32127
   [(set_attr "predicable" "yes")
 
32128
    (set_attr "arch" "*, iwmmxt2")
 
32129
-   (set_attr "wtype" "wsrl, wsrl")]
 
32130
+   (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
 
32131
 )
 
32132
 
 
32133
 (define_insn "ashl<mode>3_iwmmxt"
 
32134
@@ -1361,7 +1358,7 @@
 
32135
   "
 
32136
   [(set_attr "predicable" "yes")
 
32137
    (set_attr "arch" "*, iwmmxt2")
 
32138
-   (set_attr "wtype" "wsll, wsll")]
 
32139
+   (set_attr "type" "wmmx_wsll, wmmx_wsll")]
 
32140
 )
 
32141
 
 
32142
 (define_insn "ror<mode>3_di"
 
32143
@@ -1382,7 +1379,7 @@
 
32144
   "
 
32145
   [(set_attr "predicable" "yes")
 
32146
    (set_attr "arch" "*, iwmmxt2")
 
32147
-   (set_attr "wtype" "wror, wror")]
 
32148
+   (set_attr "type" "wmmx_wror, wmmx_wror")]
 
32149
 )
 
32150
 
 
32151
 (define_insn "ashr<mode>3_di"
 
32152
@@ -1403,7 +1400,7 @@
 
32153
   "
 
32154
   [(set_attr "predicable" "yes")
 
32155
    (set_attr "arch" "*, iwmmxt2")
 
32156
-   (set_attr "wtype" "wsra, wsra")]
 
32157
+   (set_attr "type" "wmmx_wsra, wmmx_wsra")]
 
32158
 )
 
32159
 
 
32160
 (define_insn "lshr<mode>3_di"
 
32161
@@ -1424,7 +1421,7 @@
 
32162
   "
 
32163
   [(set_attr "predicable" "yes")
 
32164
    (set_attr "arch" "*, iwmmxt2")
 
32165
-   (set_attr "wtype" "wsrl, wsrl")]
 
32166
+   (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
 
32167
 )
 
32168
 
 
32169
 (define_insn "ashl<mode>3_di"
 
32170
@@ -1445,7 +1442,7 @@
 
32171
   "
 
32172
   [(set_attr "predicable" "yes")
 
32173
    (set_attr "arch" "*, iwmmxt2")
 
32174
-   (set_attr "wtype" "wsll, wsll")]
 
32175
+   (set_attr "type" "wmmx_wsll, wmmx_wsll")]
 
32176
 )
 
32177
 
 
32178
 (define_insn "iwmmxt_wmadds"
 
32179
@@ -1464,7 +1461,7 @@
 
32180
   "TARGET_REALLY_IWMMXT"
 
32181
   "wmadds%?\\t%0, %1, %2"
 
32182
   [(set_attr "predicable" "yes")
 
32183
-   (set_attr "wtype" "wmadd")]
 
32184
+   (set_attr "type" "wmmx_wmadd")]
 
32185
 )
 
32186
 
 
32187
 (define_insn "iwmmxt_wmaddu"
 
32188
@@ -1483,7 +1480,7 @@
 
32189
   "TARGET_REALLY_IWMMXT"
 
32190
   "wmaddu%?\\t%0, %1, %2"
 
32191
   [(set_attr "predicable" "yes")
 
32192
-   (set_attr "wtype" "wmadd")]
 
32193
+   (set_attr "type" "wmmx_wmadd")]
 
32194
 )
 
32195
 
 
32196
 (define_insn "iwmmxt_tmia"
 
32197
@@ -1496,7 +1493,7 @@
 
32198
   "TARGET_REALLY_IWMMXT"
 
32199
   "tmia%?\\t%0, %2, %3"
 
32200
   [(set_attr "predicable" "yes")
 
32201
-   (set_attr "wtype" "tmia")]
 
32202
+   (set_attr "type" "wmmx_tmia")]
 
32203
 )
 
32204
 
 
32205
 (define_insn "iwmmxt_tmiaph"
 
32206
@@ -1514,7 +1511,7 @@
 
32207
   "TARGET_REALLY_IWMMXT"
 
32208
   "tmiaph%?\\t%0, %2, %3"
 
32209
   [(set_attr "predicable" "yes")
 
32210
-   (set_attr "wtype" "tmiaph")]
 
32211
+   (set_attr "type" "wmmx_tmiaph")]
 
32212
 )
 
32213
 
 
32214
 (define_insn "iwmmxt_tmiabb"
 
32215
@@ -1527,7 +1524,7 @@
 
32216
   "TARGET_REALLY_IWMMXT"
 
32217
   "tmiabb%?\\t%0, %2, %3"
 
32218
   [(set_attr "predicable" "yes")
 
32219
-   (set_attr "wtype" "tmiaxy")]
 
32220
+   (set_attr "type" "wmmx_tmiaxy")]
 
32221
 )
 
32222
 
 
32223
 (define_insn "iwmmxt_tmiatb"
 
32224
@@ -1544,7 +1541,7 @@
 
32225
   "TARGET_REALLY_IWMMXT"
 
32226
   "tmiatb%?\\t%0, %2, %3"
 
32227
   [(set_attr "predicable" "yes")
 
32228
-   (set_attr "wtype" "tmiaxy")]
 
32229
+   (set_attr "type" "wmmx_tmiaxy")]
 
32230
 )
 
32231
 
 
32232
 (define_insn "iwmmxt_tmiabt"
 
32233
@@ -1561,7 +1558,7 @@
 
32234
   "TARGET_REALLY_IWMMXT"
 
32235
   "tmiabt%?\\t%0, %2, %3"
 
32236
   [(set_attr "predicable" "yes")
 
32237
-   (set_attr "wtype" "tmiaxy")]
 
32238
+   (set_attr "type" "wmmx_tmiaxy")]
 
32239
 )
 
32240
 
 
32241
 (define_insn "iwmmxt_tmiatt"
 
32242
@@ -1580,7 +1577,7 @@
 
32243
   "TARGET_REALLY_IWMMXT"
 
32244
   "tmiatt%?\\t%0, %2, %3"
 
32245
   [(set_attr "predicable" "yes")
 
32246
-   (set_attr "wtype" "tmiaxy")]
 
32247
+   (set_attr "type" "wmmx_tmiaxy")]
 
32248
 )
 
32249
 
 
32250
 (define_insn "iwmmxt_tmovmskb"
 
32251
@@ -1589,7 +1586,7 @@
 
32252
   "TARGET_REALLY_IWMMXT"
 
32253
   "tmovmskb%?\\t%0, %1"
 
32254
   [(set_attr "predicable" "yes")
 
32255
-   (set_attr "wtype" "tmovmsk")]
 
32256
+   (set_attr "type" "wmmx_tmovmsk")]
 
32257
 )
 
32258
 
 
32259
 (define_insn "iwmmxt_tmovmskh"
 
32260
@@ -1598,7 +1595,7 @@
 
32261
   "TARGET_REALLY_IWMMXT"
 
32262
   "tmovmskh%?\\t%0, %1"
 
32263
   [(set_attr "predicable" "yes")
 
32264
-   (set_attr "wtype" "tmovmsk")]
 
32265
+   (set_attr "type" "wmmx_tmovmsk")]
 
32266
 )
 
32267
 
 
32268
 (define_insn "iwmmxt_tmovmskw"
 
32269
@@ -1607,7 +1604,7 @@
 
32270
   "TARGET_REALLY_IWMMXT"
 
32271
   "tmovmskw%?\\t%0, %1"
 
32272
   [(set_attr "predicable" "yes")
 
32273
-   (set_attr "wtype" "tmovmsk")]
 
32274
+   (set_attr "type" "wmmx_tmovmsk")]
 
32275
 )
 
32276
 
 
32277
 (define_insn "iwmmxt_waccb"
 
32278
@@ -1616,7 +1613,7 @@
 
32279
   "TARGET_REALLY_IWMMXT"
 
32280
   "waccb%?\\t%0, %1"
 
32281
   [(set_attr "predicable" "yes")
 
32282
-   (set_attr "wtype" "wacc")]
 
32283
+   (set_attr "type" "wmmx_wacc")]
 
32284
 )
 
32285
 
 
32286
 (define_insn "iwmmxt_wacch"
 
32287
@@ -1625,7 +1622,7 @@
 
32288
   "TARGET_REALLY_IWMMXT"
 
32289
   "wacch%?\\t%0, %1"
 
32290
   [(set_attr "predicable" "yes")
 
32291
-   (set_attr "wtype" "wacc")]
 
32292
+   (set_attr "type" "wmmx_wacc")]
 
32293
 )
 
32294
 
 
32295
 (define_insn "iwmmxt_waccw"
 
32296
@@ -1634,7 +1631,7 @@
 
32297
   "TARGET_REALLY_IWMMXT"
 
32298
   "waccw%?\\t%0, %1"
 
32299
   [(set_attr "predicable" "yes")
 
32300
-   (set_attr "wtype" "wacc")]
 
32301
+   (set_attr "type" "wmmx_wacc")]
 
32302
 )
 
32303
 
 
32304
 ;; use unspec here to prevent 8 * imm to be optimized by cse
 
32305
@@ -1651,7 +1648,7 @@
 
32306
   "TARGET_REALLY_IWMMXT"
 
32307
   "waligni%?\\t%0, %1, %2, %3"
 
32308
   [(set_attr "predicable" "yes")
 
32309
-   (set_attr "wtype" "waligni")]
 
32310
+   (set_attr "type" "wmmx_waligni")]
 
32311
 )
 
32312
 
 
32313
 (define_insn "iwmmxt_walignr"
 
32314
@@ -1666,7 +1663,7 @@
 
32315
   "TARGET_REALLY_IWMMXT"
 
32316
   "walignr%U3%?\\t%0, %1, %2"
 
32317
   [(set_attr "predicable" "yes")
 
32318
-   (set_attr "wtype" "walignr")]
 
32319
+   (set_attr "type" "wmmx_walignr")]
 
32320
 )
 
32321
 
 
32322
 (define_insn "iwmmxt_walignr0"
 
32323
@@ -1681,7 +1678,7 @@
 
32324
   "TARGET_REALLY_IWMMXT"
 
32325
   "walignr0%?\\t%0, %1, %2"
 
32326
   [(set_attr "predicable" "yes")
 
32327
-   (set_attr "wtype" "walignr")]
 
32328
+   (set_attr "type" "wmmx_walignr")]
 
32329
 )
 
32330
 
 
32331
 (define_insn "iwmmxt_walignr1"
 
32332
@@ -1696,7 +1693,7 @@
 
32333
   "TARGET_REALLY_IWMMXT"
 
32334
   "walignr1%?\\t%0, %1, %2"
 
32335
   [(set_attr "predicable" "yes")
 
32336
-   (set_attr "wtype" "walignr")]
 
32337
+   (set_attr "type" "wmmx_walignr")]
 
32338
 )
 
32339
 
 
32340
 (define_insn "iwmmxt_walignr2"
 
32341
@@ -1711,7 +1708,7 @@
 
32342
   "TARGET_REALLY_IWMMXT"
 
32343
   "walignr2%?\\t%0, %1, %2"
 
32344
   [(set_attr "predicable" "yes")
 
32345
-   (set_attr "wtype" "walignr")]
 
32346
+   (set_attr "type" "wmmx_walignr")]
 
32347
 )
 
32348
 
 
32349
 (define_insn "iwmmxt_walignr3"
 
32350
@@ -1726,7 +1723,7 @@
 
32351
   "TARGET_REALLY_IWMMXT"
 
32352
   "walignr3%?\\t%0, %1, %2"
 
32353
   [(set_attr "predicable" "yes")
 
32354
-   (set_attr "wtype" "walignr")]
 
32355
+   (set_attr "type" "wmmx_walignr")]
 
32356
 )
 
32357
 
 
32358
 (define_insn "iwmmxt_wsadb"
 
32359
@@ -1738,7 +1735,7 @@
 
32360
   "TARGET_REALLY_IWMMXT"
 
32361
   "wsadb%?\\t%0, %2, %3"
 
32362
   [(set_attr "predicable" "yes")
 
32363
-   (set_attr "wtype" "wsad")]
 
32364
+   (set_attr "type" "wmmx_wsad")]
 
32365
 )
 
32366
 
 
32367
 (define_insn "iwmmxt_wsadh"
 
32368
@@ -1750,7 +1747,7 @@
 
32369
   "TARGET_REALLY_IWMMXT"
 
32370
   "wsadh%?\\t%0, %2, %3"
 
32371
   [(set_attr "predicable" "yes")
 
32372
-   (set_attr "wtype" "wsad")]
 
32373
+   (set_attr "type" "wmmx_wsad")]
 
32374
 )
 
32375
 
 
32376
 (define_insn "iwmmxt_wsadbz"
 
32377
@@ -1760,7 +1757,7 @@
 
32378
   "TARGET_REALLY_IWMMXT"
 
32379
   "wsadbz%?\\t%0, %1, %2"
 
32380
   [(set_attr "predicable" "yes")
 
32381
-   (set_attr "wtype" "wsad")]
 
32382
+   (set_attr "type" "wmmx_wsad")]
 
32383
 )
 
32384
 
 
32385
 (define_insn "iwmmxt_wsadhz"
 
32386
@@ -1770,7 +1767,7 @@
 
32387
   "TARGET_REALLY_IWMMXT"
 
32388
   "wsadhz%?\\t%0, %1, %2"
 
32389
   [(set_attr "predicable" "yes")
 
32390
-   (set_attr "wtype" "wsad")]
 
32391
+   (set_attr "type" "wmmx_wsad")]
 
32392
 )
 
32393
 
 
32394
 (include "iwmmxt2.md")
 
32395
--- a/src/gcc/config/arm/cortex-a53.md
 
32396
+++ b/src/gcc/config/arm/cortex-a53.md
 
32397
@@ -0,0 +1,300 @@
 
32398
+;; ARM Cortex-A53 pipeline description
 
32399
+;; Copyright (C) 2013 Free Software Foundation, Inc.
 
32400
+;;
 
32401
+;; Contributed by ARM Ltd.
 
32402
+;;
 
32403
+;; This file is part of GCC.
 
32404
+;;
 
32405
+;; GCC is free software; you can redistribute it and/or modify it
 
32406
+;; under the terms of the GNU General Public License as published by
 
32407
+;; the Free Software Foundation; either version 3, or (at your option)
 
32408
+;; any later version.
 
32409
+;;
 
32410
+;; GCC is distributed in the hope that it will be useful, but
 
32411
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
 
32412
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
32413
+;; General Public License for more details.
 
32414
+;;
 
32415
+;; You should have received a copy of the GNU General Public License
 
32416
+;; along with GCC; see the file COPYING3.  If not see
 
32417
+;; <http://www.gnu.org/licenses/>.
 
32418
+
 
32419
+(define_automaton "cortex_a53")
 
32420
+
 
32421
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32422
+;; Functional units.
 
32423
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32424
+
 
32425
+;; There are two main integer execution pipelines, described as
 
32426
+;; slot 0 and issue slot 1.
 
32427
+
 
32428
+(define_cpu_unit "cortex_a53_slot0" "cortex_a53")
 
32429
+(define_cpu_unit "cortex_a53_slot1" "cortex_a53")
 
32430
+
 
32431
+(define_reservation "cortex_a53_slot_any" "cortex_a53_slot0|cortex_a53_slot1")
 
32432
+(define_reservation "cortex_a53_single_issue" "cortex_a53_slot0+cortex_a53_slot1")
 
32433
+
 
32434
+;; The load/store pipeline.  Load/store instructions can dual-issue from
 
32435
+;; either pipeline, but two load/stores cannot simultaneously issue.
 
32436
+
 
32437
+(define_cpu_unit "cortex_a53_ls" "cortex_a53")
 
32438
+
 
32439
+;; The store pipeline.  Shared between both execution pipelines.
 
32440
+
 
32441
+(define_cpu_unit "cortex_a53_store" "cortex_a53")
 
32442
+
 
32443
+;; The branch pipeline.  Branches can dual-issue with other instructions
 
32444
+;; (except when those instructions take multiple cycles to issue).
 
32445
+
 
32446
+(define_cpu_unit "cortex_a53_branch" "cortex_a53")
 
32447
+
 
32448
+;; The integer divider.
 
32449
+
 
32450
+(define_cpu_unit "cortex_a53_idiv" "cortex_a53")
 
32451
+
 
32452
+;; The floating-point add pipeline used to model the usage
 
32453
+;; of the add pipeline by fmac instructions.
 
32454
+
 
32455
+(define_cpu_unit "cortex_a53_fpadd_pipe" "cortex_a53")
 
32456
+
 
32457
+;; Floating-point div/sqrt (long latency, out-of-order completion).
 
32458
+
 
32459
+(define_cpu_unit "cortex_a53_fp_div_sqrt" "cortex_a53")
 
32460
+
 
32461
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32462
+;; ALU instructions.
 
32463
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32464
+
 
32465
+(define_insn_reservation "cortex_a53_alu" 2
 
32466
+  (and (eq_attr "tune" "cortexa53")
 
32467
+       (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
32468
+                        mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
32469
+  "cortex_a53_slot_any")
 
32470
+
 
32471
+(define_insn_reservation "cortex_a53_alu_shift" 2
 
32472
+  (and (eq_attr "tune" "cortexa53")
 
32473
+       (eq_attr "type" "arlo_shift,arlo_shift_reg,\
 
32474
+                        mov_shift,mov_shift_reg,\
 
32475
+                        mvn_shift,mvn_shift_reg"))
 
32476
+  "cortex_a53_slot_any")
 
32477
+
 
32478
+;; Forwarding path for unshifted operands.
 
32479
+
 
32480
+(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift"
 
32481
+  "cortex_a53_alu")
 
32482
+
 
32483
+(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift"
 
32484
+  "cortex_a53_alu_shift"
 
32485
+  "arm_no_early_alu_shift_dep")
 
32486
+
 
32487
+;; The multiplier pipeline can forward results so there's no need to specify
 
32488
+;; bypasses. Multiplies can only single-issue currently.
 
32489
+
 
32490
+(define_insn_reservation "cortex_a53_mul" 3
 
32491
+  (and (eq_attr "tune" "cortexa53")
 
32492
+       (ior (eq_attr "mul32" "yes")
 
32493
+            (eq_attr "mul64" "yes")))
 
32494
+  "cortex_a53_single_issue")
 
32495
+
 
32496
+;; A multiply with a single-register result or an MLA, followed by an
 
32497
+;; MLA with an accumulator dependency, has its result forwarded so two
 
32498
+;; such instructions can issue back-to-back.
 
32499
+
 
32500
+(define_bypass 1 "cortex_a53_mul"
 
32501
+               "cortex_a53_mul"
 
32502
+               "arm_mac_accumulator_is_mul_result")
 
32503
+
 
32504
+;; Punt with a high enough latency for divides.
 
32505
+(define_insn_reservation "cortex_a53_udiv" 8
 
32506
+  (and (eq_attr "tune" "cortexa53")
 
32507
+       (eq_attr "type" "udiv"))
 
32508
+  "(cortex_a53_slot0+cortex_a53_idiv),cortex_a53_idiv*7")
 
32509
+
 
32510
+(define_insn_reservation "cortex_a53_sdiv" 9
 
32511
+  (and (eq_attr "tune" "cortexa53")
 
32512
+       (eq_attr "type" "sdiv"))
 
32513
+  "(cortex_a53_slot0+cortex_a53_idiv),cortex_a53_idiv*8")
 
32514
+
 
32515
+
 
32516
+(define_bypass 2 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv"
 
32517
+               "cortex_a53_alu")
 
32518
+(define_bypass 2 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv"
 
32519
+               "cortex_a53_alu_shift"
 
32520
+               "arm_no_early_alu_shift_dep")
 
32521
+
 
32522
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32523
+;; Load/store instructions.
 
32524
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32525
+
 
32526
+;; Address-generation happens in the issue stage.
 
32527
+
 
32528
+(define_insn_reservation "cortex_a53_load1" 3
 
32529
+  (and (eq_attr "tune" "cortexa53")
 
32530
+       (eq_attr "type" "load_byte,load1"))
 
32531
+  "cortex_a53_slot_any+cortex_a53_ls")
 
32532
+
 
32533
+(define_insn_reservation "cortex_a53_store1" 2
 
32534
+  (and (eq_attr "tune" "cortexa53")
 
32535
+       (eq_attr "type" "store1"))
 
32536
+  "cortex_a53_slot_any+cortex_a53_ls+cortex_a53_store")
 
32537
+
 
32538
+(define_insn_reservation "cortex_a53_load2" 3
 
32539
+  (and (eq_attr "tune" "cortexa53")
 
32540
+       (eq_attr "type" "load2"))
 
32541
+  "cortex_a53_single_issue+cortex_a53_ls")
 
32542
+
 
32543
+(define_insn_reservation "cortex_a53_store2" 2
 
32544
+  (and (eq_attr "tune" "cortexa53")
 
32545
+       (eq_attr "type" "store2"))
 
32546
+  "cortex_a53_single_issue+cortex_a53_ls+cortex_a53_store")
 
32547
+
 
32548
+(define_insn_reservation "cortex_a53_load3plus" 4
 
32549
+  (and (eq_attr "tune" "cortexa53")
 
32550
+       (eq_attr "type" "load3,load4"))
 
32551
+  "(cortex_a53_single_issue+cortex_a53_ls)*2")
 
32552
+
 
32553
+(define_insn_reservation "cortex_a53_store3plus" 3
 
32554
+  (and (eq_attr "tune" "cortexa53")
 
32555
+       (eq_attr "type" "store3,store4"))
 
32556
+  "(cortex_a53_single_issue+cortex_a53_ls+cortex_a53_store)*2")
 
32557
+
 
32558
+;; Load/store addresses are required early in Issue.
 
32559
+(define_bypass 3 "cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus,cortex_a53_alu,cortex_a53_alu_shift"
 
32560
+                 "cortex_a53_load*"
 
32561
+                 "arm_early_load_addr_dep")
 
32562
+(define_bypass 3 "cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus,cortex_a53_alu,cortex_a53_alu_shift"
 
32563
+                 "cortex_a53_store*"
 
32564
+                 "arm_early_store_addr_dep")
 
32565
+
 
32566
+;; Load data can forward in the ALU pipeline
 
32567
+(define_bypass 2 "cortex_a53_load1,cortex_a53_load2"
 
32568
+               "cortex_a53_alu")
 
32569
+(define_bypass 2 "cortex_a53_load1,cortex_a53_load2"
 
32570
+               "cortex_a53_alu_shift"
 
32571
+               "arm_no_early_alu_shift_dep")
 
32572
+
 
32573
+;; ALU ops can forward to stores.
 
32574
+(define_bypass 0 "cortex_a53_alu,cortex_a53_alu_shift"
 
32575
+                 "cortex_a53_store1,cortex_a53_store2,cortex_a53_store3plus"
 
32576
+                 "arm_no_early_store_addr_dep")
 
32577
+
 
32578
+(define_bypass 1 "cortex_a53_mul,cortex_a53_udiv,cortex_a53_sdiv,cortex_a53_load1,cortex_a53_load2,cortex_a53_load3plus"
 
32579
+                 "cortex_a53_store1,cortex_a53_store2,cortex_a53_store3plus"
 
32580
+                 "arm_no_early_store_addr_dep")
 
32581
+
 
32582
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32583
+;; Branches.
 
32584
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32585
+
 
32586
+;; Currently models all branches as dual-issuable from either execution
 
32587
+;; slot, which isn't true for all cases. We still need to model indirect
 
32588
+;; branches.
 
32589
+
 
32590
+(define_insn_reservation "cortex_a53_branch" 0
 
32591
+  (and (eq_attr "tune" "cortexa53")
 
32592
+       (eq_attr "type" "branch,call"))
 
32593
+  "cortex_a53_slot_any+cortex_a53_branch")
 
32594
+
 
32595
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32596
+;; Floating-point arithmetic.
 
32597
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32598
+
 
32599
+(define_insn_reservation "cortex_a53_fpalu" 4
 
32600
+  (and (eq_attr "tune" "cortexa53")
 
32601
+       (eq_attr "type" "ffariths, fadds, ffarithd, faddd, fcpys, fmuls, f_cvt,\
 
32602
+                       fcmps, fcmpd"))
 
32603
+  "cortex_a53_slot0+cortex_a53_fpadd_pipe")
 
32604
+
 
32605
+(define_insn_reservation "cortex_a53_fconst" 2
 
32606
+  (and (eq_attr "tune" "cortexa53")
 
32607
+       (eq_attr "type" "fconsts,fconstd"))
 
32608
+  "cortex_a53_slot0+cortex_a53_fpadd_pipe")
 
32609
+
 
32610
+(define_insn_reservation "cortex_a53_fpmul" 4
 
32611
+  (and (eq_attr "tune" "cortexa53")
 
32612
+       (eq_attr "type" "fmuls,fmuld"))
 
32613
+  "cortex_a53_slot0")
 
32614
+
 
32615
+;; For single-precision multiply-accumulate, the add (accumulate) is issued after
 
32616
+;; the multiply completes. Model that accordingly.
 
32617
+
 
32618
+(define_insn_reservation "cortex_a53_fpmac" 8
 
32619
+  (and (eq_attr "tune" "cortexa53")
 
32620
+       (eq_attr "type" "fmacs,fmacd,ffmas,ffmad"))
 
32621
+  "cortex_a53_slot0, nothing*3, cortex_a53_fpadd_pipe")
 
32622
+
 
32623
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32624
+;; Floating-point divide/square root instructions.
 
32625
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32626
+;; fsqrt really takes one cycle less, but that is not modelled.
 
32627
+
 
32628
+(define_insn_reservation "cortex_a53_fdivs" 14
 
32629
+  (and (eq_attr "tune" "cortexa53")
 
32630
+       (eq_attr "type" "fdivs"))
 
32631
+  "cortex_a53_slot0, cortex_a53_fp_div_sqrt * 13")
 
32632
+
 
32633
+(define_insn_reservation "cortex_a53_fdivd" 29
 
32634
+  (and (eq_attr "tune" "cortexa53")
 
32635
+       (eq_attr "type" "fdivd"))
 
32636
+  "cortex_a53_slot0, cortex_a53_fp_div_sqrt * 28")
 
32637
+
 
32638
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32639
+;; VFP to/from core transfers.
 
32640
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32641
+
 
32642
+(define_insn_reservation "cortex_a53_r2f" 4
 
32643
+  (and (eq_attr "tune" "cortexa53")
 
32644
+       (eq_attr "type" "r_2_f"))
 
32645
+  "cortex_a53_slot0")
 
32646
+
 
32647
+(define_insn_reservation "cortex_a53_f2r" 2
 
32648
+  (and (eq_attr "tune" "cortexa53")
 
32649
+       (eq_attr "type" "f_2_r"))
 
32650
+  "cortex_a53_slot0")
 
32651
+
 
32652
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32653
+;; VFP flag transfer.
 
32654
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32655
+
 
32656
+(define_insn_reservation "cortex_a53_f_flags" 4
 
32657
+  (and (eq_attr "tune" "cortexa53")
 
32658
+       (eq_attr "type" "f_flag"))
 
32659
+  "cortex_a53_slot0")
 
32660
+
 
32661
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32662
+;; VFP load/store.
 
32663
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
32664
+
 
32665
+(define_insn_reservation "cortex_a53_f_loads" 4
 
32666
+  (and (eq_attr "tune" "cortexa53")
 
32667
+       (eq_attr "type" "f_loads"))
 
32668
+  "cortex_a53_slot0")
 
32669
+
 
32670
+(define_insn_reservation "cortex_a53_f_loadd" 5
 
32671
+  (and (eq_attr "tune" "cortexa53")
 
32672
+       (eq_attr "type" "f_loadd"))
 
32673
+  "cortex_a53_slot0")
 
32674
+
 
32675
+(define_insn_reservation "cortex_a53_f_stores" 0
 
32676
+  (and (eq_attr "tune" "cortexa53")
 
32677
+       (eq_attr "type" "f_stores"))
 
32678
+  "cortex_a53_slot0")
 
32679
+
 
32680
+(define_insn_reservation "cortex_a53_f_stored" 0
 
32681
+  (and (eq_attr "tune" "cortexa53")
 
32682
+       (eq_attr "type" "f_stored"))
 
32683
+  "cortex_a53_slot0")
 
32684
+
 
32685
+;; Load-to-use for floating-point values has a penalty of one cycle,
 
32686
+;; i.e. a latency of two.
 
32687
+
 
32688
+(define_bypass 2 "cortex_a53_f_loads"
 
32689
+                 "cortex_a53_fpalu, cortex_a53_fpmac, cortex_a53_fpmul,\
 
32690
+                 cortex_a53_fdivs, cortex_a53_fdivd,\
 
32691
+                 cortex_a53_f2r")
 
32692
+
 
32693
+(define_bypass 2 "cortex_a53_f_loadd"
 
32694
+                 "cortex_a53_fpalu, cortex_a53_fpmac, cortex_a53_fpmul,\
 
32695
+                 cortex_a53_fdivs, cortex_a53_fdivd,\
 
32696
+                 cortex_a53_f2r")
 
32697
+
 
32698
--- a/src/gcc/config/arm/bpabi.h
 
32699
+++ b/src/gcc/config/arm/bpabi.h
 
32700
@@ -60,6 +60,7 @@
 
32701
    |mcpu=cortex-a7                                      \
 
32702
    |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15       \
 
32703
    |mcpu=marvell-pj4                                   \
 
32704
+   |mcpu=cortex-a53                                    \
 
32705
    |mcpu=generic-armv7-a                                \
 
32706
    |march=armv7-m|mcpu=cortex-m3                        \
 
32707
    |march=armv7e-m|mcpu=cortex-m4                       \
 
32708
@@ -71,6 +72,7 @@
 
32709
   " %{mbig-endian:%{march=armv7-a|mcpu=cortex-a5        \
 
32710
    |mcpu=cortex-a7                                      \
 
32711
    |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15       \
 
32712
+   |mcpu=cortex-a53                                    \
 
32713
    |mcpu=marvell-pj4                                   \
 
32714
    |mcpu=generic-armv7-a                                \
 
32715
    |march=armv7-m|mcpu=cortex-m3                        \
 
32716
--- a/src/gcc/config/arm/marvell-f-iwmmxt.md
 
32717
+++ b/src/gcc/config/arm/marvell-f-iwmmxt.md
 
32718
@@ -63,52 +63,62 @@
 
32719
 ;; An attribute appended to instructions for classification
 
32720
 
 
32721
 (define_attr "wmmxt_shift" "yes,no"
 
32722
-  (if_then_else (eq_attr "wtype" "wror, wsll, wsra, wsrl")
 
32723
+  (if_then_else (eq_attr "type" "wmmx_wror, wmmx_wsll, wmmx_wsra, wmmx_wsrl")
 
32724
                (const_string "yes") (const_string "no"))
 
32725
 )
 
32726
 
 
32727
 (define_attr "wmmxt_pack" "yes,no"
 
32728
-  (if_then_else (eq_attr "wtype" "waligni, walignr, wmerge, wpack, wshufh, wunpckeh, wunpckih, wunpckel, wunpckil")
 
32729
+  (if_then_else (eq_attr "type" "wmmx_waligni, wmmx_walignr, wmmx_wmerge,\
 
32730
+                                 wmmx_wpack, wmmx_wshufh, wmmx_wunpckeh,\
 
32731
+                                 wmmx_wunpckih, wmmx_wunpckel, wmmx_wunpckil")
 
32732
                (const_string "yes") (const_string "no"))
 
32733
 )
 
32734
 
 
32735
 (define_attr "wmmxt_mult_c1" "yes,no"
 
32736
-  (if_then_else (eq_attr "wtype" "wmac, wmadd, wmiaxy, wmiawxy, wmulw, wqmiaxy, wqmulwm")
 
32737
+  (if_then_else (eq_attr "type" "wmmx_wmac, wmmx_wmadd, wmmx_wmiaxy,\
 
32738
+                                 wmmx_wmiawxy, wmmx_wmulw, wmmx_wqmiaxy,\
 
32739
+                                 wmmx_wqmulwm")
 
32740
                (const_string "yes") (const_string "no"))
 
32741
 )
 
32742
 
 
32743
 (define_attr "wmmxt_mult_c2" "yes,no"
 
32744
-  (if_then_else (eq_attr "wtype" "wmul, wqmulm")
 
32745
+  (if_then_else (eq_attr "type" "wmmx_wmul, wmmx_wqmulm")
 
32746
                (const_string "yes") (const_string "no"))
 
32747
 )
 
32748
 
 
32749
 (define_attr "wmmxt_alu_c1" "yes,no"
 
32750
-  (if_then_else (eq_attr "wtype" "wabs, wabsdiff, wand, wandn, wmov, wor, wxor")
 
32751
+  (if_then_else (eq_attr "type" "wmmx_wabs, wmmx_wabsdiff, wmmx_wand,\
 
32752
+                                 wmmx_wandn, wmmx_wmov, wmmx_wor, wmmx_wxor")
 
32753
                (const_string "yes") (const_string "no"))
 
32754
 )
 
32755
 
 
32756
 (define_attr "wmmxt_alu_c2" "yes,no"
 
32757
-  (if_then_else (eq_attr "wtype" "wacc, wadd, waddsubhx, wavg2, wavg4, wcmpeq, wcmpgt, wmax, wmin, wsub, waddbhus, wsubaddhx")
 
32758
+  (if_then_else (eq_attr "type" "wmmx_wacc, wmmx_wadd, wmmx_waddsubhx,\
 
32759
+                                 wmmx_wavg2, wmmx_wavg4, wmmx_wcmpeq,\
 
32760
+                                 wmmx_wcmpgt, wmmx_wmax, wmmx_wmin,\
 
32761
+                                 wmmx_wsub, wmmx_waddbhus, wmmx_wsubaddhx")
 
32762
                (const_string "yes") (const_string "no"))
 
32763
 )
 
32764
 
 
32765
 (define_attr "wmmxt_alu_c3" "yes,no"
 
32766
-  (if_then_else (eq_attr "wtype" "wsad")
 
32767
+  (if_then_else (eq_attr "type" "wmmx_wsad")
 
32768
                (const_string "yes") (const_string "no"))
 
32769
 )
 
32770
 
 
32771
 (define_attr "wmmxt_transfer_c1" "yes,no"
 
32772
-  (if_then_else (eq_attr "wtype" "tbcst, tinsr, tmcr, tmcrr")
 
32773
+  (if_then_else (eq_attr "type" "wmmx_tbcst, wmmx_tinsr,\
 
32774
+                                 wmmx_tmcr, wmmx_tmcrr")
 
32775
                 (const_string "yes") (const_string "no"))
 
32776
 )
 
32777
 
 
32778
 (define_attr "wmmxt_transfer_c2" "yes,no"
 
32779
-  (if_then_else (eq_attr "wtype" "textrm, tmovmsk, tmrc, tmrrc")
 
32780
+  (if_then_else (eq_attr "type" "wmmx_textrm, wmmx_tmovmsk,\
 
32781
+                                 wmmx_tmrc, wmmx_tmrrc")
 
32782
                (const_string "yes") (const_string "no"))
 
32783
 )
 
32784
 
 
32785
 (define_attr "wmmxt_transfer_c3" "yes,no"
 
32786
-  (if_then_else (eq_attr "wtype" "tmia, tmiaph, tmiaxy")
 
32787
+  (if_then_else (eq_attr "type" "wmmx_tmia, wmmx_tmiaph, wmmx_tmiaxy")
 
32788
                (const_string "yes") (const_string "no"))
 
32789
 )
 
32790
 
 
32791
@@ -169,11 +179,11 @@
 
32792
 
 
32793
 (define_insn_reservation "marvell_f_iwmmxt_wstr" 0
 
32794
   (and (eq_attr "marvell_f_iwmmxt" "yes")
 
32795
-       (eq_attr "wtype" "wstr"))
 
32796
+       (eq_attr "type" "wmmx_wstr"))
 
32797
   "mf_iwmmxt_pipeline")
 
32798
 
 
32799
 ;There is a forwarding path from MW stage
 
32800
 (define_insn_reservation "marvell_f_iwmmxt_wldr" 5
 
32801
   (and (eq_attr "marvell_f_iwmmxt" "yes")
 
32802
-       (eq_attr "wtype" "wldr"))
 
32803
+       (eq_attr "type" "wmmx_wldr"))
 
32804
   "mf_iwmmxt_pipeline")
 
32805
--- a/src/gcc/config/arm/iterators.md
 
32806
+++ b/src/gcc/config/arm/iterators.md
 
32807
@@ -496,3 +496,11 @@
 
32808
 (define_int_attr nvrint_variant [(UNSPEC_NVRINTZ "z") (UNSPEC_NVRINTP "p")
 
32809
                                 (UNSPEC_NVRINTA "a") (UNSPEC_NVRINTM "m")
 
32810
                                 (UNSPEC_NVRINTX "x") (UNSPEC_NVRINTN "n")])
 
32811
+;; Both kinds of return insn.
 
32812
+(define_code_iterator returns [return simple_return])
 
32813
+(define_code_attr return_str [(return "") (simple_return "simple_")])
 
32814
+(define_code_attr return_simple_p [(return "false") (simple_return "true")])
 
32815
+(define_code_attr return_cond_false [(return " && USE_RETURN_INSN (FALSE)")
 
32816
+                               (simple_return " && use_simple_return_p ()")])
 
32817
+(define_code_attr return_cond_true [(return " && USE_RETURN_INSN (TRUE)")
 
32818
+                               (simple_return " && use_simple_return_p ()")])
 
32819
--- a/src/gcc/config/arm/sync.md
 
32820
+++ b/src/gcc/config/arm/sync.md
 
32821
@@ -65,6 +65,42 @@
 
32822
    (set_attr "conds" "unconditional")
 
32823
    (set_attr "predicable" "no")])
 
32824
 
 
32825
+(define_insn "atomic_load<mode>"
 
32826
+  [(set (match_operand:QHSI 0 "register_operand" "=r")
 
32827
+    (unspec_volatile:QHSI
 
32828
+      [(match_operand:QHSI 1 "arm_sync_memory_operand" "Q")
 
32829
+       (match_operand:SI 2 "const_int_operand")]               ;; model
 
32830
+      VUNSPEC_LDA))]
 
32831
+  "TARGET_HAVE_LDACQ"
 
32832
+  {
 
32833
+    enum memmodel model = (enum memmodel) INTVAL (operands[2]);
 
32834
+    if (model == MEMMODEL_RELAXED
 
32835
+        || model == MEMMODEL_CONSUME
 
32836
+        || model == MEMMODEL_RELEASE)
 
32837
+      return \"ldr<sync_sfx>\\t%0, %1\";
 
32838
+    else
 
32839
+      return \"lda<sync_sfx>\\t%0, %1\";
 
32840
+  }
 
32841
+)
 
32842
+
 
32843
+(define_insn "atomic_store<mode>"
 
32844
+  [(set (match_operand:QHSI 0 "memory_operand" "=Q")
 
32845
+    (unspec_volatile:QHSI
 
32846
+      [(match_operand:QHSI 1 "general_operand" "r")
 
32847
+       (match_operand:SI 2 "const_int_operand")]               ;; model
 
32848
+      VUNSPEC_STL))]
 
32849
+  "TARGET_HAVE_LDACQ"
 
32850
+  {
 
32851
+    enum memmodel model = (enum memmodel) INTVAL (operands[2]);
 
32852
+    if (model == MEMMODEL_RELAXED
 
32853
+        || model == MEMMODEL_CONSUME
 
32854
+        || model == MEMMODEL_ACQUIRE)
 
32855
+      return \"str<sync_sfx>\t%1, %0\";
 
32856
+    else
 
32857
+      return \"stl<sync_sfx>\t%1, %0\";
 
32858
+  }
 
32859
+)
 
32860
+
 
32861
 ;; Note that ldrd and vldr are *not* guaranteed to be single-copy atomic,
 
32862
 ;; even for a 64-bit aligned address.  Instead we use a ldrexd unparied
 
32863
 ;; with a store.
 
32864
@@ -88,7 +124,8 @@
 
32865
                   UNSPEC_LL))]
 
32866
   "TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN"
 
32867
   "ldrexd%?\t%0, %H0, %C1"
 
32868
-  [(set_attr "predicable" "yes")])
 
32869
+  [(set_attr "predicable" "yes")
 
32870
+   (set_attr "predicable_short_it" "no")])
 
32871
 
 
32872
 (define_expand "atomic_compare_and_swap<mode>"
 
32873
   [(match_operand:SI 0 "s_register_operand" "")                ;; bool out
 
32874
@@ -325,8 +362,20 @@
 
32875
            VUNSPEC_LL)))]
 
32876
   "TARGET_HAVE_LDREXBH"
 
32877
   "ldrex<sync_sfx>%?\t%0, %C1"
 
32878
-  [(set_attr "predicable" "yes")])
 
32879
+  [(set_attr "predicable" "yes")
 
32880
+   (set_attr "predicable_short_it" "no")])
 
32881
 
 
32882
+(define_insn "arm_load_acquire_exclusive<mode>"
 
32883
+  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
32884
+        (zero_extend:SI
 
32885
+         (unspec_volatile:NARROW
 
32886
+           [(match_operand:NARROW 1 "mem_noofs_operand" "Ua")]
 
32887
+           VUNSPEC_LAX)))]
 
32888
+  "TARGET_HAVE_LDACQ"
 
32889
+  "ldaex<sync_sfx>%?\\t%0, %C1"
 
32890
+  [(set_attr "predicable" "yes")
 
32891
+   (set_attr "predicable_short_it" "no")])
 
32892
+
 
32893
 (define_insn "arm_load_exclusivesi"
 
32894
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
32895
        (unspec_volatile:SI
 
32896
@@ -334,8 +383,19 @@
 
32897
          VUNSPEC_LL))]
 
32898
   "TARGET_HAVE_LDREX"
 
32899
   "ldrex%?\t%0, %C1"
 
32900
-  [(set_attr "predicable" "yes")])
 
32901
+  [(set_attr "predicable" "yes")
 
32902
+   (set_attr "predicable_short_it" "no")])
 
32903
 
 
32904
+(define_insn "arm_load_acquire_exclusivesi"
 
32905
+  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
32906
+       (unspec_volatile:SI
 
32907
+         [(match_operand:SI 1 "mem_noofs_operand" "Ua")]
 
32908
+         VUNSPEC_LAX))]
 
32909
+  "TARGET_HAVE_LDACQ"
 
32910
+  "ldaex%?\t%0, %C1"
 
32911
+  [(set_attr "predicable" "yes")
 
32912
+   (set_attr "predicable_short_it" "no")])
 
32913
+
 
32914
 (define_insn "arm_load_exclusivedi"
 
32915
   [(set (match_operand:DI 0 "s_register_operand" "=r")
 
32916
        (unspec_volatile:DI
 
32917
@@ -343,8 +403,19 @@
 
32918
          VUNSPEC_LL))]
 
32919
   "TARGET_HAVE_LDREXD"
 
32920
   "ldrexd%?\t%0, %H0, %C1"
 
32921
-  [(set_attr "predicable" "yes")])
 
32922
+  [(set_attr "predicable" "yes")
 
32923
+   (set_attr "predicable_short_it" "no")])
 
32924
 
 
32925
+(define_insn "arm_load_acquire_exclusivedi"
 
32926
+  [(set (match_operand:DI 0 "s_register_operand" "=r")
 
32927
+       (unspec_volatile:DI
 
32928
+         [(match_operand:DI 1 "mem_noofs_operand" "Ua")]
 
32929
+         VUNSPEC_LAX))]
 
32930
+  "TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN"
 
32931
+  "ldaexd%?\t%0, %H0, %C1"
 
32932
+  [(set_attr "predicable" "yes")
 
32933
+   (set_attr "predicable_short_it" "no")])
 
32934
+
 
32935
 (define_insn "arm_store_exclusive<mode>"
 
32936
   [(set (match_operand:SI 0 "s_register_operand" "=&r")
 
32937
        (unspec_volatile:SI [(const_int 0)] VUNSPEC_SC))
 
32938
@@ -367,4 +438,35 @@
 
32939
       }
 
32940
     return "strex<sync_sfx>%?\t%0, %2, %C1";
 
32941
   }
 
32942
-  [(set_attr "predicable" "yes")])
 
32943
+  [(set_attr "predicable" "yes")
 
32944
+   (set_attr "predicable_short_it" "no")])
 
32945
+
 
32946
+(define_insn "arm_store_release_exclusivedi"
 
32947
+  [(set (match_operand:SI 0 "s_register_operand" "=&r")
 
32948
+       (unspec_volatile:SI [(const_int 0)] VUNSPEC_SLX))
 
32949
+   (set (match_operand:DI 1 "mem_noofs_operand" "=Ua")
 
32950
+       (unspec_volatile:DI
 
32951
+         [(match_operand:DI 2 "s_register_operand" "r")]
 
32952
+         VUNSPEC_SLX))]
 
32953
+  "TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN"
 
32954
+  {
 
32955
+    rtx value = operands[2];
 
32956
+    /* See comment in arm_store_exclusive<mode> above.  */
 
32957
+    gcc_assert ((REGNO (value) & 1) == 0 || TARGET_THUMB2);
 
32958
+    operands[3] = gen_rtx_REG (SImode, REGNO (value) + 1);
 
32959
+    return "stlexd%?\t%0, %2, %3, %C1";
 
32960
+  }
 
32961
+  [(set_attr "predicable" "yes")
 
32962
+   (set_attr "predicable_short_it" "no")])
 
32963
+
 
32964
+(define_insn "arm_store_release_exclusive<mode>"
 
32965
+  [(set (match_operand:SI 0 "s_register_operand" "=&r")
 
32966
+       (unspec_volatile:SI [(const_int 0)] VUNSPEC_SLX))
 
32967
+   (set (match_operand:QHSI 1 "mem_noofs_operand" "=Ua")
 
32968
+       (unspec_volatile:QHSI
 
32969
+         [(match_operand:QHSI 2 "s_register_operand" "r")]
 
32970
+         VUNSPEC_SLX))]
 
32971
+  "TARGET_HAVE_LDACQ"
 
32972
+  "stlex<sync_sfx>%?\t%0, %2, %C1"
 
32973
+  [(set_attr "predicable" "yes")
 
32974
+   (set_attr "predicable_short_it" "no")])
 
32975
--- a/src/gcc/config/arm/neon-testgen.ml
 
32976
+++ b/src/gcc/config/arm/neon-testgen.ml
 
32977
@@ -163,10 +163,12 @@
 
32978
     match List.find (fun feature ->
 
32979
                        match feature with Requires_feature _ -> true
 
32980
                                         | Requires_arch _ -> true
 
32981
+                                        | Requires_FP_bit 1 -> true
 
32982
                                         | _ -> false)
 
32983
                      features with
 
32984
       Requires_feature "FMA" -> "arm_neonv2"
 
32985
     | Requires_arch 8 -> "arm_v8_neon"
 
32986
+    | Requires_FP_bit 1 -> "arm_neon_fp16"
 
32987
     | _ -> assert false
 
32988
   with Not_found -> "arm_neon"
 
32989
 
 
32990
--- a/src/gcc/config/arm/fa726te.md
 
32991
+++ b/src/gcc/config/arm/fa726te.md
 
32992
@@ -78,15 +78,15 @@
 
32993
 ;; Move instructions.
 
32994
 (define_insn_reservation "726te_shift_op" 1
 
32995
   (and (eq_attr "tune" "fa726te")
 
32996
-       (eq_attr "insn" "mov,mvn"))
 
32997
+       (eq_attr "type" "mov_imm,mov_reg,mov_shift,mov_shift_reg,\
 
32998
+                        mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg"))
 
32999
   "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)")
 
33000
 
 
33001
 ;; ALU operations with no shifted operand will finished in 1 cycle
 
33002
 ;; Other ALU instructions 2 cycles.
 
33003
 (define_insn_reservation "726te_alu_op" 1
 
33004
  (and (eq_attr "tune" "fa726te")
 
33005
-      (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
33006
-           (not (eq_attr "insn" "mov,mvn"))))
 
33007
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg"))
 
33008
   "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)")
 
33009
 
 
33010
 ;; ALU operations with a shift-by-register operand.
 
33011
@@ -95,14 +95,12 @@
 
33012
 ;; it takes 3 cycles.
 
33013
 (define_insn_reservation "726te_alu_shift_op" 3
 
33014
  (and (eq_attr "tune" "fa726te")
 
33015
-      (and (eq_attr "type" "simple_alu_shift,alu_shift")
 
33016
-           (not (eq_attr "insn" "mov,mvn"))))
 
33017
+      (eq_attr "type" "extend,arlo_shift"))
 
33018
   "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)")
 
33019
 
 
33020
 (define_insn_reservation "726te_alu_shift_reg_op" 3
 
33021
  (and (eq_attr "tune" "fa726te")
 
33022
-      (and (eq_attr "type" "alu_shift_reg")
 
33023
-           (not (eq_attr "insn" "mov,mvn"))))
 
33024
+      (eq_attr "type" "arlo_shift_reg"))
 
33025
   "fa726te_issue+(fa726te_alu0_pipe|fa726te_alu1_pipe)")
 
33026
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
33027
 ;; Multiplication Instructions
 
33028
@@ -115,7 +113,7 @@
 
33029
 
 
33030
 (define_insn_reservation "726te_mult_op" 3
 
33031
  (and (eq_attr "tune" "fa726te")
 
33032
-      (eq_attr "insn" "smlalxy,mul,mla,muls,mlas,umull,umlal,smull,smlal,\
 
33033
+      (eq_attr "type" "smlalxy,mul,mla,muls,mlas,umull,umlal,smull,smlal,\
 
33034
                        umulls,umlals,smulls,smlals,smlawx,smulxy,smlaxy"))
 
33035
  "fa726te_issue+fa726te_mac_pipe")
 
33036
 
 
33037
--- a/src/gcc/config/arm/arm.md
 
33038
+++ b/src/gcc/config/arm/arm.md
 
33039
@@ -74,6 +74,15 @@
 
33040
 ; IS_THUMB1 is set to 'yes' iff we are generating Thumb-1 code.
 
33041
 (define_attr "is_thumb1" "no,yes" (const (symbol_ref "thumb1_code")))
 
33042
 
 
33043
+; We use this attribute to disable alternatives that can produce 32-bit
 
33044
+; instructions inside an IT-block in Thumb2 state.  ARMv8 deprecates IT blocks
 
33045
+; that contain 32-bit instructions.
 
33046
+(define_attr "enabled_for_depr_it" "no,yes" (const_string "yes"))
 
33047
+
 
33048
+; This attribute is used to disable a predicated alternative when we have
 
33049
+; arm_restrict_it.
 
33050
+(define_attr "predicable_short_it" "no,yes" (const_string "yes"))
 
33051
+
 
33052
 ;; Operand number of an input operand that is shifted.  Zero if the
 
33053
 ;; given instruction does not shift one of its input operands.
 
33054
 (define_attr "shift" "" (const_int 0))
 
33055
@@ -84,6 +93,8 @@
 
33056
 (define_attr "fpu" "none,vfp"
 
33057
   (const (symbol_ref "arm_fpu_attr")))
 
33058
 
 
33059
+(define_attr "predicated" "yes,no" (const_string "no"))
 
33060
+
 
33061
 ; LENGTH of an instruction (in bytes)
 
33062
 (define_attr "length" ""
 
33063
   (const_int 4))
 
33064
@@ -94,7 +105,7 @@
 
33065
 ; for ARM or Thumb-2 with arm_arch6, and nov6 for ARM without
 
33066
 ; arm_arch6.  This attribute is used to compute attribute "enabled",
 
33067
 ; use type "any" to enable an alternative in all cases.
 
33068
-(define_attr "arch" "any,a,t,32,t1,t2,v6,nov6,onlya8,neon_onlya8,nota8,neon_nota8,iwmmxt,iwmmxt2"
 
33069
+(define_attr "arch" "any,a,t,32,t1,t2,v6,nov6,neon_for_64bits,avoid_neon_for_64bits,iwmmxt,iwmmxt2"
 
33070
   (const_string "any"))
 
33071
 
 
33072
 (define_attr "arch_enabled" "no,yes"
 
33073
@@ -129,24 +140,16 @@
 
33074
              (match_test "TARGET_32BIT && !arm_arch6"))
 
33075
         (const_string "yes")
 
33076
 
 
33077
-        (and (eq_attr "arch" "onlya8")
 
33078
-             (eq_attr "tune" "cortexa8"))
 
33079
+        (and (eq_attr "arch" "avoid_neon_for_64bits")
 
33080
+             (match_test "TARGET_NEON")
 
33081
+             (not (match_test "TARGET_PREFER_NEON_64BITS")))
 
33082
         (const_string "yes")
 
33083
 
 
33084
-        (and (eq_attr "arch" "neon_onlya8")
 
33085
-             (eq_attr "tune" "cortexa8")
 
33086
-             (match_test "TARGET_NEON"))
 
33087
+        (and (eq_attr "arch" "neon_for_64bits")
 
33088
+             (match_test "TARGET_NEON")
 
33089
+             (match_test "TARGET_PREFER_NEON_64BITS"))
 
33090
         (const_string "yes")
 
33091
 
 
33092
-        (and (eq_attr "arch" "nota8")
 
33093
-             (not (eq_attr "tune" "cortexa8")))
 
33094
-        (const_string "yes")
 
33095
-
 
33096
-        (and (eq_attr "arch" "neon_nota8")
 
33097
-             (not (eq_attr "tune" "cortexa8"))
 
33098
-             (match_test "TARGET_NEON"))
 
33099
-        (const_string "yes")
 
33100
-
 
33101
         (and (eq_attr "arch" "iwmmxt2")
 
33102
              (match_test "TARGET_REALLY_IWMMXT2"))
 
33103
         (const_string "yes")]
 
33104
@@ -179,6 +182,15 @@
 
33105
    (cond [(eq_attr "insn_enabled" "no")
 
33106
          (const_string "no")
 
33107
 
 
33108
+         (and (eq_attr "predicable_short_it" "no")
 
33109
+              (and (eq_attr "predicated" "yes")
 
33110
+                   (match_test "arm_restrict_it")))
 
33111
+         (const_string "no")
 
33112
+
 
33113
+         (and (eq_attr "enabled_for_depr_it" "no")
 
33114
+              (match_test "arm_restrict_it"))
 
33115
+         (const_string "no")
 
33116
+
 
33117
          (eq_attr "arch_enabled" "no")
 
33118
          (const_string "no")
 
33119
 
 
33120
@@ -214,126 +226,340 @@
 
33121
   (set_attr "length" "4")
 
33122
   (set_attr "pool_range" "250")])
 
33123
 
 
33124
-;; The instruction used to implement a particular pattern.  This
 
33125
-;; information is used by pipeline descriptions to provide accurate
 
33126
-;; scheduling information.
 
33127
-
 
33128
-(define_attr "insn"
 
33129
-        "mov,mvn,smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals,smlawy,smuad,smuadx,smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,umaal,smlald,smlsld,clz,mrs,msr,xtab,sdiv,udiv,sat,other"
 
33130
-        (const_string "other"))
 
33131
-
 
33132
-; TYPE attribute is used to detect floating point instructions which, if
 
33133
-; running on a co-processor can run in parallel with other, basic instructions
 
33134
-; If write-buffer scheduling is enabled then it can also be used in the
 
33135
-; scheduling of writes.
 
33136
-
 
33137
-; Classification of each insn
 
33138
-; Note: vfp.md has different meanings for some of these, and some further
 
33139
-; types as well.  See that file for details.
 
33140
-; simple_alu_imm  a simple alu instruction that doesn't hit memory or fp
 
33141
-;               regs or have a shifted source operand and has an immediate
 
33142
-;               operand. This currently only tracks very basic immediate
 
33143
-;               alu operations.
 
33144
-; alu_reg       any alu instruction that doesn't hit memory or fp
 
33145
-;               regs or have a shifted source operand
 
33146
-;               and does not have an immediate operand. This is
 
33147
-;               also the default
 
33148
-; simple_alu_shift covers UXTH, UXTB, SXTH, SXTB
 
33149
-; alu_shift    any data instruction that doesn't hit memory or fp
 
33150
-;              regs, but has a source operand shifted by a constant
 
33151
-; alu_shift_reg        any data instruction that doesn't hit memory or fp
 
33152
-;              regs, but has a source operand shifted by a register value
 
33153
-; mult         a multiply instruction
 
33154
-; block                blockage insn, this blocks all functional units
 
33155
-; float                a floating point arithmetic operation (subject to expansion)
 
33156
-; fdivd                DFmode floating point division
 
33157
-; fdivs                SFmode floating point division
 
33158
-; f_load[sd]   A single/double load from memory. Used for VFP unit.
 
33159
-; f_store[sd]  A single/double store to memory. Used for VFP unit.
 
33160
-; f_flag       a transfer of co-processor flags to the CPSR
 
33161
-; f_2_r                transfer float to core (no memory needed)
 
33162
-; r_2_f                transfer core to float
 
33163
-; f_cvt                convert floating<->integral
 
33164
-; branch       a branch
 
33165
-; call         a subroutine call
 
33166
-; load_byte    load byte(s) from memory to arm registers
 
33167
-; load1                load 1 word from memory to arm registers
 
33168
-; load2         load 2 words from memory to arm registers
 
33169
-; load3         load 3 words from memory to arm registers
 
33170
-; load4         load 4 words from memory to arm registers
 
33171
-; store                store 1 word to memory from arm registers
 
33172
-; store2       store 2 words
 
33173
-; store3       store 3 words
 
33174
-; store4       store 4 (or more) words
 
33175
+; TYPE attribute is used to classify instructions for use in scheduling.
 
33176
 ;
 
33177
+; Instruction classification:
 
33178
+;
 
33179
+; arlo_imm           any arithmetic or logical instruction that doesn't have
 
33180
+;                    a shifted operand and has an immediate operand.  This
 
33181
+;                    excludes MOV, MVN and RSB(S) immediate.
 
33182
+; arlo_reg           any arithmetic or logical instruction that doesn't have
 
33183
+;                    a shifted or an immediate operand.  This excludes
 
33184
+;                    MOV and MVN but includes MOVT.  This is also the default.
 
33185
+; arlo_shift         any arithmetic or logical instruction that has a source
 
33186
+;                    operand shifted by a constant.  This excludes
 
33187
+;                    simple shifts.
 
33188
+; arlo_shift_reg     as arlo_shift, with the shift amount specified in a
 
33189
+;                    register.
 
33190
+; block              blockage insn, this blocks all functional units.
 
33191
+; branch             branch.
 
33192
+; call               subroutine call.
 
33193
+; clz                count leading zeros (CLZ).
 
33194
+; extend             extend instruction (SXTB, SXTH, UXTB, UXTH).
 
33195
+; f_2_r              transfer from float to core (no memory needed).
 
33196
+; f_cvt              conversion between float and integral.
 
33197
+; f_flag             transfer of co-processor flags to the CPSR.
 
33198
+; f_load[d,s]        double/single load from memory.  Used for VFP unit.
 
33199
+; f_minmax[d,s]      double/single floating point minimum/maximum.
 
33200
+; f_rint[d,s]        double/single floating point rount to integral.
 
33201
+; f_sel[d,s]         double/single floating byte select.
 
33202
+; f_store[d,s]       double/single store to memory.  Used for VFP unit.
 
33203
+; fadd[d,s]          double/single floating-point scalar addition.
 
33204
+; fcmp[d,s]          double/single floating-point compare.
 
33205
+; fconst[d,s]        double/single load immediate.
 
33206
+; fcpys              single precision floating point cpy.
 
33207
+; fdiv[d,s]          double/single precision floating point division.
 
33208
+; ffarith[d,s]       double/single floating point abs/neg/cpy.
 
33209
+; ffma[d,s]          double/single floating point fused multiply-accumulate.
 
33210
+; float              floating point arithmetic operation.
 
33211
+; fmac[d,s]          double/single floating point multiply-accumulate.
 
33212
+; fmul[d,s]          double/single floating point multiply.
 
33213
+; load_byte          load byte(s) from memory to arm registers.
 
33214
+; load1              load 1 word from memory to arm registers.
 
33215
+; load2              load 2 words from memory to arm registers.
 
33216
+; load3              load 3 words from memory to arm registers.
 
33217
+; load4              load 4 words from memory to arm registers.
 
33218
+; mla                integer multiply accumulate.
 
33219
+; mlas               integer multiply accumulate, flag setting.
 
33220
+; mov_imm            simple MOV instruction that moves an immediate to
 
33221
+;                    register.  This includes MOVW, but not MOVT.
 
33222
+; mov_reg            simple MOV instruction that moves a register to another
 
33223
+;                    register.  This includes MOVW, but not MOVT.
 
33224
+; mov_shift          simple MOV instruction, shifted operand by a constant.
 
33225
+; mov_shift_reg      simple MOV instruction, shifted operand by a register.
 
33226
+; mul                integer multiply.
 
33227
+; muls               integer multiply, flag setting.
 
33228
+; mvn_imm            inverting move instruction, immediate.
 
33229
+; mvn_reg            inverting move instruction, register.
 
33230
+; mvn_shift          inverting move instruction, shifted operand by a constant.
 
33231
+; mvn_shift_reg      inverting move instruction, shifted operand by a register.
 
33232
+; r_2_f              transfer from core to float.
 
33233
+; sdiv               signed division.
 
33234
+; shift              simple shift operation (LSL, LSR, ASR, ROR) with an
 
33235
+;                    immediate.
 
33236
+; shift_reg          simple shift by a register.
 
33237
+; smlad              signed multiply accumulate dual.
 
33238
+; smladx             signed multiply accumulate dual reverse.
 
33239
+; smlal              signed multiply accumulate long.
 
33240
+; smlald             signed multiply accumulate long dual.
 
33241
+; smlals             signed multiply accumulate long, flag setting.
 
33242
+; smlalxy            signed multiply accumulate, 16x16-bit, 64-bit accumulate.
 
33243
+; smlawx             signed multiply accumulate, 32x16-bit, 32-bit accumulate.
 
33244
+; smlawy             signed multiply accumulate wide, 32x16-bit,
 
33245
+;                    32-bit accumulate.
 
33246
+; smlaxy             signed multiply accumulate, 16x16-bit, 32-bit accumulate.
 
33247
+; smlsd              signed multiply subtract dual.
 
33248
+; smlsdx             signed multiply subtract dual reverse.
 
33249
+; smlsld             signed multiply subtract long dual.
 
33250
+; smmla              signed most significant word multiply accumulate.
 
33251
+; smmul              signed most significant word multiply.
 
33252
+; smmulr             signed most significant word multiply, rounded.
 
33253
+; smuad              signed dual multiply add.
 
33254
+; smuadx             signed dual multiply add reverse.
 
33255
+; smull              signed multiply long.
 
33256
+; smulls             signed multiply long, flag setting.
 
33257
+; smulwy             signed multiply wide, 32x16-bit, 32-bit accumulate.
 
33258
+; smulxy             signed multiply, 16x16-bit, 32-bit accumulate.
 
33259
+; smusd              signed dual multiply subtract.
 
33260
+; smusdx             signed dual multiply subtract reverse.
 
33261
+; store1             store 1 word to memory from arm registers.
 
33262
+; store2             store 2 words to memory from arm registers.
 
33263
+; store3             store 3 words to memory from arm registers.
 
33264
+; store4             store 4 (or more) words to memory from arm registers.
 
33265
+; udiv               unsigned division.
 
33266
+; umaal              unsigned multiply accumulate accumulate long.
 
33267
+; umlal              unsigned multiply accumulate long.
 
33268
+; umlals             unsigned multiply accumulate long, flag setting.
 
33269
+; umull              unsigned multiply long.
 
33270
+; umulls             unsigned multiply long, flag setting.
 
33271
+;
 
33272
+; The classification below is for instructions used by the Wireless MMX
 
33273
+; Technology. Each attribute value is used to classify an instruction of the
 
33274
+; same name or family.
 
33275
+;
 
33276
+; wmmx_tandc
 
33277
+; wmmx_tbcst
 
33278
+; wmmx_textrc
 
33279
+; wmmx_textrm
 
33280
+; wmmx_tinsr
 
33281
+; wmmx_tmcr
 
33282
+; wmmx_tmcrr
 
33283
+; wmmx_tmia
 
33284
+; wmmx_tmiaph
 
33285
+; wmmx_tmiaxy
 
33286
+; wmmx_tmrc
 
33287
+; wmmx_tmrrc
 
33288
+; wmmx_tmovmsk
 
33289
+; wmmx_torc
 
33290
+; wmmx_torvsc
 
33291
+; wmmx_wabs
 
33292
+; wmmx_wdiff
 
33293
+; wmmx_wacc
 
33294
+; wmmx_wadd
 
33295
+; wmmx_waddbhus
 
33296
+; wmmx_waddsubhx
 
33297
+; wmmx_waligni
 
33298
+; wmmx_walignr
 
33299
+; wmmx_wand
 
33300
+; wmmx_wandn
 
33301
+; wmmx_wavg2
 
33302
+; wmmx_wavg4
 
33303
+; wmmx_wcmpeq
 
33304
+; wmmx_wcmpgt
 
33305
+; wmmx_wmac
 
33306
+; wmmx_wmadd
 
33307
+; wmmx_wmax
 
33308
+; wmmx_wmerge
 
33309
+; wmmx_wmiawxy
 
33310
+; wmmx_wmiaxy
 
33311
+; wmmx_wmin
 
33312
+; wmmx_wmov
 
33313
+; wmmx_wmul
 
33314
+; wmmx_wmulw
 
33315
+; wmmx_wldr
 
33316
+; wmmx_wor
 
33317
+; wmmx_wpack
 
33318
+; wmmx_wqmiaxy
 
33319
+; wmmx_wqmulm
 
33320
+; wmmx_wqmulwm
 
33321
+; wmmx_wror
 
33322
+; wmmx_wsad
 
33323
+; wmmx_wshufh
 
33324
+; wmmx_wsll
 
33325
+; wmmx_wsra
 
33326
+; wmmx_wsrl
 
33327
+; wmmx_wstr
 
33328
+; wmmx_wsub
 
33329
+; wmmx_wsubaddhx
 
33330
+; wmmx_wunpckeh
 
33331
+; wmmx_wunpckel
 
33332
+; wmmx_wunpckih
 
33333
+; wmmx_wunpckil
 
33334
+; wmmx_wxor
 
33335
 
 
33336
 (define_attr "type"
 
33337
- "simple_alu_imm,\
 
33338
-  alu_reg,\
 
33339
-  simple_alu_shift,\
 
33340
-  alu_shift,\
 
33341
-  alu_shift_reg,\
 
33342
-  mult,\
 
33343
+ "arlo_imm,\
 
33344
+  arlo_reg,\
 
33345
+  arlo_shift,\
 
33346
+  arlo_shift_reg,\
 
33347
   block,\
 
33348
-  float,\
 
33349
+  branch,\
 
33350
+  call,\
 
33351
+  clz,\
 
33352
+  extend,\
 
33353
+  f_2_r,\
 
33354
+  f_cvt,\
 
33355
+  f_flag,\
 
33356
+  f_loadd,\
 
33357
+  f_loads,\
 
33358
+  f_minmaxd,\
 
33359
+  f_minmaxs,\
 
33360
+  f_rintd,\
 
33361
+  f_rints,\
 
33362
+  f_seld,\
 
33363
+  f_sels,\
 
33364
+  f_stored,\
 
33365
+  f_stores,\
 
33366
+  faddd,\
 
33367
+  fadds,\
 
33368
+  fcmpd,\
 
33369
+  fcmps,\
 
33370
+  fconstd,\
 
33371
+  fconsts,\
 
33372
+  fcpys,\
 
33373
   fdivd,\
 
33374
   fdivs,\
 
33375
+  ffarithd,\
 
33376
+  ffariths,\
 
33377
+  ffmad,\
 
33378
+  ffmas,\
 
33379
+  float,\
 
33380
+  fmacd,\
 
33381
+  fmacs,\
 
33382
+  fmuld,\
 
33383
   fmuls,\
 
33384
-  fmuld,\
 
33385
-  fmacs,\
 
33386
-  fmacd,\
 
33387
-  ffmas,\
 
33388
-  ffmad,\
 
33389
-  f_rints,\
 
33390
-  f_rintd,\
 
33391
-  f_minmaxs,\
 
33392
-  f_minmaxd,\
 
33393
-  f_flag,\
 
33394
-  f_loads,\
 
33395
-  f_loadd,\
 
33396
-  f_stores,\
 
33397
-  f_stored,\
 
33398
-  f_2_r,\
 
33399
-  r_2_f,\
 
33400
-  f_cvt,\
 
33401
-  branch,\
 
33402
-  call,\
 
33403
   load_byte,\
 
33404
   load1,\
 
33405
   load2,\
 
33406
   load3,\
 
33407
   load4,\
 
33408
+  mla,\
 
33409
+  mlas,\
 
33410
+  mov_imm,\
 
33411
+  mov_reg,\
 
33412
+  mov_shift,\
 
33413
+  mov_shift_reg,\
 
33414
+  mul,\
 
33415
+  muls,\
 
33416
+  mvn_imm,\
 
33417
+  mvn_reg,\
 
33418
+  mvn_shift,\
 
33419
+  mvn_shift_reg,\
 
33420
+  r_2_f,\
 
33421
+  sdiv,\
 
33422
+  shift,\
 
33423
+  shift_reg,\
 
33424
+  smlad,\
 
33425
+  smladx,\
 
33426
+  smlal,\
 
33427
+  smlald,\
 
33428
+  smlals,\
 
33429
+  smlalxy,\
 
33430
+  smlawx,\
 
33431
+  smlawy,\
 
33432
+  smlaxy,\
 
33433
+  smlsd,\
 
33434
+  smlsdx,\
 
33435
+  smlsld,\
 
33436
+  smmla,\
 
33437
+  smmul,\
 
33438
+  smmulr,\
 
33439
+  smuad,\
 
33440
+  smuadx,\
 
33441
+  smull,\
 
33442
+  smulls,\
 
33443
+  smulwy,\
 
33444
+  smulxy,\
 
33445
+  smusd,\
 
33446
+  smusdx,\
 
33447
   store1,\
 
33448
   store2,\
 
33449
   store3,\
 
33450
   store4,\
 
33451
-  fconsts,\
 
33452
-  fconstd,\
 
33453
-  fadds,\
 
33454
-  faddd,\
 
33455
-  ffariths,\
 
33456
-  ffarithd,\
 
33457
-  fcmps,\
 
33458
-  fcmpd,\
 
33459
-  fcpys"
 
33460
- (if_then_else 
 
33461
-    (eq_attr "insn" "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,\
 
33462
-                    umull,umulls,umlal,umlals,smull,smulls,smlal,smlals")
 
33463
-    (const_string "mult")
 
33464
-    (const_string "alu_reg")))
 
33465
+  udiv,\
 
33466
+  umaal,\
 
33467
+  umlal,\
 
33468
+  umlals,\
 
33469
+  umull,\
 
33470
+  umulls,\
 
33471
+  wmmx_tandc,\
 
33472
+  wmmx_tbcst,\
 
33473
+  wmmx_textrc,\
 
33474
+  wmmx_textrm,\
 
33475
+  wmmx_tinsr,\
 
33476
+  wmmx_tmcr,\
 
33477
+  wmmx_tmcrr,\
 
33478
+  wmmx_tmia,\
 
33479
+  wmmx_tmiaph,\
 
33480
+  wmmx_tmiaxy,\
 
33481
+  wmmx_tmrc,\
 
33482
+  wmmx_tmrrc,\
 
33483
+  wmmx_tmovmsk,\
 
33484
+  wmmx_torc,\
 
33485
+  wmmx_torvsc,\
 
33486
+  wmmx_wabs,\
 
33487
+  wmmx_wabsdiff,\
 
33488
+  wmmx_wacc,\
 
33489
+  wmmx_wadd,\
 
33490
+  wmmx_waddbhus,\
 
33491
+  wmmx_waddsubhx,\
 
33492
+  wmmx_waligni,\
 
33493
+  wmmx_walignr,\
 
33494
+  wmmx_wand,\
 
33495
+  wmmx_wandn,\
 
33496
+  wmmx_wavg2,\
 
33497
+  wmmx_wavg4,\
 
33498
+  wmmx_wcmpeq,\
 
33499
+  wmmx_wcmpgt,\
 
33500
+  wmmx_wmac,\
 
33501
+  wmmx_wmadd,\
 
33502
+  wmmx_wmax,\
 
33503
+  wmmx_wmerge,\
 
33504
+  wmmx_wmiawxy,\
 
33505
+  wmmx_wmiaxy,\
 
33506
+  wmmx_wmin,\
 
33507
+  wmmx_wmov,\
 
33508
+  wmmx_wmul,\
 
33509
+  wmmx_wmulw,\
 
33510
+  wmmx_wldr,\
 
33511
+  wmmx_wor,\
 
33512
+  wmmx_wpack,\
 
33513
+  wmmx_wqmiaxy,\
 
33514
+  wmmx_wqmulm,\
 
33515
+  wmmx_wqmulwm,\
 
33516
+  wmmx_wror,\
 
33517
+  wmmx_wsad,\
 
33518
+  wmmx_wshufh,\
 
33519
+  wmmx_wsll,\
 
33520
+  wmmx_wsra,\
 
33521
+  wmmx_wsrl,\
 
33522
+  wmmx_wstr,\
 
33523
+  wmmx_wsub,\
 
33524
+  wmmx_wsubaddhx,\
 
33525
+  wmmx_wunpckeh,\
 
33526
+  wmmx_wunpckel,\
 
33527
+  wmmx_wunpckih,\
 
33528
+  wmmx_wunpckil,\
 
33529
+  wmmx_wxor"
 
33530
+  (const_string "arlo_reg"))
 
33531
 
 
33532
+; Is this an (integer side) multiply with a 32-bit (or smaller) result?
 
33533
+(define_attr "mul32" "no,yes"
 
33534
+  (if_then_else
 
33535
+    (eq_attr "type"
 
33536
+     "smulxy,smlaxy,smulwy,smlawx,mul,muls,mla,mlas,smlawy,smuad,smuadx,\
 
33537
+      smlad,smladx,smusd,smusdx,smlsd,smlsdx,smmul,smmulr,smmla,smlald,smlsld")
 
33538
+    (const_string "yes")
 
33539
+    (const_string "no")))
 
33540
+
 
33541
 ; Is this an (integer side) multiply with a 64-bit result?
 
33542
 (define_attr "mul64" "no,yes"
 
33543
   (if_then_else
 
33544
-    (eq_attr "insn"
 
33545
-     "smlalxy,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals")
 
33546
+    (eq_attr "type"
 
33547
+     "smlalxy,umull,umulls,umaal,umlal,umlals,smull,smulls,smlal,smlals")
 
33548
     (const_string "yes")
 
33549
     (const_string "no")))
 
33550
 
 
33551
-; wtype for WMMX insn scheduling purposes.
 
33552
-(define_attr "wtype"
 
33553
-        "none,wor,wxor,wand,wandn,wmov,tmcrr,tmrrc,wldr,wstr,tmcr,tmrc,wadd,wsub,wmul,wmac,wavg2,tinsr,textrm,wshufh,wcmpeq,wcmpgt,wmax,wmin,wpack,wunpckih,wunpckil,wunpckeh,wunpckel,wror,wsra,wsrl,wsll,wmadd,tmia,tmiaph,tmiaxy,tbcst,tmovmsk,wacc,waligni,walignr,tandc,textrc,torc,torvsc,wsad,wabs,wabsdiff,waddsubhx,wsubaddhx,wavg4,wmulw,wqmulm,wqmulwm,waddbhus,wqmiaxy,wmiaxy,wmiawxy,wmerge" (const_string "none"))
 
33554
-
 
33555
 ; Load scheduling, set from the arm_ld_sched variable
 
33556
 ; initialized by arm_option_override()
 
33557
 (define_attr "ldsched" "no,yes" (const (symbol_ref "arm_ld_sched")))
 
33558
@@ -458,9 +684,19 @@
 
33559
 ; than one on the main cpu execution unit.
 
33560
 (define_attr "core_cycles" "single,multi"
 
33561
   (if_then_else (eq_attr "type"
 
33562
-                "simple_alu_imm,alu_reg,\
 
33563
-                  simple_alu_shift,alu_shift,\
 
33564
-                  float,fdivd,fdivs")
 
33565
+    "arlo_imm, arlo_reg,\
 
33566
+    extend, shift, arlo_shift, float, fdivd, fdivs,\
 
33567
+    wmmx_wor, wmmx_wxor, wmmx_wand, wmmx_wandn, wmmx_wmov, wmmx_tmcrr,\
 
33568
+    wmmx_tmrrc, wmmx_wldr, wmmx_wstr, wmmx_tmcr, wmmx_tmrc, wmmx_wadd,\
 
33569
+    wmmx_wsub, wmmx_wmul, wmmx_wmac, wmmx_wavg2, wmmx_tinsr, wmmx_textrm,\
 
33570
+    wmmx_wshufh, wmmx_wcmpeq, wmmx_wcmpgt, wmmx_wmax, wmmx_wmin, wmmx_wpack,\
 
33571
+    wmmx_wunpckih, wmmx_wunpckil, wmmx_wunpckeh, wmmx_wunpckel, wmmx_wror,\
 
33572
+    wmmx_wsra, wmmx_wsrl, wmmx_wsll, wmmx_wmadd, wmmx_tmia, wmmx_tmiaph,\
 
33573
+    wmmx_tmiaxy, wmmx_tbcst, wmmx_tmovmsk, wmmx_wacc, wmmx_waligni,\
 
33574
+    wmmx_walignr, wmmx_tandc, wmmx_textrc, wmmx_torc, wmmx_torvsc, wmmx_wsad,\
 
33575
+    wmmx_wabs, wmmx_wabsdiff, wmmx_waddsubhx, wmmx_wsubaddhx, wmmx_wavg4,\
 
33576
+    wmmx_wmulw, wmmx_wqmulm, wmmx_wqmulwm, wmmx_waddbhus, wmmx_wqmiaxy,\
 
33577
+    wmmx_wmiaxy, wmmx_wmiawxy, wmmx_wmerge")
 
33578
                (const_string "single")
 
33579
                (const_string "multi")))
 
33580
 
 
33581
@@ -502,7 +738,7 @@
 
33582
 
 
33583
 (define_attr "generic_sched" "yes,no"
 
33584
   (const (if_then_else
 
33585
-          (ior (eq_attr "tune" "fa526,fa626,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexm4,marvell_pj4")
 
33586
+          (ior (eq_attr "tune" "fa526,fa626,fa606te,fa626te,fmp626,fa726te,arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs,cortexa5,cortexa7,cortexa8,cortexa9,cortexa15,cortexa53,cortexm4,marvell_pj4")
 
33587
               (eq_attr "tune_cortexr4" "yes"))
 
33588
           (const_string "no")
 
33589
           (const_string "yes"))))
 
33590
@@ -510,7 +746,7 @@
 
33591
 (define_attr "generic_vfp" "yes,no"
 
33592
   (const (if_then_else
 
33593
          (and (eq_attr "fpu" "vfp")
 
33594
-              (eq_attr "tune" "!arm1020e,arm1022e,cortexa5,cortexa7,cortexa8,cortexa9,cortexm4,marvell_pj4")
 
33595
+              (eq_attr "tune" "!arm1020e,arm1022e,cortexa5,cortexa7,cortexa8,cortexa9,cortexa53,cortexm4,marvell_pj4")
 
33596
               (eq_attr "tune_cortexr4" "no"))
 
33597
          (const_string "yes")
 
33598
          (const_string "no"))))
 
33599
@@ -531,6 +767,7 @@
 
33600
 (include "cortex-a8.md")
 
33601
 (include "cortex-a9.md")
 
33602
 (include "cortex-a15.md")
 
33603
+(include "cortex-a53.md")
 
33604
 (include "cortex-r4.md")
 
33605
 (include "cortex-r4f.md")
 
33606
 (include "cortex-m4.md")
 
33607
@@ -697,14 +934,17 @@
 
33608
 ;;  (plus (reg rN) (reg sp)) into (reg rN).  In this case reload will
 
33609
 ;; put the duplicated register first, and not try the commutative version.
 
33610
 (define_insn_and_split "*arm_addsi3"
 
33611
-  [(set (match_operand:SI          0 "s_register_operand" "=rk, r,k, r,r, k, r, k,k,r, k, r")
 
33612
-       (plus:SI (match_operand:SI 1 "s_register_operand" "%0, rk,k, r,rk,k, rk,k,r,rk,k, rk")
 
33613
-                (match_operand:SI 2 "reg_or_int_operand" "rk, rI,rI,k,Pj,Pj,L, L,L,PJ,PJ,?n")))]
 
33614
+  [(set (match_operand:SI          0 "s_register_operand" "=rk,l,l ,l ,r ,k ,r,r ,k ,r ,k,k,r ,k ,r")
 
33615
+        (plus:SI (match_operand:SI 1 "s_register_operand" "%0 ,l,0 ,l ,rk,k ,r,rk,k ,rk,k,r,rk,k ,rk")
 
33616
+                 (match_operand:SI 2 "reg_or_int_operand" "rk ,l,Py,Pd,rI,rI,k,Pj,Pj,L ,L,L,PJ,PJ,?n")))]
 
33617
   "TARGET_32BIT"
 
33618
   "@
 
33619
    add%?\\t%0, %0, %2
 
33620
    add%?\\t%0, %1, %2
 
33621
    add%?\\t%0, %1, %2
 
33622
+   add%?\\t%0, %1, %2
 
33623
+   add%?\\t%0, %1, %2
 
33624
+   add%?\\t%0, %1, %2
 
33625
    add%?\\t%0, %2, %1
 
33626
    addw%?\\t%0, %1, %2
 
33627
    addw%?\\t%0, %1, %2
 
33628
@@ -725,12 +965,13 @@
 
33629
                      operands[1], 0);
 
33630
   DONE;
 
33631
   "
 
33632
-  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,16")
 
33633
+  [(set_attr "length" "2,4,4,4,4,4,4,4,4,4,4,4,4,4,16")
 
33634
    (set_attr "predicable" "yes")
 
33635
-   (set_attr "arch" "t2,*,*,*,t2,t2,*,*,a,t2,t2,*")
 
33636
+   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no,no,no,no,no,no,no")
 
33637
+   (set_attr "arch" "t2,t2,t2,t2,*,*,*,t2,t2,*,*,a,t2,t2,*")
 
33638
    (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
 
33639
-                     (const_string "simple_alu_imm")
 
33640
-                     (const_string "alu_reg")))
 
33641
+                     (const_string "arlo_imm")
 
33642
+                     (const_string "arlo_reg")))
 
33643
  ]
 
33644
 )
 
33645
 
 
33646
@@ -811,7 +1052,7 @@
 
33647
    sub%.\\t%0, %1, #%n2
 
33648
    add%.\\t%0, %1, %2"
 
33649
   [(set_attr "conds" "set")
 
33650
-   (set_attr "type" "simple_alu_imm, simple_alu_imm, *")]
 
33651
+   (set_attr "type" "arlo_imm,arlo_imm,*")]
 
33652
 )
 
33653
 
 
33654
 (define_insn "*addsi3_compare0_scratch"
 
33655
@@ -827,24 +1068,27 @@
 
33656
    cmn%?\\t%0, %1"
 
33657
   [(set_attr "conds" "set")
 
33658
    (set_attr "predicable" "yes")
 
33659
-   (set_attr "type" "simple_alu_imm, simple_alu_imm, *")
 
33660
+   (set_attr "type" "arlo_imm,arlo_imm,*")
 
33661
    ]
 
33662
 )
 
33663
 
 
33664
 (define_insn "*compare_negsi_si"
 
33665
   [(set (reg:CC_Z CC_REGNUM)
 
33666
        (compare:CC_Z
 
33667
-        (neg:SI (match_operand:SI 0 "s_register_operand" "r"))
 
33668
-        (match_operand:SI 1 "s_register_operand" "r")))]
 
33669
+        (neg:SI (match_operand:SI 0 "s_register_operand" "l,r"))
 
33670
+        (match_operand:SI 1 "s_register_operand" "l,r")))]
 
33671
   "TARGET_32BIT"
 
33672
   "cmn%?\\t%1, %0"
 
33673
   [(set_attr "conds" "set")
 
33674
-   (set_attr "predicable" "yes")]
 
33675
+   (set_attr "predicable" "yes")
 
33676
+   (set_attr "arch" "t2,*")
 
33677
+   (set_attr "length" "2,4")
 
33678
+   (set_attr "predicable_short_it" "yes,no")]
 
33679
 )
 
33680
 
 
33681
 ;; This is the canonicalization of addsi3_compare0_for_combiner when the
 
33682
 ;; addend is a constant.
 
33683
-(define_insn "*cmpsi2_addneg"
 
33684
+(define_insn "cmpsi2_addneg"
 
33685
   [(set (reg:CC CC_REGNUM)
 
33686
        (compare:CC
 
33687
         (match_operand:SI 1 "s_register_operand" "r,r")
 
33688
@@ -914,7 +1158,7 @@
 
33689
    sub%.\\t%0, %1, #%n2
 
33690
    add%.\\t%0, %1, %2"
 
33691
   [(set_attr "conds" "set")
 
33692
-   (set_attr "type"  "simple_alu_imm,simple_alu_imm,*")]
 
33693
+   (set_attr "type"  "arlo_imm,arlo_imm,*")]
 
33694
 )
 
33695
 
 
33696
 (define_insn "*addsi3_compare_op2"
 
33697
@@ -931,63 +1175,84 @@
 
33698
    add%.\\t%0, %1, %2
 
33699
    sub%.\\t%0, %1, #%n2"
 
33700
   [(set_attr "conds" "set")
 
33701
-   (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
 
33702
+   (set_attr "type" "arlo_imm,arlo_imm,*")]
 
33703
 )
 
33704
 
 
33705
 (define_insn "*compare_addsi2_op0"
 
33706
   [(set (reg:CC_C CC_REGNUM)
 
33707
-       (compare:CC_C
 
33708
-        (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r")
 
33709
-                 (match_operand:SI 1 "arm_add_operand" "I,L,r"))
 
33710
-        (match_dup 0)))]
 
33711
+        (compare:CC_C
 
33712
+          (plus:SI (match_operand:SI 0 "s_register_operand" "l,l,r,r,r")
 
33713
+                   (match_operand:SI 1 "arm_add_operand" "Pv,l,I,L,r"))
 
33714
+          (match_dup 0)))]
 
33715
   "TARGET_32BIT"
 
33716
   "@
 
33717
+   cmp%?\\t%0, #%n1
 
33718
    cmn%?\\t%0, %1
 
33719
+   cmn%?\\t%0, %1
 
33720
    cmp%?\\t%0, #%n1
 
33721
    cmn%?\\t%0, %1"
 
33722
   [(set_attr "conds" "set")
 
33723
    (set_attr "predicable" "yes")
 
33724
-   (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
 
33725
+   (set_attr "arch" "t2,t2,*,*,*")
 
33726
+   (set_attr "predicable_short_it" "yes,yes,no,no,no")
 
33727
+   (set_attr "length" "2,2,4,4,4")
 
33728
+   (set_attr "type" "arlo_imm,*,arlo_imm,arlo_imm,*")]
 
33729
 )
 
33730
 
 
33731
 (define_insn "*compare_addsi2_op1"
 
33732
   [(set (reg:CC_C CC_REGNUM)
 
33733
-       (compare:CC_C
 
33734
-        (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r")
 
33735
-                 (match_operand:SI 1 "arm_add_operand" "I,L,r"))
 
33736
-        (match_dup 1)))]
 
33737
+        (compare:CC_C
 
33738
+          (plus:SI (match_operand:SI 0 "s_register_operand" "l,l,r,r,r")
 
33739
+                   (match_operand:SI 1 "arm_add_operand" "Pv,l,I,L,r"))
 
33740
+          (match_dup 1)))]
 
33741
   "TARGET_32BIT"
 
33742
   "@
 
33743
+   cmp%?\\t%0, #%n1
 
33744
    cmn%?\\t%0, %1
 
33745
+   cmn%?\\t%0, %1
 
33746
    cmp%?\\t%0, #%n1
 
33747
    cmn%?\\t%0, %1"
 
33748
   [(set_attr "conds" "set")
 
33749
    (set_attr "predicable" "yes")
 
33750
-   (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
 
33751
-)
 
33752
+   (set_attr "arch" "t2,t2,*,*,*")
 
33753
+   (set_attr "predicable_short_it" "yes,yes,no,no,no")
 
33754
+   (set_attr "length" "2,2,4,4,4")
 
33755
+   (set_attr "type"
 
33756
+      "arlo_imm,*,arlo_imm,arlo_imm,*")]
 
33757
+ )
 
33758
 
 
33759
 (define_insn "*addsi3_carryin_<optab>"
 
33760
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
33761
-       (plus:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%r,r")
 
33762
-                         (match_operand:SI 2 "arm_not_operand" "rI,K"))
 
33763
-                (LTUGEU:SI (reg:<cnb> CC_REGNUM) (const_int 0))))]
 
33764
+  [(set (match_operand:SI 0 "s_register_operand" "=l,r,r")
 
33765
+        (plus:SI (plus:SI (match_operand:SI 1 "s_register_operand" "%l,r,r")
 
33766
+                          (match_operand:SI 2 "arm_not_operand" "0,rI,K"))
 
33767
+                 (LTUGEU:SI (reg:<cnb> CC_REGNUM) (const_int 0))))]
 
33768
   "TARGET_32BIT"
 
33769
   "@
 
33770
    adc%?\\t%0, %1, %2
 
33771
+   adc%?\\t%0, %1, %2
 
33772
    sbc%?\\t%0, %1, #%B2"
 
33773
-  [(set_attr "conds" "use")]
 
33774
+  [(set_attr "conds" "use")
 
33775
+   (set_attr "predicable" "yes")
 
33776
+   (set_attr "arch" "t2,*,*")
 
33777
+   (set_attr "length" "4")
 
33778
+   (set_attr "predicable_short_it" "yes,no,no")]
 
33779
 )
 
33780
 
 
33781
 (define_insn "*addsi3_carryin_alt2_<optab>"
 
33782
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
33783
-       (plus:SI (plus:SI (LTUGEU:SI (reg:<cnb> CC_REGNUM) (const_int 0))
 
33784
-                         (match_operand:SI 1 "s_register_operand" "%r,r"))
 
33785
-                (match_operand:SI 2 "arm_rhs_operand" "rI,K")))]
 
33786
+  [(set (match_operand:SI 0 "s_register_operand" "=l,r,r")
 
33787
+        (plus:SI (plus:SI (LTUGEU:SI (reg:<cnb> CC_REGNUM) (const_int 0))
 
33788
+                          (match_operand:SI 1 "s_register_operand" "%l,r,r"))
 
33789
+                 (match_operand:SI 2 "arm_rhs_operand" "l,rI,K")))]
 
33790
   "TARGET_32BIT"
 
33791
   "@
 
33792
    adc%?\\t%0, %1, %2
 
33793
+   adc%?\\t%0, %1, %2
 
33794
    sbc%?\\t%0, %1, #%B2"
 
33795
-  [(set_attr "conds" "use")]
 
33796
+  [(set_attr "conds" "use")
 
33797
+   (set_attr "predicable" "yes")
 
33798
+   (set_attr "arch" "t2,*,*")
 
33799
+   (set_attr "length" "4")
 
33800
+   (set_attr "predicable_short_it" "yes,no,no")]
 
33801
 )
 
33802
 
 
33803
 (define_insn "*addsi3_carryin_shift_<optab>"
 
33804
@@ -1001,9 +1266,11 @@
 
33805
   "TARGET_32BIT"
 
33806
   "adc%?\\t%0, %1, %3%S2"
 
33807
   [(set_attr "conds" "use")
 
33808
+   (set_attr "predicable" "yes")
 
33809
+   (set_attr "predicable_short_it" "no")
 
33810
    (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
 
33811
-                     (const_string "alu_shift")
 
33812
-                     (const_string "alu_shift_reg")))]
 
33813
+                     (const_string "arlo_shift")
 
33814
+                     (const_string "arlo_shift_reg")))]
 
33815
 )
 
33816
 
 
33817
 (define_insn "*addsi3_carryin_clobercc_<optab>"
 
33818
@@ -1017,26 +1284,89 @@
 
33819
    [(set_attr "conds" "set")]
 
33820
 )
 
33821
 
 
33822
-(define_expand "incscc"
 
33823
+(define_insn "*subsi3_carryin"
 
33824
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
33825
-        (plus:SI (match_operator:SI 2 "arm_comparison_operator"
 
33826
-                    [(match_operand:CC 3 "cc_register" "") (const_int 0)])
 
33827
-                 (match_operand:SI 1 "s_register_operand" "0,?r")))]
 
33828
+        (minus:SI (minus:SI (match_operand:SI 1 "reg_or_int_operand" "r,I")
 
33829
+                            (match_operand:SI 2 "s_register_operand" "r,r"))
 
33830
+                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33831
   "TARGET_32BIT"
 
33832
-  ""
 
33833
+  "@
 
33834
+   sbc%?\\t%0, %1, %2
 
33835
+   rsc%?\\t%0, %2, %1"
 
33836
+  [(set_attr "conds" "use")
 
33837
+   (set_attr "arch" "*,a")
 
33838
+   (set_attr "predicable" "yes")
 
33839
+   (set_attr "predicable_short_it" "no")]
 
33840
 )
 
33841
 
 
33842
-(define_insn "*arm_incscc"
 
33843
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
33844
-        (plus:SI (match_operator:SI 2 "arm_comparison_operator"
 
33845
-                    [(match_operand:CC 3 "cc_register" "") (const_int 0)])
 
33846
-                 (match_operand:SI 1 "s_register_operand" "0,?r")))]
 
33847
+(define_insn "*subsi3_carryin_const"
 
33848
+  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
33849
+        (minus:SI (plus:SI (match_operand:SI 1 "reg_or_int_operand" "r")
 
33850
+                           (match_operand:SI 2 "arm_not_operand" "K"))
 
33851
+                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33852
+  "TARGET_32BIT"
 
33853
+  "sbc\\t%0, %1, #%B2"
 
33854
+  [(set_attr "conds" "use")]
 
33855
+)
 
33856
+
 
33857
+(define_insn "*subsi3_carryin_compare"
 
33858
+  [(set (reg:CC CC_REGNUM)
 
33859
+        (compare:CC (match_operand:SI 1 "s_register_operand" "r")
 
33860
+                    (match_operand:SI 2 "s_register_operand" "r")))
 
33861
+   (set (match_operand:SI 0 "s_register_operand" "=r")
 
33862
+        (minus:SI (minus:SI (match_dup 1)
 
33863
+                            (match_dup 2))
 
33864
+                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33865
+  "TARGET_32BIT"
 
33866
+  "sbcs\\t%0, %1, %2"
 
33867
+  [(set_attr "conds" "set")]
 
33868
+)
 
33869
+
 
33870
+(define_insn "*subsi3_carryin_compare_const"
 
33871
+  [(set (reg:CC CC_REGNUM)
 
33872
+        (compare:CC (match_operand:SI 1 "reg_or_int_operand" "r")
 
33873
+                    (match_operand:SI 2 "arm_not_operand" "K")))
 
33874
+   (set (match_operand:SI 0 "s_register_operand" "=r")
 
33875
+        (minus:SI (plus:SI (match_dup 1)
 
33876
+                           (match_dup 2))
 
33877
+                  (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33878
+  "TARGET_32BIT"
 
33879
+  "sbcs\\t%0, %1, #%B2"
 
33880
+  [(set_attr "conds" "set")]
 
33881
+)
 
33882
+
 
33883
+(define_insn "*subsi3_carryin_shift"
 
33884
+  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
33885
+       (minus:SI (minus:SI
 
33886
+                 (match_operand:SI 1 "s_register_operand" "r")
 
33887
+                  (match_operator:SI 2 "shift_operator"
 
33888
+                   [(match_operand:SI 3 "s_register_operand" "r")
 
33889
+                    (match_operand:SI 4 "reg_or_int_operand" "rM")]))
 
33890
+                 (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33891
+  "TARGET_32BIT"
 
33892
+  "sbc%?\\t%0, %1, %3%S2"
 
33893
+  [(set_attr "conds" "use")
 
33894
+   (set_attr "predicable" "yes")
 
33895
+   (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
 
33896
+                     (const_string "arlo_shift")
 
33897
+                     (const_string "arlo_shift_reg")))]
 
33898
+)
 
33899
+
 
33900
+(define_insn "*rsbsi3_carryin_shift"
 
33901
+  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
33902
+       (minus:SI (minus:SI
 
33903
+                  (match_operator:SI 2 "shift_operator"
 
33904
+                   [(match_operand:SI 3 "s_register_operand" "r")
 
33905
+                    (match_operand:SI 4 "reg_or_int_operand" "rM")])
 
33906
+                  (match_operand:SI 1 "s_register_operand" "r"))
 
33907
+                 (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33908
   "TARGET_ARM"
 
33909
-  "@
 
33910
-  add%d2\\t%0, %1, #1
 
33911
-  mov%D2\\t%0, %1\;add%d2\\t%0, %1, #1"
 
33912
+  "rsc%?\\t%0, %1, %3%S2"
 
33913
   [(set_attr "conds" "use")
 
33914
-   (set_attr "length" "4,8")]
 
33915
+   (set_attr "predicable" "yes")
 
33916
+   (set (attr "type") (if_then_else (match_operand 4 "const_int_operand" "")
 
33917
+                     (const_string "arlo_shift")
 
33918
+                     (const_string "arlo_shift_reg")))]
 
33919
 )
 
33920
 
 
33921
 ; transform ((x << y) - 1) to ~(~(x-1) << y)  Where X is a constant.
 
33922
@@ -1087,13 +1417,27 @@
 
33923
   "
 
33924
 )
 
33925
 
 
33926
-(define_insn "*arm_subdi3"
 
33927
+(define_insn_and_split "*arm_subdi3"
 
33928
   [(set (match_operand:DI           0 "s_register_operand" "=&r,&r,&r")
 
33929
        (minus:DI (match_operand:DI 1 "s_register_operand" "0,r,0")
 
33930
                  (match_operand:DI 2 "s_register_operand" "r,0,0")))
 
33931
    (clobber (reg:CC CC_REGNUM))]
 
33932
   "TARGET_32BIT && !TARGET_NEON"
 
33933
-  "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2"
 
33934
+  "#"  ; "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2"
 
33935
+  "&& reload_completed"
 
33936
+  [(parallel [(set (reg:CC CC_REGNUM)
 
33937
+                  (compare:CC (match_dup 1) (match_dup 2)))
 
33938
+             (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))])
 
33939
+   (set (match_dup 3) (minus:SI (minus:SI (match_dup 4) (match_dup 5))
 
33940
+                              (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33941
+  {
 
33942
+    operands[3] = gen_highpart (SImode, operands[0]);
 
33943
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
33944
+    operands[4] = gen_highpart (SImode, operands[1]);
 
33945
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
33946
+    operands[5] = gen_highpart (SImode, operands[2]);
 
33947
+    operands[2] = gen_lowpart (SImode, operands[2]);
 
33948
+   }
 
33949
   [(set_attr "conds" "clob")
 
33950
    (set_attr "length" "8")]
 
33951
 )
 
33952
@@ -1108,55 +1452,113 @@
 
33953
   [(set_attr "length" "4")]
 
33954
 )
 
33955
 
 
33956
-(define_insn "*subdi_di_zesidi"
 
33957
+(define_insn_and_split "*subdi_di_zesidi"
 
33958
   [(set (match_operand:DI           0 "s_register_operand" "=&r,&r")
 
33959
        (minus:DI (match_operand:DI 1 "s_register_operand"  "0,r")
 
33960
                  (zero_extend:DI
 
33961
                   (match_operand:SI 2 "s_register_operand"  "r,r"))))
 
33962
    (clobber (reg:CC CC_REGNUM))]
 
33963
   "TARGET_32BIT"
 
33964
-  "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, #0"
 
33965
+  "#"   ; "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, #0"
 
33966
+  "&& reload_completed"
 
33967
+  [(parallel [(set (reg:CC CC_REGNUM)
 
33968
+                  (compare:CC (match_dup 1) (match_dup 2)))
 
33969
+             (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))])
 
33970
+   (set (match_dup 3) (minus:SI (plus:SI (match_dup 4) (match_dup 5))
 
33971
+                                (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
33972
+  {
 
33973
+    operands[3] = gen_highpart (SImode, operands[0]);
 
33974
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
33975
+    operands[4] = gen_highpart (SImode, operands[1]);
 
33976
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
33977
+    operands[5] = GEN_INT (~0);
 
33978
+   }
 
33979
   [(set_attr "conds" "clob")
 
33980
    (set_attr "length" "8")]
 
33981
 )
 
33982
 
 
33983
-(define_insn "*subdi_di_sesidi"
 
33984
+(define_insn_and_split "*subdi_di_sesidi"
 
33985
   [(set (match_operand:DI            0 "s_register_operand" "=&r,&r")
 
33986
        (minus:DI (match_operand:DI  1 "s_register_operand"  "0,r")
 
33987
                  (sign_extend:DI
 
33988
                   (match_operand:SI 2 "s_register_operand"  "r,r"))))
 
33989
    (clobber (reg:CC CC_REGNUM))]
 
33990
   "TARGET_32BIT"
 
33991
-  "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, %2, asr #31"
 
33992
+  "#"   ; "subs\\t%Q0, %Q1, %2\;sbc\\t%R0, %R1, %2, asr #31"
 
33993
+  "&& reload_completed"
 
33994
+  [(parallel [(set (reg:CC CC_REGNUM)
 
33995
+                  (compare:CC (match_dup 1) (match_dup 2)))
 
33996
+             (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))])
 
33997
+   (set (match_dup 3) (minus:SI (minus:SI (match_dup 4)
 
33998
+                                         (ashiftrt:SI (match_dup 2)
 
33999
+                                                      (const_int 31)))
 
34000
+                                (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
34001
+  {
 
34002
+    operands[3] = gen_highpart (SImode, operands[0]);
 
34003
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
34004
+    operands[4] = gen_highpart (SImode, operands[1]);
 
34005
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
34006
+  }
 
34007
   [(set_attr "conds" "clob")
 
34008
    (set_attr "length" "8")]
 
34009
 )
 
34010
 
 
34011
-(define_insn "*subdi_zesidi_di"
 
34012
+(define_insn_and_split "*subdi_zesidi_di"
 
34013
   [(set (match_operand:DI            0 "s_register_operand" "=&r,&r")
 
34014
        (minus:DI (zero_extend:DI
 
34015
                   (match_operand:SI 2 "s_register_operand"  "r,r"))
 
34016
                  (match_operand:DI  1 "s_register_operand" "0,r")))
 
34017
    (clobber (reg:CC CC_REGNUM))]
 
34018
   "TARGET_ARM"
 
34019
-  "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, #0"
 
34020
+  "#"   ; "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, #0"
 
34021
+        ; is equivalent to:
 
34022
+        ; "subs\\t%Q0, %2, %Q1\;rsc\\t%R0, %R1, #0"
 
34023
+  "&& reload_completed"
 
34024
+  [(parallel [(set (reg:CC CC_REGNUM)
 
34025
+                  (compare:CC (match_dup 2) (match_dup 1)))
 
34026
+             (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 1)))])
 
34027
+   (set (match_dup 3) (minus:SI (minus:SI (const_int 0) (match_dup 4))
 
34028
+                              (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
34029
+  {
 
34030
+    operands[3] = gen_highpart (SImode, operands[0]);
 
34031
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
34032
+    operands[4] = gen_highpart (SImode, operands[1]);
 
34033
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
34034
+  }
 
34035
   [(set_attr "conds" "clob")
 
34036
    (set_attr "length" "8")]
 
34037
 )
 
34038
 
 
34039
-(define_insn "*subdi_sesidi_di"
 
34040
+(define_insn_and_split "*subdi_sesidi_di"
 
34041
   [(set (match_operand:DI            0 "s_register_operand" "=&r,&r")
 
34042
        (minus:DI (sign_extend:DI
 
34043
                   (match_operand:SI 2 "s_register_operand"   "r,r"))
 
34044
                  (match_operand:DI  1 "s_register_operand"  "0,r")))
 
34045
    (clobber (reg:CC CC_REGNUM))]
 
34046
   "TARGET_ARM"
 
34047
-  "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, %2, asr #31"
 
34048
+  "#"   ; "rsbs\\t%Q0, %Q1, %2\;rsc\\t%R0, %R1, %2, asr #31"
 
34049
+        ; is equivalent to:
 
34050
+        ; "subs\\t%Q0, %2, %Q1\;rsc\\t%R0, %R1, %2, asr #31"
 
34051
+  "&& reload_completed"
 
34052
+  [(parallel [(set (reg:CC CC_REGNUM)
 
34053
+                  (compare:CC (match_dup 2) (match_dup 1)))
 
34054
+             (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 1)))])
 
34055
+   (set (match_dup 3) (minus:SI (minus:SI
 
34056
+                                (ashiftrt:SI (match_dup 2)
 
34057
+                                             (const_int 31))
 
34058
+                                (match_dup 4))
 
34059
+                              (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
34060
+  {
 
34061
+    operands[3] = gen_highpart (SImode, operands[0]);
 
34062
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
34063
+    operands[4] = gen_highpart (SImode, operands[1]);
 
34064
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
34065
+  }
 
34066
   [(set_attr "conds" "clob")
 
34067
    (set_attr "length" "8")]
 
34068
 )
 
34069
 
 
34070
-(define_insn "*subdi_zesidi_zesidi"
 
34071
+(define_insn_and_split "*subdi_zesidi_zesidi"
 
34072
   [(set (match_operand:DI            0 "s_register_operand" "=r")
 
34073
        (minus:DI (zero_extend:DI
 
34074
                   (match_operand:SI 1 "s_register_operand"  "r"))
 
34075
@@ -1164,7 +1566,17 @@
 
34076
                   (match_operand:SI 2 "s_register_operand"  "r"))))
 
34077
    (clobber (reg:CC CC_REGNUM))]
 
34078
   "TARGET_32BIT"
 
34079
-  "subs\\t%Q0, %1, %2\;sbc\\t%R0, %1, %1"
 
34080
+  "#"   ; "subs\\t%Q0, %1, %2\;sbc\\t%R0, %1, %1"
 
34081
+  "&& reload_completed"
 
34082
+  [(parallel [(set (reg:CC CC_REGNUM)
 
34083
+                  (compare:CC (match_dup 1) (match_dup 2)))
 
34084
+             (set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))])
 
34085
+   (set (match_dup 3) (minus:SI (minus:SI (match_dup 1) (match_dup 1))
 
34086
+                              (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
34087
+  {
 
34088
+       operands[3] = gen_highpart (SImode, operands[0]);
 
34089
+       operands[0] = gen_lowpart (SImode, operands[0]);
 
34090
+  }
 
34091
   [(set_attr "conds" "clob")
 
34092
    (set_attr "length" "8")]
 
34093
 )
 
34094
@@ -1201,12 +1613,16 @@
 
34095
 
 
34096
 ; ??? Check Thumb-2 split length
 
34097
 (define_insn_and_split "*arm_subsi3_insn"
 
34098
-  [(set (match_operand:SI           0 "s_register_operand" "=r,r,r,rk,r")
 
34099
-       (minus:SI (match_operand:SI 1 "reg_or_int_operand" "rI,r,r,k,?n")
 
34100
-                 (match_operand:SI 2 "reg_or_int_operand" "r,I,r,r, r")))]
 
34101
+  [(set (match_operand:SI           0 "s_register_operand" "=l,l ,l ,l ,r ,r,r,rk,r")
 
34102
+       (minus:SI (match_operand:SI 1 "reg_or_int_operand" "l ,0 ,l ,Pz,rI,r,r,k ,?n")
 
34103
+                 (match_operand:SI 2 "reg_or_int_operand" "l ,Py,Pd,l ,r ,I,r,r ,r")))]
 
34104
   "TARGET_32BIT"
 
34105
   "@
 
34106
+   sub%?\\t%0, %1, %2
 
34107
+   sub%?\\t%0, %2
 
34108
+   sub%?\\t%0, %1, %2
 
34109
    rsb%?\\t%0, %2, %1
 
34110
+   rsb%?\\t%0, %2, %1
 
34111
    sub%?\\t%0, %1, %2
 
34112
    sub%?\\t%0, %1, %2
 
34113
    sub%?\\t%0, %1, %2
 
34114
@@ -1219,9 +1635,11 @@
 
34115
                       INTVAL (operands[1]), operands[0], operands[2], 0);
 
34116
   DONE;
 
34117
   "
 
34118
-  [(set_attr "length" "4,4,4,4,16")
 
34119
+  [(set_attr "length" "4,4,4,4,4,4,4,4,16")
 
34120
+   (set_attr "arch" "t2,t2,t2,t2,*,*,*,*,*")
 
34121
    (set_attr "predicable" "yes")
 
34122
-   (set_attr "type"  "*,simple_alu_imm,*,*,*")]
 
34123
+   (set_attr "predicable_short_it" "yes,yes,yes,yes,no,no,no,no,no")
 
34124
+   (set_attr "type"  "*,*,*,*,arlo_imm,arlo_imm,*,*,arlo_imm")]
 
34125
 )
 
34126
 
 
34127
 (define_peephole2
 
34128
@@ -1251,10 +1669,10 @@
 
34129
    sub%.\\t%0, %1, %2
 
34130
    rsb%.\\t%0, %2, %1"
 
34131
   [(set_attr "conds" "set")
 
34132
-   (set_attr "type"  "simple_alu_imm,*,*")]
 
34133
+   (set_attr "type"  "arlo_imm,*,*")]
 
34134
 )
 
34135
 
 
34136
-(define_insn "*subsi3_compare"
 
34137
+(define_insn "subsi3_compare"
 
34138
   [(set (reg:CC CC_REGNUM)
 
34139
        (compare:CC (match_operand:SI 1 "arm_rhs_operand" "r,r,I")
 
34140
                    (match_operand:SI 2 "arm_rhs_operand" "I,r,r")))
 
34141
@@ -1266,32 +1684,9 @@
 
34142
    sub%.\\t%0, %1, %2
 
34143
    rsb%.\\t%0, %2, %1"
 
34144
   [(set_attr "conds" "set")
 
34145
-   (set_attr "type" "simple_alu_imm,*,*")]
 
34146
+   (set_attr "type" "arlo_imm,*,*")]
 
34147
 )
 
34148
 
 
34149
-(define_expand "decscc"
 
34150
-  [(set (match_operand:SI            0 "s_register_operand" "=r,r")
 
34151
-        (minus:SI (match_operand:SI  1 "s_register_operand" "0,?r")
 
34152
-                 (match_operator:SI 2 "arm_comparison_operator"
 
34153
-                   [(match_operand   3 "cc_register" "") (const_int 0)])))]
 
34154
-  "TARGET_32BIT"
 
34155
-  ""
 
34156
-)
 
34157
-
 
34158
-(define_insn "*arm_decscc"
 
34159
-  [(set (match_operand:SI            0 "s_register_operand" "=r,r")
 
34160
-        (minus:SI (match_operand:SI  1 "s_register_operand" "0,?r")
 
34161
-                 (match_operator:SI 2 "arm_comparison_operator"
 
34162
-                   [(match_operand   3 "cc_register" "") (const_int 0)])))]
 
34163
-  "TARGET_ARM"
 
34164
-  "@
 
34165
-   sub%d2\\t%0, %1, #1
 
34166
-   mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1"
 
34167
-  [(set_attr "conds" "use")
 
34168
-   (set_attr "length" "*,8")
 
34169
-   (set_attr "type" "simple_alu_imm,*")]
 
34170
-)
 
34171
-
 
34172
 (define_expand "subsf3"
 
34173
   [(set (match_operand:SF           0 "s_register_operand" "")
 
34174
        (minus:SF (match_operand:SF 1 "s_register_operand" "")
 
34175
@@ -1311,6 +1706,20 @@
 
34176
 
 
34177
 ;; Multiplication insns
 
34178
 
 
34179
+(define_expand "mulhi3"
 
34180
+  [(set (match_operand:HI 0 "s_register_operand" "")
 
34181
+       (mult:HI (match_operand:HI 1 "s_register_operand" "")
 
34182
+                (match_operand:HI 2 "s_register_operand" "")))]
 
34183
+  "TARGET_DSP_MULTIPLY"
 
34184
+  "
 
34185
+  {
 
34186
+    rtx result = gen_reg_rtx (SImode);
 
34187
+    emit_insn (gen_mulhisi3 (result, operands[1], operands[2]));
 
34188
+    emit_move_insn (operands[0], gen_lowpart (HImode, result));
 
34189
+    DONE;
 
34190
+  }"
 
34191
+)
 
34192
+
 
34193
 (define_expand "mulsi3"
 
34194
   [(set (match_operand:SI          0 "s_register_operand" "")
 
34195
        (mult:SI (match_operand:SI 2 "s_register_operand" "")
 
34196
@@ -1326,18 +1735,21 @@
 
34197
                 (match_operand:SI 1 "s_register_operand" "%0,r")))]
 
34198
   "TARGET_32BIT && !arm_arch6"
 
34199
   "mul%?\\t%0, %2, %1"
 
34200
-  [(set_attr "insn" "mul")
 
34201
+  [(set_attr "type" "mul")
 
34202
    (set_attr "predicable" "yes")]
 
34203
 )
 
34204
 
 
34205
 (define_insn "*arm_mulsi3_v6"
 
34206
-  [(set (match_operand:SI          0 "s_register_operand" "=r")
 
34207
-       (mult:SI (match_operand:SI 1 "s_register_operand" "r")
 
34208
-                (match_operand:SI 2 "s_register_operand" "r")))]
 
34209
+  [(set (match_operand:SI          0 "s_register_operand" "=l,l,r")
 
34210
+       (mult:SI (match_operand:SI 1 "s_register_operand" "0,l,r")
 
34211
+                (match_operand:SI 2 "s_register_operand" "l,0,r")))]
 
34212
   "TARGET_32BIT && arm_arch6"
 
34213
   "mul%?\\t%0, %1, %2"
 
34214
-  [(set_attr "insn" "mul")
 
34215
-   (set_attr "predicable" "yes")]
 
34216
+  [(set_attr "type" "mul")
 
34217
+   (set_attr "predicable" "yes")
 
34218
+   (set_attr "arch" "t2,t2,*")
 
34219
+   (set_attr "length" "4")
 
34220
+   (set_attr "predicable_short_it" "yes,yes,no")]
 
34221
 )
 
34222
 
 
34223
 ; Unfortunately with the Thumb the '&'/'0' trick can fails when operands 
 
34224
@@ -1357,7 +1769,7 @@
 
34225
     return \"mul\\t%0, %2\";
 
34226
   "
 
34227
   [(set_attr "length" "4,4,2")
 
34228
-   (set_attr "insn" "mul")]
 
34229
+   (set_attr "type" "muls")]
 
34230
 )
 
34231
 
 
34232
 (define_insn "*thumb_mulsi3_v6"
 
34233
@@ -1370,7 +1782,7 @@
 
34234
    mul\\t%0, %1
 
34235
    mul\\t%0, %1"
 
34236
   [(set_attr "length" "2")
 
34237
-   (set_attr "insn" "mul")]
 
34238
+   (set_attr "type" "muls")]
 
34239
 )
 
34240
 
 
34241
 (define_insn "*mulsi3_compare0"
 
34242
@@ -1384,7 +1796,7 @@
 
34243
   "TARGET_ARM && !arm_arch6"
 
34244
   "mul%.\\t%0, %2, %1"
 
34245
   [(set_attr "conds" "set")
 
34246
-   (set_attr "insn" "muls")]
 
34247
+   (set_attr "type" "muls")]
 
34248
 )
 
34249
 
 
34250
 (define_insn "*mulsi3_compare0_v6"
 
34251
@@ -1398,7 +1810,7 @@
 
34252
   "TARGET_ARM && arm_arch6 && optimize_size"
 
34253
   "mul%.\\t%0, %2, %1"
 
34254
   [(set_attr "conds" "set")
 
34255
-   (set_attr "insn" "muls")]
 
34256
+   (set_attr "type" "muls")]
 
34257
 )
 
34258
 
 
34259
 (define_insn "*mulsi_compare0_scratch"
 
34260
@@ -1411,7 +1823,7 @@
 
34261
   "TARGET_ARM && !arm_arch6"
 
34262
   "mul%.\\t%0, %2, %1"
 
34263
   [(set_attr "conds" "set")
 
34264
-   (set_attr "insn" "muls")]
 
34265
+   (set_attr "type" "muls")]
 
34266
 )
 
34267
 
 
34268
 (define_insn "*mulsi_compare0_scratch_v6"
 
34269
@@ -1424,7 +1836,7 @@
 
34270
   "TARGET_ARM && arm_arch6 && optimize_size"
 
34271
   "mul%.\\t%0, %2, %1"
 
34272
   [(set_attr "conds" "set")
 
34273
-   (set_attr "insn" "muls")]
 
34274
+   (set_attr "type" "muls")]
 
34275
 )
 
34276
 
 
34277
 ;; Unnamed templates to match MLA instruction.
 
34278
@@ -1437,7 +1849,7 @@
 
34279
          (match_operand:SI 3 "s_register_operand" "r,r,0,0")))]
 
34280
   "TARGET_32BIT && !arm_arch6"
 
34281
   "mla%?\\t%0, %2, %1, %3"
 
34282
-  [(set_attr "insn" "mla")
 
34283
+  [(set_attr "type" "mla")
 
34284
    (set_attr "predicable" "yes")]
 
34285
 )
 
34286
 
 
34287
@@ -1449,8 +1861,9 @@
 
34288
          (match_operand:SI 3 "s_register_operand" "r")))]
 
34289
   "TARGET_32BIT && arm_arch6"
 
34290
   "mla%?\\t%0, %2, %1, %3"
 
34291
-  [(set_attr "insn" "mla")
 
34292
-   (set_attr "predicable" "yes")]
 
34293
+  [(set_attr "type" "mla")
 
34294
+   (set_attr "predicable" "yes")
 
34295
+   (set_attr "predicable_short_it" "no")]
 
34296
 )
 
34297
 
 
34298
 (define_insn "*mulsi3addsi_compare0"
 
34299
@@ -1467,7 +1880,7 @@
 
34300
   "TARGET_ARM && arm_arch6"
 
34301
   "mla%.\\t%0, %2, %1, %3"
 
34302
   [(set_attr "conds" "set")
 
34303
-   (set_attr "insn" "mlas")]
 
34304
+   (set_attr "type" "mlas")]
 
34305
 )
 
34306
 
 
34307
 (define_insn "*mulsi3addsi_compare0_v6"
 
34308
@@ -1484,7 +1897,7 @@
 
34309
   "TARGET_ARM && arm_arch6 && optimize_size"
 
34310
   "mla%.\\t%0, %2, %1, %3"
 
34311
   [(set_attr "conds" "set")
 
34312
-   (set_attr "insn" "mlas")]
 
34313
+   (set_attr "type" "mlas")]
 
34314
 )
 
34315
 
 
34316
 (define_insn "*mulsi3addsi_compare0_scratch"
 
34317
@@ -1499,7 +1912,7 @@
 
34318
   "TARGET_ARM && !arm_arch6"
 
34319
   "mla%.\\t%0, %2, %1, %3"
 
34320
   [(set_attr "conds" "set")
 
34321
-   (set_attr "insn" "mlas")]
 
34322
+   (set_attr "type" "mlas")]
 
34323
 )
 
34324
 
 
34325
 (define_insn "*mulsi3addsi_compare0_scratch_v6"
 
34326
@@ -1514,7 +1927,7 @@
 
34327
   "TARGET_ARM && arm_arch6 && optimize_size"
 
34328
   "mla%.\\t%0, %2, %1, %3"
 
34329
   [(set_attr "conds" "set")
 
34330
-   (set_attr "insn" "mlas")]
 
34331
+   (set_attr "type" "mlas")]
 
34332
 )
 
34333
 
 
34334
 (define_insn "*mulsi3subsi"
 
34335
@@ -1525,8 +1938,9 @@
 
34336
                   (match_operand:SI 1 "s_register_operand" "r"))))]
 
34337
   "TARGET_32BIT && arm_arch_thumb2"
 
34338
   "mls%?\\t%0, %2, %1, %3"
 
34339
-  [(set_attr "insn" "mla")
 
34340
-   (set_attr "predicable" "yes")]
 
34341
+  [(set_attr "type" "mla")
 
34342
+   (set_attr "predicable" "yes")
 
34343
+   (set_attr "predicable_short_it" "no")]
 
34344
 )
 
34345
 
 
34346
 (define_expand "maddsidi4"
 
34347
@@ -1548,7 +1962,7 @@
 
34348
         (match_operand:DI 1 "s_register_operand" "0")))]
 
34349
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34350
   "smlal%?\\t%Q0, %R0, %3, %2"
 
34351
-  [(set_attr "insn" "smlal")
 
34352
+  [(set_attr "type" "smlal")
 
34353
    (set_attr "predicable" "yes")]
 
34354
 )
 
34355
 
 
34356
@@ -1561,8 +1975,9 @@
 
34357
         (match_operand:DI 1 "s_register_operand" "0")))]
 
34358
   "TARGET_32BIT && arm_arch6"
 
34359
   "smlal%?\\t%Q0, %R0, %3, %2"
 
34360
-  [(set_attr "insn" "smlal")
 
34361
-   (set_attr "predicable" "yes")]
 
34362
+  [(set_attr "type" "smlal")
 
34363
+   (set_attr "predicable" "yes")
 
34364
+   (set_attr "predicable_short_it" "no")]
 
34365
 )
 
34366
 
 
34367
 ;; 32x32->64 widening multiply.
 
34368
@@ -1587,7 +2002,7 @@
 
34369
         (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))]
 
34370
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34371
   "smull%?\\t%Q0, %R0, %1, %2"
 
34372
-  [(set_attr "insn" "smull")
 
34373
+  [(set_attr "type" "smull")
 
34374
    (set_attr "predicable" "yes")]
 
34375
 )
 
34376
 
 
34377
@@ -1598,8 +2013,9 @@
 
34378
         (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))]
 
34379
   "TARGET_32BIT && arm_arch6"
 
34380
   "smull%?\\t%Q0, %R0, %1, %2"
 
34381
-  [(set_attr "insn" "smull")
 
34382
-   (set_attr "predicable" "yes")]
 
34383
+  [(set_attr "type" "smull")
 
34384
+   (set_attr "predicable" "yes")
 
34385
+   (set_attr "predicable_short_it" "no")]
 
34386
 )
 
34387
 
 
34388
 (define_expand "umulsidi3"
 
34389
@@ -1618,7 +2034,7 @@
 
34390
         (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))]
 
34391
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34392
   "umull%?\\t%Q0, %R0, %1, %2"
 
34393
-  [(set_attr "insn" "umull")
 
34394
+  [(set_attr "type" "umull")
 
34395
    (set_attr "predicable" "yes")]
 
34396
 )
 
34397
 
 
34398
@@ -1629,8 +2045,9 @@
 
34399
         (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))]
 
34400
   "TARGET_32BIT && arm_arch6"
 
34401
   "umull%?\\t%Q0, %R0, %1, %2"
 
34402
-  [(set_attr "insn" "umull")
 
34403
-   (set_attr "predicable" "yes")]
 
34404
+  [(set_attr "type" "umull")
 
34405
+   (set_attr "predicable" "yes")
 
34406
+   (set_attr "predicable_short_it" "no")]
 
34407
 )
 
34408
 
 
34409
 (define_expand "umaddsidi4"
 
34410
@@ -1652,7 +2069,7 @@
 
34411
         (match_operand:DI 1 "s_register_operand" "0")))]
 
34412
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34413
   "umlal%?\\t%Q0, %R0, %3, %2"
 
34414
-  [(set_attr "insn" "umlal")
 
34415
+  [(set_attr "type" "umlal")
 
34416
    (set_attr "predicable" "yes")]
 
34417
 )
 
34418
 
 
34419
@@ -1665,8 +2082,9 @@
 
34420
         (match_operand:DI 1 "s_register_operand" "0")))]
 
34421
   "TARGET_32BIT && arm_arch6"
 
34422
   "umlal%?\\t%Q0, %R0, %3, %2"
 
34423
-  [(set_attr "insn" "umlal")
 
34424
-   (set_attr "predicable" "yes")]
 
34425
+  [(set_attr "type" "umlal")
 
34426
+   (set_attr "predicable" "yes")
 
34427
+   (set_attr "predicable_short_it" "no")]
 
34428
 )
 
34429
 
 
34430
 (define_expand "smulsi3_highpart"
 
34431
@@ -1694,7 +2112,7 @@
 
34432
    (clobber (match_scratch:SI 3 "=&r,&r"))]
 
34433
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34434
   "smull%?\\t%3, %0, %2, %1"
 
34435
-  [(set_attr "insn" "smull")
 
34436
+  [(set_attr "type" "smull")
 
34437
    (set_attr "predicable" "yes")]
 
34438
 )
 
34439
 
 
34440
@@ -1709,8 +2127,9 @@
 
34441
    (clobber (match_scratch:SI 3 "=r"))]
 
34442
   "TARGET_32BIT && arm_arch6"
 
34443
   "smull%?\\t%3, %0, %2, %1"
 
34444
-  [(set_attr "insn" "smull")
 
34445
-   (set_attr "predicable" "yes")]
 
34446
+  [(set_attr "type" "smull")
 
34447
+   (set_attr "predicable" "yes")
 
34448
+   (set_attr "predicable_short_it" "no")]
 
34449
 )
 
34450
 
 
34451
 (define_expand "umulsi3_highpart"
 
34452
@@ -1738,7 +2157,7 @@
 
34453
    (clobber (match_scratch:SI 3 "=&r,&r"))]
 
34454
   "TARGET_32BIT && arm_arch3m && !arm_arch6"
 
34455
   "umull%?\\t%3, %0, %2, %1"
 
34456
-  [(set_attr "insn" "umull")
 
34457
+  [(set_attr "type" "umull")
 
34458
    (set_attr "predicable" "yes")]
 
34459
 )
 
34460
 
 
34461
@@ -1753,8 +2172,9 @@
 
34462
    (clobber (match_scratch:SI 3 "=r"))]
 
34463
   "TARGET_32BIT && arm_arch6"
 
34464
   "umull%?\\t%3, %0, %2, %1"
 
34465
-  [(set_attr "insn" "umull")
 
34466
-   (set_attr "predicable" "yes")]
 
34467
+  [(set_attr "type" "umull")
 
34468
+   (set_attr "predicable" "yes")
 
34469
+   (set_attr "predicable_short_it" "no")]
 
34470
 )
 
34471
 
 
34472
 (define_insn "mulhisi3"
 
34473
@@ -1765,7 +2185,7 @@
 
34474
                  (match_operand:HI 2 "s_register_operand" "r"))))]
 
34475
   "TARGET_DSP_MULTIPLY"
 
34476
   "smulbb%?\\t%0, %1, %2"
 
34477
-  [(set_attr "insn" "smulxy")
 
34478
+  [(set_attr "type" "smulxy")
 
34479
    (set_attr "predicable" "yes")]
 
34480
 )
 
34481
 
 
34482
@@ -1778,8 +2198,9 @@
 
34483
                  (match_operand:HI 2 "s_register_operand" "r"))))]
 
34484
   "TARGET_DSP_MULTIPLY"
 
34485
   "smultb%?\\t%0, %1, %2"
 
34486
-  [(set_attr "insn" "smulxy")
 
34487
-   (set_attr "predicable" "yes")]
 
34488
+  [(set_attr "type" "smulxy")
 
34489
+   (set_attr "predicable" "yes")
 
34490
+   (set_attr "predicable_short_it" "no")]
 
34491
 )
 
34492
 
 
34493
 (define_insn "*mulhisi3bt"
 
34494
@@ -1791,8 +2212,9 @@
 
34495
                  (const_int 16))))]
 
34496
   "TARGET_DSP_MULTIPLY"
 
34497
   "smulbt%?\\t%0, %1, %2"
 
34498
-  [(set_attr "insn" "smulxy")
 
34499
-   (set_attr "predicable" "yes")]
 
34500
+  [(set_attr "type" "smulxy")
 
34501
+   (set_attr "predicable" "yes")
 
34502
+   (set_attr "predicable_short_it" "no")]
 
34503
 )
 
34504
 
 
34505
 (define_insn "*mulhisi3tt"
 
34506
@@ -1805,8 +2227,9 @@
 
34507
                  (const_int 16))))]
 
34508
   "TARGET_DSP_MULTIPLY"
 
34509
   "smultt%?\\t%0, %1, %2"
 
34510
-  [(set_attr "insn" "smulxy")
 
34511
-   (set_attr "predicable" "yes")]
 
34512
+  [(set_attr "type" "smulxy")
 
34513
+   (set_attr "predicable" "yes")
 
34514
+   (set_attr "predicable_short_it" "no")]
 
34515
 )
 
34516
 
 
34517
 (define_insn "maddhisi4"
 
34518
@@ -1818,8 +2241,9 @@
 
34519
                 (match_operand:SI 3 "s_register_operand" "r")))]
 
34520
   "TARGET_DSP_MULTIPLY"
 
34521
   "smlabb%?\\t%0, %1, %2, %3"
 
34522
-  [(set_attr "insn" "smlaxy")
 
34523
-   (set_attr "predicable" "yes")]
 
34524
+  [(set_attr "type" "smlaxy")
 
34525
+   (set_attr "predicable" "yes")
 
34526
+   (set_attr "predicable_short_it" "no")]
 
34527
 )
 
34528
 
 
34529
 ;; Note: there is no maddhisi4ibt because this one is canonical form
 
34530
@@ -1833,8 +2257,9 @@
 
34531
                 (match_operand:SI 3 "s_register_operand" "r")))]
 
34532
   "TARGET_DSP_MULTIPLY"
 
34533
   "smlatb%?\\t%0, %1, %2, %3"
 
34534
-  [(set_attr "insn" "smlaxy")
 
34535
-   (set_attr "predicable" "yes")]
 
34536
+  [(set_attr "type" "smlaxy")
 
34537
+   (set_attr "predicable" "yes")
 
34538
+   (set_attr "predicable_short_it" "no")]
 
34539
 )
 
34540
 
 
34541
 (define_insn "*maddhisi4tt"
 
34542
@@ -1848,22 +2273,24 @@
 
34543
                 (match_operand:SI 3 "s_register_operand" "r")))]
 
34544
   "TARGET_DSP_MULTIPLY"
 
34545
   "smlatt%?\\t%0, %1, %2, %3"
 
34546
-  [(set_attr "insn" "smlaxy")
 
34547
-   (set_attr "predicable" "yes")]
 
34548
+  [(set_attr "type" "smlaxy")
 
34549
+   (set_attr "predicable" "yes")
 
34550
+   (set_attr "predicable_short_it" "no")]
 
34551
 )
 
34552
 
 
34553
 (define_insn "maddhidi4"
 
34554
   [(set (match_operand:DI 0 "s_register_operand" "=r")
 
34555
        (plus:DI
 
34556
          (mult:DI (sign_extend:DI
 
34557
-                   (match_operand:HI 1 "s_register_operand" "r"))
 
34558
+                   (match_operand:HI 1 "s_register_operand" "r"))
 
34559
                   (sign_extend:DI
 
34560
                    (match_operand:HI 2 "s_register_operand" "r")))
 
34561
          (match_operand:DI 3 "s_register_operand" "0")))]
 
34562
   "TARGET_DSP_MULTIPLY"
 
34563
   "smlalbb%?\\t%Q0, %R0, %1, %2"
 
34564
-  [(set_attr "insn" "smlalxy")
 
34565
-   (set_attr "predicable" "yes")])
 
34566
+  [(set_attr "type" "smlalxy")
 
34567
+   (set_attr "predicable" "yes")
 
34568
+   (set_attr "predicable_short_it" "no")])
 
34569
 
 
34570
 ;; Note: there is no maddhidi4ibt because this one is canonical form
 
34571
 (define_insn "*maddhidi4tb"
 
34572
@@ -1878,8 +2305,9 @@
 
34573
          (match_operand:DI 3 "s_register_operand" "0")))]
 
34574
   "TARGET_DSP_MULTIPLY"
 
34575
   "smlaltb%?\\t%Q0, %R0, %1, %2"
 
34576
-  [(set_attr "insn" "smlalxy")
 
34577
-   (set_attr "predicable" "yes")])
 
34578
+  [(set_attr "type" "smlalxy")
 
34579
+   (set_attr "predicable" "yes")
 
34580
+   (set_attr "predicable_short_it" "no")])
 
34581
 
 
34582
 (define_insn "*maddhidi4tt"
 
34583
   [(set (match_operand:DI 0 "s_register_operand" "=r")
 
34584
@@ -1895,8 +2323,9 @@
 
34585
          (match_operand:DI 3 "s_register_operand" "0")))]
 
34586
   "TARGET_DSP_MULTIPLY"
 
34587
   "smlaltt%?\\t%Q0, %R0, %1, %2"
 
34588
-  [(set_attr "insn" "smlalxy")
 
34589
-   (set_attr "predicable" "yes")])
 
34590
+  [(set_attr "type" "smlalxy")
 
34591
+   (set_attr "predicable" "yes")
 
34592
+   (set_attr "predicable_short_it" "no")])
 
34593
 
 
34594
 (define_expand "mulsf3"
 
34595
   [(set (match_operand:SF          0 "s_register_operand" "")
 
34596
@@ -2024,13 +2453,49 @@
 
34597
   ""
 
34598
 )
 
34599
 
 
34600
-(define_insn "*anddi3_insn"
 
34601
-  [(set (match_operand:DI         0 "s_register_operand" "=&r,&r")
 
34602
-       (and:DI (match_operand:DI 1 "s_register_operand"  "%0,r")
 
34603
-               (match_operand:DI 2 "s_register_operand"   "r,r")))]
 
34604
-  "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON"
 
34605
-  "#"
 
34606
-  [(set_attr "length" "8")]
 
34607
+(define_insn_and_split "*anddi3_insn"
 
34608
+  [(set (match_operand:DI         0 "s_register_operand"     "=w,w ,&r,&r,&r,&r,?w,?w")
 
34609
+        (and:DI (match_operand:DI 1 "s_register_operand"     "%w,0 ,0 ,r ,0 ,r ,w ,0")
 
34610
+                (match_operand:DI 2 "arm_anddi_operand_neon" "w ,DL,r ,r ,De,De,w ,DL")))]
 
34611
+  "TARGET_32BIT && !TARGET_IWMMXT"
 
34612
+{
 
34613
+  switch (which_alternative)
 
34614
+    {
 
34615
+    case 0: /* fall through */
 
34616
+    case 6: return "vand\t%P0, %P1, %P2";
 
34617
+    case 1: /* fall through */
 
34618
+    case 7: return neon_output_logic_immediate ("vand", &operands[2],
 
34619
+                    DImode, 1, VALID_NEON_QREG_MODE (DImode));
 
34620
+    case 2:
 
34621
+    case 3:
 
34622
+    case 4:
 
34623
+    case 5: /* fall through */
 
34624
+      return "#";
 
34625
+    default: gcc_unreachable ();
 
34626
+    }
 
34627
+}
 
34628
+  "TARGET_32BIT && !TARGET_IWMMXT && reload_completed
 
34629
+   && !(IS_VFP_REGNUM (REGNO (operands[0])))"
 
34630
+  [(set (match_dup 3) (match_dup 4))
 
34631
+   (set (match_dup 5) (match_dup 6))]
 
34632
+  "
 
34633
+  {
 
34634
+    operands[3] = gen_lowpart (SImode, operands[0]);
 
34635
+    operands[5] = gen_highpart (SImode, operands[0]);
 
34636
+
 
34637
+    operands[4] = simplify_gen_binary (AND, SImode,
 
34638
+                                           gen_lowpart (SImode, operands[1]),
 
34639
+                                           gen_lowpart (SImode, operands[2]));
 
34640
+    operands[6] = simplify_gen_binary (AND, SImode,
 
34641
+                                           gen_highpart (SImode, operands[1]),
 
34642
+                                           gen_highpart_mode (SImode, DImode, operands[2]));
 
34643
+
 
34644
+  }"
 
34645
+  [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,*,*,neon_int_1,neon_int_1")
 
34646
+   (set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,*,
 
34647
+                     avoid_neon_for_64bits,avoid_neon_for_64bits")
 
34648
+   (set_attr "length" "*,*,8,8,8,8,*,*")
 
34649
+  ]
 
34650
 )
 
34651
 
 
34652
 (define_insn_and_split "*anddi_zesidi_di"
 
34653
@@ -2145,12 +2610,13 @@
 
34654
 
 
34655
 ; ??? Check split length for Thumb-2
 
34656
 (define_insn_and_split "*arm_andsi3_insn"
 
34657
-  [(set (match_operand:SI         0 "s_register_operand" "=r,r,r,r")
 
34658
-       (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r,r")
 
34659
-               (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))]
 
34660
+  [(set (match_operand:SI         0 "s_register_operand" "=r,l,r,r,r")
 
34661
+       (and:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r,r")
 
34662
+               (match_operand:SI 2 "reg_or_int_operand" "I,l,K,r,?n")))]
 
34663
   "TARGET_32BIT"
 
34664
   "@
 
34665
    and%?\\t%0, %1, %2
 
34666
+   and%?\\t%0, %1, %2
 
34667
    bic%?\\t%0, %1, #%B2
 
34668
    and%?\\t%0, %1, %2
 
34669
    #"
 
34670
@@ -2164,9 +2630,11 @@
 
34671
                       INTVAL (operands[2]), operands[0], operands[1], 0);
 
34672
   DONE;
 
34673
   "
 
34674
-  [(set_attr "length" "4,4,4,16")
 
34675
+  [(set_attr "length" "4,4,4,4,16")
 
34676
    (set_attr "predicable" "yes")
 
34677
-   (set_attr "type"    "simple_alu_imm,simple_alu_imm,*,simple_alu_imm")]
 
34678
+   (set_attr "predicable_short_it" "no,yes,no,no,no")
 
34679
+   (set_attr "type"
 
34680
+     "arlo_imm,arlo_imm,*,*,arlo_imm")]
 
34681
 )
 
34682
 
 
34683
 (define_insn "*thumb1_andsi3_insn"
 
34684
@@ -2176,7 +2644,7 @@
 
34685
   "TARGET_THUMB1"
 
34686
   "and\\t%0, %2"
 
34687
   [(set_attr "length" "2")
 
34688
-   (set_attr "type"  "simple_alu_imm")
 
34689
+   (set_attr "type"  "arlo_imm")
 
34690
    (set_attr "conds" "set")])
 
34691
 
 
34692
 (define_insn "*andsi3_compare0"
 
34693
@@ -2193,7 +2661,7 @@
 
34694
    bic%.\\t%0, %1, #%B2
 
34695
    and%.\\t%0, %1, %2"
 
34696
   [(set_attr "conds" "set")
 
34697
-   (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
 
34698
+   (set_attr "type" "arlo_imm,arlo_imm,*")]
 
34699
 )
 
34700
 
 
34701
 (define_insn "*andsi3_compare0_scratch"
 
34702
@@ -2209,14 +2677,14 @@
 
34703
    bic%.\\t%2, %0, #%B1
 
34704
    tst%?\\t%0, %1"
 
34705
   [(set_attr "conds" "set")
 
34706
-   (set_attr "type"  "simple_alu_imm,simple_alu_imm,*")]
 
34707
+   (set_attr "type"  "arlo_imm,arlo_imm,*")]
 
34708
 )
 
34709
 
 
34710
 (define_insn "*zeroextractsi_compare0_scratch"
 
34711
   [(set (reg:CC_NOOV CC_REGNUM)
 
34712
        (compare:CC_NOOV (zero_extract:SI
 
34713
                          (match_operand:SI 0 "s_register_operand" "r")
 
34714
-                         (match_operand 1 "const_int_operand" "n")
 
34715
+                         (match_operand 1 "const_int_operand" "n")
 
34716
                          (match_operand 2 "const_int_operand" "n"))
 
34717
                         (const_int 0)))]
 
34718
   "TARGET_32BIT
 
34719
@@ -2232,7 +2700,8 @@
 
34720
   "
 
34721
   [(set_attr "conds" "set")
 
34722
    (set_attr "predicable" "yes")
 
34723
-   (set_attr "type" "simple_alu_imm")]
 
34724
+   (set_attr "predicable_short_it" "no")
 
34725
+   (set_attr "type" "arlo_imm")]
 
34726
 )
 
34727
 
 
34728
 (define_insn_and_split "*ne_zeroextractsi"
 
34729
@@ -2659,7 +3128,8 @@
 
34730
   "arm_arch_thumb2"
 
34731
   "bfc%?\t%0, %2, %1"
 
34732
   [(set_attr "length" "4")
 
34733
-   (set_attr "predicable" "yes")]
 
34734
+   (set_attr "predicable" "yes")
 
34735
+   (set_attr "predicable_short_it" "no")]
 
34736
 )
 
34737
 
 
34738
 (define_insn "insv_t2"
 
34739
@@ -2670,7 +3140,8 @@
 
34740
   "arm_arch_thumb2"
 
34741
   "bfi%?\t%0, %3, %2, %1"
 
34742
   [(set_attr "length" "4")
 
34743
-   (set_attr "predicable" "yes")]
 
34744
+   (set_attr "predicable" "yes")
 
34745
+   (set_attr "predicable_short_it" "no")]
 
34746
 )
 
34747
 
 
34748
 ; constants for op 2 will never be given to these patterns.
 
34749
@@ -2697,7 +3168,7 @@
 
34750
   [(set_attr "length" "8")
 
34751
    (set_attr "predicable" "yes")]
 
34752
 )
 
34753
-  
 
34754
+
 
34755
 (define_insn_and_split "*anddi_notzesidi_di"
 
34756
   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
 
34757
        (and:DI (not:DI (zero_extend:DI
 
34758
@@ -2722,9 +3193,10 @@
 
34759
     operands[1] = gen_lowpart (SImode, operands[1]);
 
34760
   }"
 
34761
   [(set_attr "length" "4,8")
 
34762
-   (set_attr "predicable" "yes")]
 
34763
+   (set_attr "predicable" "yes")
 
34764
+   (set_attr "predicable_short_it" "no")]
 
34765
 )
 
34766
-  
 
34767
+
 
34768
 (define_insn_and_split "*anddi_notsesidi_di"
 
34769
   [(set (match_operand:DI 0 "s_register_operand" "=&r,&r")
 
34770
        (and:DI (not:DI (sign_extend:DI
 
34771
@@ -2745,16 +3217,18 @@
 
34772
     operands[1] = gen_lowpart (SImode, operands[1]);
 
34773
   }"
 
34774
   [(set_attr "length" "8")
 
34775
-   (set_attr "predicable" "yes")]
 
34776
+   (set_attr "predicable" "yes")
 
34777
+   (set_attr "predicable_short_it" "no")]
 
34778
 )
 
34779
-  
 
34780
+
 
34781
 (define_insn "andsi_notsi_si"
 
34782
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
34783
        (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r"))
 
34784
                (match_operand:SI 1 "s_register_operand" "r")))]
 
34785
   "TARGET_32BIT"
 
34786
   "bic%?\\t%0, %1, %2"
 
34787
-  [(set_attr "predicable" "yes")]
 
34788
+  [(set_attr "predicable" "yes")
 
34789
+   (set_attr "predicable_short_it" "no")]
 
34790
 )
 
34791
 
 
34792
 (define_insn "thumb1_bicsi3"
 
34793
@@ -2777,8 +3251,8 @@
 
34794
   [(set_attr "predicable" "yes")
 
34795
    (set_attr "shift" "2")
 
34796
    (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
 
34797
-                     (const_string "alu_shift")
 
34798
-                     (const_string "alu_shift_reg")))]
 
34799
+                     (const_string "arlo_shift")
 
34800
+                     (const_string "arlo_shift_reg")))]
 
34801
 )
 
34802
 
 
34803
 (define_insn "*andsi_notsi_si_compare0"
 
34804
@@ -2814,14 +3288,47 @@
 
34805
   ""
 
34806
 )
 
34807
 
 
34808
-(define_insn "*iordi3_insn"
 
34809
-  [(set (match_operand:DI         0 "s_register_operand" "=&r,&r")
 
34810
-       (ior:DI (match_operand:DI 1 "s_register_operand"  "%0,r")
 
34811
-               (match_operand:DI 2 "s_register_operand"   "r,r")))]
 
34812
-  "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON"
 
34813
-  "#"
 
34814
-  [(set_attr "length" "8")
 
34815
-   (set_attr "predicable" "yes")]
 
34816
+(define_insn_and_split "*iordi3_insn"
 
34817
+  [(set (match_operand:DI         0 "s_register_operand"     "=w,w ,&r,&r,&r,&r,?w,?w")
 
34818
+       (ior:DI (match_operand:DI 1 "s_register_operand"     "%w,0 ,0 ,r ,0 ,r ,w ,0")
 
34819
+               (match_operand:DI 2 "arm_iordi_operand_neon" "w ,Dl,r ,r ,Df,Df,w ,Dl")))]
 
34820
+  "TARGET_32BIT && !TARGET_IWMMXT"
 
34821
+  {
 
34822
+  switch (which_alternative)
 
34823
+    {
 
34824
+    case 0: /* fall through */
 
34825
+    case 6: return "vorr\t%P0, %P1, %P2";
 
34826
+    case 1: /* fall through */
 
34827
+    case 7: return neon_output_logic_immediate ("vorr", &operands[2],
 
34828
+                    DImode, 0, VALID_NEON_QREG_MODE (DImode));
 
34829
+    case 2:
 
34830
+    case 3:
 
34831
+    case 4:
 
34832
+    case 5:
 
34833
+      return "#";
 
34834
+    default: gcc_unreachable ();
 
34835
+    }
 
34836
+  }
 
34837
+  "TARGET_32BIT && !TARGET_IWMMXT && reload_completed
 
34838
+   && !(IS_VFP_REGNUM (REGNO (operands[0])))"
 
34839
+  [(set (match_dup 3) (match_dup 4))
 
34840
+   (set (match_dup 5) (match_dup 6))]
 
34841
+  "
 
34842
+  {
 
34843
+    operands[3] = gen_lowpart (SImode, operands[0]);
 
34844
+    operands[5] = gen_highpart (SImode, operands[0]);
 
34845
+
 
34846
+    operands[4] = simplify_gen_binary (IOR, SImode,
 
34847
+                                           gen_lowpart (SImode, operands[1]),
 
34848
+                                           gen_lowpart (SImode, operands[2]));
 
34849
+    operands[6] = simplify_gen_binary (IOR, SImode,
 
34850
+                                           gen_highpart (SImode, operands[1]),
 
34851
+                                           gen_highpart_mode (SImode, DImode, operands[2]));
 
34852
+
 
34853
+  }"
 
34854
+  [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*,*,*,neon_int_1,neon_int_1")
 
34855
+   (set_attr "length" "*,*,8,8,8,8,*,*")
 
34856
+   (set_attr "arch" "neon_for_64bits,neon_for_64bits,*,*,*,*,avoid_neon_for_64bits,avoid_neon_for_64bits")]
 
34857
 )
 
34858
 
 
34859
 (define_insn "*iordi_zesidi_di"
 
34860
@@ -2834,7 +3341,8 @@
 
34861
    orr%?\\t%Q0, %Q1, %2
 
34862
    #"
 
34863
   [(set_attr "length" "4,8")
 
34864
-   (set_attr "predicable" "yes")]
 
34865
+   (set_attr "predicable" "yes")
 
34866
+   (set_attr "predicable_short_it" "no")]
 
34867
 )
 
34868
 
 
34869
 (define_insn "*iordi_sesidi_di"
 
34870
@@ -2879,12 +3387,13 @@
 
34871
 )
 
34872
 
 
34873
 (define_insn_and_split "*iorsi3_insn"
 
34874
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r")
 
34875
-       (ior:SI (match_operand:SI 1 "s_register_operand" "%r,r,r,r")
 
34876
-               (match_operand:SI 2 "reg_or_int_operand" "I,K,r,?n")))]
 
34877
+  [(set (match_operand:SI 0 "s_register_operand" "=r,l,r,r,r")
 
34878
+       (ior:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r,r")
 
34879
+               (match_operand:SI 2 "reg_or_int_operand" "I,l,K,r,?n")))]
 
34880
   "TARGET_32BIT"
 
34881
   "@
 
34882
    orr%?\\t%0, %1, %2
 
34883
+   orr%?\\t%0, %1, %2
 
34884
    orn%?\\t%0, %1, #%B2
 
34885
    orr%?\\t%0, %1, %2
 
34886
    #"
 
34887
@@ -2894,14 +3403,15 @@
 
34888
         || (TARGET_THUMB2 && const_ok_for_arm (~INTVAL (operands[2]))))"
 
34889
   [(clobber (const_int 0))]
 
34890
 {
 
34891
-  arm_split_constant (IOR, SImode, curr_insn, 
 
34892
+  arm_split_constant (IOR, SImode, curr_insn,
 
34893
                       INTVAL (operands[2]), operands[0], operands[1], 0);
 
34894
   DONE;
 
34895
 }
 
34896
-  [(set_attr "length" "4,4,4,16")
 
34897
-   (set_attr "arch" "32,t2,32,32")
 
34898
+  [(set_attr "length" "4,4,4,4,16")
 
34899
+   (set_attr "arch" "32,t2,t2,32,32")
 
34900
    (set_attr "predicable" "yes")
 
34901
-   (set_attr "type" "simple_alu_imm,simple_alu_imm,*,*")]
 
34902
+   (set_attr "predicable_short_it" "no,yes,no,no,no")
 
34903
+   (set_attr "type" "arlo_imm,*,arlo_imm,*,*")]
 
34904
 )
 
34905
 
 
34906
 (define_insn "*thumb1_iorsi3_insn"
 
34907
@@ -2936,7 +3446,7 @@
 
34908
   "TARGET_32BIT"
 
34909
   "orr%.\\t%0, %1, %2"
 
34910
   [(set_attr "conds" "set")
 
34911
-   (set_attr "type" "simple_alu_imm,*")]
 
34912
+   (set_attr "type" "arlo_imm,*")]
 
34913
 )
 
34914
 
 
34915
 (define_insn "*iorsi3_compare0_scratch"
 
34916
@@ -2948,25 +3458,55 @@
 
34917
   "TARGET_32BIT"
 
34918
   "orr%.\\t%0, %1, %2"
 
34919
   [(set_attr "conds" "set")
 
34920
-   (set_attr "type" "simple_alu_imm, *")]
 
34921
+   (set_attr "type" "arlo_imm,*")]
 
34922
 )
 
34923
 
 
34924
 (define_expand "xordi3"
 
34925
   [(set (match_operand:DI         0 "s_register_operand" "")
 
34926
        (xor:DI (match_operand:DI 1 "s_register_operand" "")
 
34927
-               (match_operand:DI 2 "s_register_operand" "")))]
 
34928
+               (match_operand:DI 2 "arm_xordi_operand" "")))]
 
34929
   "TARGET_32BIT"
 
34930
   ""
 
34931
 )
 
34932
 
 
34933
-(define_insn "*xordi3_insn"
 
34934
-  [(set (match_operand:DI         0 "s_register_operand" "=&r,&r")
 
34935
-       (xor:DI (match_operand:DI 1 "s_register_operand"  "%0,r")
 
34936
-               (match_operand:DI 2 "s_register_operand"   "r,r")))]
 
34937
-  "TARGET_32BIT && !TARGET_IWMMXT && !TARGET_NEON"
 
34938
-  "#"
 
34939
-  [(set_attr "length" "8")
 
34940
-   (set_attr "predicable" "yes")]
 
34941
+(define_insn_and_split "*xordi3_insn"
 
34942
+  [(set (match_operand:DI         0 "s_register_operand" "=w,&r,&r,&r,&r,?w")
 
34943
+       (xor:DI (match_operand:DI 1 "s_register_operand" "w ,%0,r ,0 ,r ,w")
 
34944
+               (match_operand:DI 2 "arm_xordi_operand"  "w ,r ,r ,Dg,Dg,w")))]
 
34945
+  "TARGET_32BIT && !TARGET_IWMMXT"
 
34946
+{
 
34947
+  switch (which_alternative)
 
34948
+    {
 
34949
+    case 1:
 
34950
+    case 2:
 
34951
+    case 3:
 
34952
+    case 4:  /* fall through */
 
34953
+      return "#";
 
34954
+    case 0: /* fall through */
 
34955
+    case 5: return "veor\t%P0, %P1, %P2";
 
34956
+    default: gcc_unreachable ();
 
34957
+    }
 
34958
+}
 
34959
+  "TARGET_32BIT && !TARGET_IWMMXT && reload_completed
 
34960
+   && !(IS_VFP_REGNUM (REGNO (operands[0])))"
 
34961
+  [(set (match_dup 3) (match_dup 4))
 
34962
+   (set (match_dup 5) (match_dup 6))]
 
34963
+  "
 
34964
+  {
 
34965
+    operands[3] = gen_lowpart (SImode, operands[0]);
 
34966
+    operands[5] = gen_highpart (SImode, operands[0]);
 
34967
+
 
34968
+    operands[4] = simplify_gen_binary (XOR, SImode,
 
34969
+                                           gen_lowpart (SImode, operands[1]),
 
34970
+                                           gen_lowpart (SImode, operands[2]));
 
34971
+    operands[6] = simplify_gen_binary (XOR, SImode,
 
34972
+                                           gen_highpart (SImode, operands[1]),
 
34973
+                                           gen_highpart_mode (SImode, DImode, operands[2]));
 
34974
+
 
34975
+  }"
 
34976
+  [(set_attr "length" "*,8,8,8,8,*")
 
34977
+   (set_attr "neon_type" "neon_int_1,*,*,*,*,neon_int_1")
 
34978
+   (set_attr "arch" "neon_for_64bits,*,*,*,*,avoid_neon_for_64bits")]
 
34979
 )
 
34980
 
 
34981
 (define_insn "*xordi_zesidi_di"
 
34982
@@ -2979,7 +3519,8 @@
 
34983
    eor%?\\t%Q0, %Q1, %2
 
34984
    #"
 
34985
   [(set_attr "length" "4,8")
 
34986
-   (set_attr "predicable" "yes")]
 
34987
+   (set_attr "predicable" "yes")
 
34988
+   (set_attr "predicable_short_it" "no")]
 
34989
 )
 
34990
 
 
34991
 (define_insn "*xordi_sesidi_di"
 
34992
@@ -3022,13 +3563,14 @@
 
34993
 )
 
34994
 
 
34995
 (define_insn_and_split "*arm_xorsi3"
 
34996
-  [(set (match_operand:SI         0 "s_register_operand" "=r,r,r")
 
34997
-       (xor:SI (match_operand:SI 1 "s_register_operand" "%r,r,r")
 
34998
-               (match_operand:SI 2 "reg_or_int_operand" "I,r,?n")))]
 
34999
+  [(set (match_operand:SI         0 "s_register_operand" "=r,l,r,r")
 
35000
+       (xor:SI (match_operand:SI 1 "s_register_operand" "%r,0,r,r")
 
35001
+               (match_operand:SI 2 "reg_or_int_operand" "I,l,r,?n")))]
 
35002
   "TARGET_32BIT"
 
35003
   "@
 
35004
    eor%?\\t%0, %1, %2
 
35005
    eor%?\\t%0, %1, %2
 
35006
+   eor%?\\t%0, %1, %2
 
35007
    #"
 
35008
   "TARGET_32BIT
 
35009
    && CONST_INT_P (operands[2])
 
35010
@@ -3039,9 +3581,10 @@
 
35011
                       INTVAL (operands[2]), operands[0], operands[1], 0);
 
35012
   DONE;
 
35013
 }
 
35014
-  [(set_attr "length" "4,4,16")
 
35015
+  [(set_attr "length" "4,4,4,16")
 
35016
    (set_attr "predicable" "yes")
 
35017
-   (set_attr "type"  "simple_alu_imm,*,*")]
 
35018
+   (set_attr "predicable_short_it" "no,yes,no,no")
 
35019
+   (set_attr "type"  "arlo_imm,*,*,*")]
 
35020
 )
 
35021
 
 
35022
 (define_insn "*thumb1_xorsi3_insn"
 
35023
@@ -3052,7 +3595,7 @@
 
35024
   "eor\\t%0, %2"
 
35025
   [(set_attr "length" "2")
 
35026
    (set_attr "conds" "set")
 
35027
-   (set_attr "type" "simple_alu_imm")]
 
35028
+   (set_attr "type" "arlo_imm")]
 
35029
 )
 
35030
 
 
35031
 (define_insn "*xorsi3_compare0"
 
35032
@@ -3065,7 +3608,7 @@
 
35033
   "TARGET_32BIT"
 
35034
   "eor%.\\t%0, %1, %2"
 
35035
   [(set_attr "conds" "set")
 
35036
-   (set_attr "type" "simple_alu_imm,*")]
 
35037
+   (set_attr "type" "arlo_imm,*")]
 
35038
 )
 
35039
 
 
35040
 (define_insn "*xorsi3_compare0_scratch"
 
35041
@@ -3076,7 +3619,7 @@
 
35042
   "TARGET_32BIT"
 
35043
   "teq%?\\t%0, %1"
 
35044
   [(set_attr "conds" "set")
 
35045
-   (set_attr "type" "simple_alu_imm, *")]
 
35046
+   (set_attr "type" "arlo_imm,*")]
 
35047
 )
 
35048
 
 
35049
 ; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), 
 
35050
@@ -3096,16 +3639,21 @@
 
35051
   ""
 
35052
 )
 
35053
 
 
35054
-(define_insn "*andsi_iorsi3_notsi"
 
35055
+(define_insn_and_split "*andsi_iorsi3_notsi"
 
35056
   [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r")
 
35057
        (and:SI (ior:SI (match_operand:SI 1 "s_register_operand" "%0,r,r")
 
35058
                        (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))
 
35059
                (not:SI (match_operand:SI 3 "arm_rhs_operand" "rI,rI,rI"))))]
 
35060
   "TARGET_32BIT"
 
35061
-  "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3"
 
35062
+  "#"   ; "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3"
 
35063
+  "&& reload_completed"
 
35064
+  [(set (match_dup 0) (ior:SI (match_dup 1) (match_dup 2)))
 
35065
+   (set (match_dup 0) (and:SI (not:SI (match_dup 3)) (match_dup 0)))]
 
35066
+  ""
 
35067
   [(set_attr "length" "8")
 
35068
    (set_attr "ce_count" "2")
 
35069
-   (set_attr "predicable" "yes")]
 
35070
+   (set_attr "predicable" "yes")
 
35071
+   (set_attr "predicable_short_it" "no")]
 
35072
 )
 
35073
 
 
35074
 ; ??? Are these four splitters still beneficial when the Thumb-2 bitfield
 
35075
@@ -3241,7 +3789,8 @@
 
35076
                 (const_int 0)))]
 
35077
   "TARGET_32BIT"
 
35078
   "bic%?\\t%0, %1, %1, asr #31"
 
35079
-  [(set_attr "predicable" "yes")]
 
35080
+  [(set_attr "predicable" "yes")
 
35081
+   (set_attr "predicable_short_it" "no")]
 
35082
 )
 
35083
 
 
35084
 (define_insn "*smax_m1"
 
35085
@@ -3250,18 +3799,27 @@
 
35086
                 (const_int -1)))]
 
35087
   "TARGET_32BIT"
 
35088
   "orr%?\\t%0, %1, %1, asr #31"
 
35089
-  [(set_attr "predicable" "yes")]
 
35090
+  [(set_attr "predicable" "yes")
 
35091
+   (set_attr "predicable_short_it" "no")]
 
35092
 )
 
35093
 
 
35094
-(define_insn "*arm_smax_insn"
 
35095
+(define_insn_and_split "*arm_smax_insn"
 
35096
   [(set (match_operand:SI          0 "s_register_operand" "=r,r")
 
35097
        (smax:SI (match_operand:SI 1 "s_register_operand"  "%0,?r")
 
35098
                 (match_operand:SI 2 "arm_rhs_operand"    "rI,rI")))
 
35099
    (clobber (reg:CC CC_REGNUM))]
 
35100
   "TARGET_ARM"
 
35101
-  "@
 
35102
-   cmp\\t%1, %2\;movlt\\t%0, %2
 
35103
-   cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"
 
35104
+  "#"
 
35105
+   ; cmp\\t%1, %2\;movlt\\t%0, %2
 
35106
+   ; cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"
 
35107
+  "TARGET_ARM"
 
35108
+  [(set (reg:CC CC_REGNUM)
 
35109
+        (compare:CC (match_dup 1) (match_dup 2)))
 
35110
+   (set (match_dup 0)
 
35111
+        (if_then_else:SI (ge:SI (reg:CC CC_REGNUM) (const_int 0))
 
35112
+                         (match_dup 1)
 
35113
+                         (match_dup 2)))]
 
35114
+  ""
 
35115
   [(set_attr "conds" "clob")
 
35116
    (set_attr "length" "8,12")]
 
35117
 )
 
35118
@@ -3290,18 +3848,27 @@
 
35119
                 (const_int 0)))]
 
35120
   "TARGET_32BIT"
 
35121
   "and%?\\t%0, %1, %1, asr #31"
 
35122
-  [(set_attr "predicable" "yes")]
 
35123
+  [(set_attr "predicable" "yes")
 
35124
+   (set_attr "predicable_short_it" "no")]
 
35125
 )
 
35126
 
 
35127
-(define_insn "*arm_smin_insn"
 
35128
+(define_insn_and_split "*arm_smin_insn"
 
35129
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
35130
        (smin:SI (match_operand:SI 1 "s_register_operand" "%0,?r")
 
35131
                 (match_operand:SI 2 "arm_rhs_operand" "rI,rI")))
 
35132
    (clobber (reg:CC CC_REGNUM))]
 
35133
   "TARGET_ARM"
 
35134
-  "@
 
35135
-   cmp\\t%1, %2\;movge\\t%0, %2
 
35136
-   cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"
 
35137
+  "#"
 
35138
+    ; cmp\\t%1, %2\;movge\\t%0, %2
 
35139
+    ; cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"
 
35140
+  "TARGET_ARM"
 
35141
+  [(set (reg:CC CC_REGNUM)
 
35142
+        (compare:CC (match_dup 1) (match_dup 2)))
 
35143
+   (set (match_dup 0)
 
35144
+        (if_then_else:SI (lt:SI (reg:CC CC_REGNUM) (const_int 0))
 
35145
+                         (match_dup 1)
 
35146
+                         (match_dup 2)))]
 
35147
+  ""
 
35148
   [(set_attr "conds" "clob")
 
35149
    (set_attr "length" "8,12")]
 
35150
 )
 
35151
@@ -3316,16 +3883,24 @@
 
35152
   ""
 
35153
 )
 
35154
 
 
35155
-(define_insn "*arm_umaxsi3"
 
35156
+(define_insn_and_split "*arm_umaxsi3"
 
35157
   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
35158
        (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
 
35159
                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
35160
    (clobber (reg:CC CC_REGNUM))]
 
35161
   "TARGET_ARM"
 
35162
-  "@
 
35163
-   cmp\\t%1, %2\;movcc\\t%0, %2
 
35164
-   cmp\\t%1, %2\;movcs\\t%0, %1
 
35165
-   cmp\\t%1, %2\;movcs\\t%0, %1\;movcc\\t%0, %2"
 
35166
+  "#"
 
35167
+    ; cmp\\t%1, %2\;movcc\\t%0, %2
 
35168
+    ; cmp\\t%1, %2\;movcs\\t%0, %1
 
35169
+    ; cmp\\t%1, %2\;movcs\\t%0, %1\;movcc\\t%0, %2"
 
35170
+  "TARGET_ARM"
 
35171
+  [(set (reg:CC CC_REGNUM)
 
35172
+        (compare:CC (match_dup 1) (match_dup 2)))
 
35173
+   (set (match_dup 0)
 
35174
+        (if_then_else:SI (geu:SI (reg:CC CC_REGNUM) (const_int 0))
 
35175
+                         (match_dup 1)
 
35176
+                         (match_dup 2)))]
 
35177
+  ""
 
35178
   [(set_attr "conds" "clob")
 
35179
    (set_attr "length" "8,8,12")]
 
35180
 )
 
35181
@@ -3340,16 +3915,24 @@
 
35182
   ""
 
35183
 )
 
35184
 
 
35185
-(define_insn "*arm_uminsi3"
 
35186
+(define_insn_and_split "*arm_uminsi3"
 
35187
   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
35188
        (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r")
 
35189
                 (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))
 
35190
    (clobber (reg:CC CC_REGNUM))]
 
35191
   "TARGET_ARM"
 
35192
-  "@
 
35193
-   cmp\\t%1, %2\;movcs\\t%0, %2
 
35194
-   cmp\\t%1, %2\;movcc\\t%0, %1
 
35195
-   cmp\\t%1, %2\;movcc\\t%0, %1\;movcs\\t%0, %2"
 
35196
+  "#"
 
35197
+   ; cmp\\t%1, %2\;movcs\\t%0, %2
 
35198
+   ; cmp\\t%1, %2\;movcc\\t%0, %1
 
35199
+   ; cmp\\t%1, %2\;movcc\\t%0, %1\;movcs\\t%0, %2"
 
35200
+  "TARGET_ARM"
 
35201
+  [(set (reg:CC CC_REGNUM)
 
35202
+        (compare:CC (match_dup 1) (match_dup 2)))
 
35203
+   (set (match_dup 0)
 
35204
+        (if_then_else:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0))
 
35205
+                         (match_dup 1)
 
35206
+                         (match_dup 2)))]
 
35207
+  ""
 
35208
   [(set_attr "conds" "clob")
 
35209
    (set_attr "length" "8,8,12")]
 
35210
 )
 
35211
@@ -3360,7 +3943,7 @@
 
35212
         [(match_operand:SI 1 "s_register_operand" "r")
 
35213
          (match_operand:SI 2 "s_register_operand" "r")]))
 
35214
    (clobber (reg:CC CC_REGNUM))]
 
35215
-  "TARGET_32BIT"
 
35216
+  "TARGET_32BIT && optimize_insn_for_size_p()"
 
35217
   "*
 
35218
   operands[3] = gen_rtx_fmt_ee (minmax_code (operands[3]), SImode,
 
35219
                                operands[1], operands[2]);
 
35220
@@ -3389,7 +3972,7 @@
 
35221
            (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
 
35222
          (match_operand:SI 1 "s_register_operand" "0,?r")]))
 
35223
    (clobber (reg:CC CC_REGNUM))]
 
35224
-  "TARGET_32BIT && !arm_eliminable_register (operands[1])"
 
35225
+  "TARGET_32BIT && !arm_eliminable_register (operands[1]) && !arm_restrict_it"
 
35226
   "*
 
35227
   {
 
35228
     enum rtx_code code = GET_CODE (operands[4]);
 
35229
@@ -3423,6 +4006,54 @@
 
35230
                      (const_int 12)))]
 
35231
 )
 
35232
 
 
35233
+; Reject the frame pointer in operand[1], since reloading this after
 
35234
+; it has been eliminated can cause carnage.
 
35235
+(define_insn_and_split "*minmax_arithsi_non_canon"
 
35236
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts")
 
35237
+       (minus:SI
 
35238
+        (match_operand:SI 1 "s_register_operand" "0,?Ts")
 
35239
+         (match_operator:SI 4 "minmax_operator"
 
35240
+          [(match_operand:SI 2 "s_register_operand" "Ts,Ts")
 
35241
+           (match_operand:SI 3 "arm_rhs_operand" "TsI,TsI")])))
 
35242
+   (clobber (reg:CC CC_REGNUM))]
 
35243
+  "TARGET_32BIT && !arm_eliminable_register (operands[1])
 
35244
+   && !(arm_restrict_it && CONST_INT_P (operands[3]))"
 
35245
+  "#"
 
35246
+  "TARGET_32BIT && !arm_eliminable_register (operands[1]) && reload_completed"
 
35247
+  [(set (reg:CC CC_REGNUM)
 
35248
+        (compare:CC (match_dup 2) (match_dup 3)))
 
35249
+
 
35250
+   (cond_exec (match_op_dup 4 [(reg:CC CC_REGNUM) (const_int 0)])
 
35251
+              (set (match_dup 0)
 
35252
+                   (minus:SI (match_dup 1)
 
35253
+                             (match_dup 2))))
 
35254
+   (cond_exec (match_op_dup 5 [(reg:CC CC_REGNUM) (const_int 0)])
 
35255
+              (set (match_dup 0)
 
35256
+                   (match_dup 6)))]
 
35257
+  {
 
35258
+  enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]),
 
35259
+                                           operands[2], operands[3]);
 
35260
+  enum rtx_code rc = minmax_code (operands[4]);
 
35261
+  operands[4] = gen_rtx_fmt_ee (rc, VOIDmode,
 
35262
+                                operands[2], operands[3]);
 
35263
+
 
35264
+  if (mode == CCFPmode || mode == CCFPEmode)
 
35265
+    rc = reverse_condition_maybe_unordered (rc);
 
35266
+  else
 
35267
+    rc = reverse_condition (rc);
 
35268
+  operands[5] = gen_rtx_fmt_ee (rc, SImode, operands[2], operands[3]);
 
35269
+  if (CONST_INT_P (operands[3]))
 
35270
+    operands[6] = plus_constant (SImode, operands[1], -INTVAL (operands[3]));
 
35271
+  else
 
35272
+    operands[6] = gen_rtx_MINUS (SImode, operands[1], operands[3]);
 
35273
+  }
 
35274
+  [(set_attr "conds" "clob")
 
35275
+   (set (attr "length")
 
35276
+       (if_then_else (eq_attr "is_thumb" "yes")
 
35277
+                     (const_int 14)
 
35278
+                     (const_int 12)))]
 
35279
+)
 
35280
+
 
35281
 (define_code_iterator SAT [smin smax])
 
35282
 (define_code_iterator SATrev [smin smax])
 
35283
 (define_code_attr SATlo [(smin "1") (smax "2")])
 
35284
@@ -3449,7 +4080,8 @@
 
35285
     return "usat%?\t%0, %1, %3";
 
35286
 }
 
35287
   [(set_attr "predicable" "yes")
 
35288
-   (set_attr "insn" "sat")])
 
35289
+   (set_attr "predicable_short_it" "no")]
 
35290
+)
 
35291
 
 
35292
 (define_insn "*satsi_<SAT:code>_shift"
 
35293
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
35294
@@ -3474,9 +4106,9 @@
 
35295
     return "usat%?\t%0, %1, %4%S3";
 
35296
 }
 
35297
   [(set_attr "predicable" "yes")
 
35298
-   (set_attr "insn" "sat")
 
35299
+   (set_attr "predicable_short_it" "no")
 
35300
    (set_attr "shift" "3")
 
35301
-   (set_attr "type" "alu_shift")])
 
35302
+   (set_attr "type" "arlo_shift")])
 
35303
 
 
35304
 ;; Shift and rotation insns
 
35305
 
 
35306
@@ -3566,6 +4198,7 @@
 
35307
   "TARGET_THUMB1"
 
35308
   "lsl\\t%0, %1, %2"
 
35309
   [(set_attr "length" "2")
 
35310
+   (set_attr "type" "shift,shift_reg")
 
35311
    (set_attr "conds" "set")])
 
35312
 
 
35313
 (define_expand "ashrdi3"
 
35314
@@ -3623,7 +4256,6 @@
 
35315
   "TARGET_32BIT"
 
35316
   "movs\\t%R0, %R1, asr #1\;mov\\t%Q0, %Q1, rrx"
 
35317
   [(set_attr "conds" "clob")
 
35318
-   (set_attr "insn" "mov")
 
35319
    (set_attr "length" "8")]
 
35320
 )
 
35321
 
 
35322
@@ -3646,6 +4278,7 @@
 
35323
   "TARGET_THUMB1"
 
35324
   "asr\\t%0, %1, %2"
 
35325
   [(set_attr "length" "2")
 
35326
+   (set_attr "type" "shift,shift_reg")
 
35327
    (set_attr "conds" "set")])
 
35328
 
 
35329
 (define_expand "lshrdi3"
 
35330
@@ -3703,7 +4336,6 @@
 
35331
   "TARGET_32BIT"
 
35332
   "movs\\t%R0, %R1, lsr #1\;mov\\t%Q0, %Q1, rrx"
 
35333
   [(set_attr "conds" "clob")
 
35334
-   (set_attr "insn" "mov")
 
35335
    (set_attr "length" "8")]
 
35336
 )
 
35337
 
 
35338
@@ -3729,6 +4361,7 @@
 
35339
   "TARGET_THUMB1"
 
35340
   "lsr\\t%0, %1, %2"
 
35341
   [(set_attr "length" "2")
 
35342
+   (set_attr "type" "shift,shift_reg")
 
35343
    (set_attr "conds" "set")])
 
35344
 
 
35345
 (define_expand "rotlsi3"
 
35346
@@ -3774,51 +4407,52 @@
 
35347
                     (match_operand:SI 2 "register_operand" "l")))]
 
35348
   "TARGET_THUMB1"
 
35349
   "ror\\t%0, %0, %2"
 
35350
-  [(set_attr "length" "2")]
 
35351
+  [(set_attr "type" "shift_reg")
 
35352
+   (set_attr "length" "2")]
 
35353
 )
 
35354
 
 
35355
 (define_insn "*arm_shiftsi3"
 
35356
-  [(set (match_operand:SI   0 "s_register_operand" "=r")
 
35357
+  [(set (match_operand:SI   0 "s_register_operand" "=l,r,r")
 
35358
        (match_operator:SI  3 "shift_operator"
 
35359
-        [(match_operand:SI 1 "s_register_operand"  "r")
 
35360
-         (match_operand:SI 2 "reg_or_int_operand" "rM")]))]
 
35361
+        [(match_operand:SI 1 "s_register_operand"  "0,r,r")
 
35362
+         (match_operand:SI 2 "reg_or_int_operand" "l,M,r")]))]
 
35363
   "TARGET_32BIT"
 
35364
   "* return arm_output_shift(operands, 0);"
 
35365
   [(set_attr "predicable" "yes")
 
35366
+   (set_attr "arch" "t2,*,*")
 
35367
+   (set_attr "predicable_short_it" "yes,no,no")
 
35368
+   (set_attr "length" "4")
 
35369
    (set_attr "shift" "1")
 
35370
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
 
35371
-                     (const_string "alu_shift")
 
35372
-                     (const_string "alu_shift_reg")))]
 
35373
+   (set_attr "type" "arlo_shift_reg,arlo_shift,arlo_shift_reg")]
 
35374
 )
 
35375
 
 
35376
 (define_insn "*shiftsi3_compare0"
 
35377
   [(set (reg:CC_NOOV CC_REGNUM)
 
35378
        (compare:CC_NOOV (match_operator:SI 3 "shift_operator"
 
35379
-                         [(match_operand:SI 1 "s_register_operand" "r")
 
35380
-                          (match_operand:SI 2 "arm_rhs_operand" "rM")])
 
35381
+                         [(match_operand:SI 1 "s_register_operand" "r,r")
 
35382
+                          (match_operand:SI 2 "arm_rhs_operand" "M,r")])
 
35383
                         (const_int 0)))
 
35384
-   (set (match_operand:SI 0 "s_register_operand" "=r")
 
35385
+   (set (match_operand:SI 0 "s_register_operand" "=r,r")
 
35386
        (match_op_dup 3 [(match_dup 1) (match_dup 2)]))]
 
35387
   "TARGET_32BIT"
 
35388
   "* return arm_output_shift(operands, 1);"
 
35389
   [(set_attr "conds" "set")
 
35390
    (set_attr "shift" "1")
 
35391
-   (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "")
 
35392
-                     (const_string "alu_shift")
 
35393
-                     (const_string "alu_shift_reg")))]
 
35394
+   (set_attr "type" "arlo_shift,arlo_shift_reg")]
 
35395
 )
 
35396
 
 
35397
 (define_insn "*shiftsi3_compare0_scratch"
 
35398
   [(set (reg:CC_NOOV CC_REGNUM)
 
35399
        (compare:CC_NOOV (match_operator:SI 3 "shift_operator"
 
35400
-                         [(match_operand:SI 1 "s_register_operand" "r")
 
35401
-                          (match_operand:SI 2 "arm_rhs_operand" "rM")])
 
35402
+                         [(match_operand:SI 1 "s_register_operand" "r,r")
 
35403
+                          (match_operand:SI 2 "arm_rhs_operand" "M,r")])
 
35404
                         (const_int 0)))
 
35405
-   (clobber (match_scratch:SI 0 "=r"))]
 
35406
+   (clobber (match_scratch:SI 0 "=r,r"))]
 
35407
   "TARGET_32BIT"
 
35408
   "* return arm_output_shift(operands, 1);"
 
35409
   [(set_attr "conds" "set")
 
35410
-   (set_attr "shift" "1")]
 
35411
+   (set_attr "shift" "1")
 
35412
+   (set_attr "type" "shift,shift_reg")]
 
35413
 )
 
35414
 
 
35415
 (define_insn "*not_shiftsi"
 
35416
@@ -3829,10 +4463,10 @@
 
35417
   "TARGET_32BIT"
 
35418
   "mvn%?\\t%0, %1%S3"
 
35419
   [(set_attr "predicable" "yes")
 
35420
+   (set_attr "predicable_short_it" "no")
 
35421
    (set_attr "shift" "1")
 
35422
-   (set_attr "insn" "mvn")
 
35423
    (set_attr "arch" "32,a")
 
35424
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
35425
+   (set_attr "type" "mvn_shift,mvn_shift_reg")])
 
35426
 
 
35427
 (define_insn "*not_shiftsi_compare0"
 
35428
   [(set (reg:CC_NOOV CC_REGNUM)
 
35429
@@ -3847,9 +4481,8 @@
 
35430
   "mvn%.\\t%0, %1%S3"
 
35431
   [(set_attr "conds" "set")
 
35432
    (set_attr "shift" "1")
 
35433
-   (set_attr "insn" "mvn")
 
35434
    (set_attr "arch" "32,a")
 
35435
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
35436
+   (set_attr "type" "mvn_shift,mvn_shift_reg")])
 
35437
 
 
35438
 (define_insn "*not_shiftsi_compare0_scratch"
 
35439
   [(set (reg:CC_NOOV CC_REGNUM)
 
35440
@@ -3863,9 +4496,8 @@
 
35441
   "mvn%.\\t%0, %1%S3"
 
35442
   [(set_attr "conds" "set")
 
35443
    (set_attr "shift" "1")
 
35444
-   (set_attr "insn" "mvn")
 
35445
    (set_attr "arch" "32,a")
 
35446
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
35447
+   (set_attr "type" "mvn_shift,mvn_shift_reg")])
 
35448
 
 
35449
 ;; We don't really have extzv, but defining this using shifts helps
 
35450
 ;; to reduce register pressure later on.
 
35451
@@ -4042,6 +4674,7 @@
 
35452
   [(set_attr "arch" "t2,any")
 
35453
    (set_attr "length" "2,4")
 
35454
    (set_attr "predicable" "yes")
 
35455
+   (set_attr "predicable_short_it" "yes,no")
 
35456
    (set_attr "type" "load1")])
 
35457
 
 
35458
 (define_insn "unaligned_loadhis"
 
35459
@@ -4054,6 +4687,7 @@
 
35460
   [(set_attr "arch" "t2,any")
 
35461
    (set_attr "length" "2,4")
 
35462
    (set_attr "predicable" "yes")
 
35463
+   (set_attr "predicable_short_it" "yes,no")
 
35464
    (set_attr "type" "load_byte")])
 
35465
 
 
35466
 (define_insn "unaligned_loadhiu"
 
35467
@@ -4066,6 +4700,7 @@
 
35468
   [(set_attr "arch" "t2,any")
 
35469
    (set_attr "length" "2,4")
 
35470
    (set_attr "predicable" "yes")
 
35471
+   (set_attr "predicable_short_it" "yes,no")
 
35472
    (set_attr "type" "load_byte")])
 
35473
 
 
35474
 (define_insn "unaligned_storesi"
 
35475
@@ -4077,6 +4712,7 @@
 
35476
   [(set_attr "arch" "t2,any")
 
35477
    (set_attr "length" "2,4")
 
35478
    (set_attr "predicable" "yes")
 
35479
+   (set_attr "predicable_short_it" "yes,no")
 
35480
    (set_attr "type" "store1")])
 
35481
 
 
35482
 (define_insn "unaligned_storehi"
 
35483
@@ -4088,8 +4724,67 @@
 
35484
   [(set_attr "arch" "t2,any")
 
35485
    (set_attr "length" "2,4")
 
35486
    (set_attr "predicable" "yes")
 
35487
+   (set_attr "predicable_short_it" "yes,no")
 
35488
    (set_attr "type" "store1")])
 
35489
 
 
35490
+;; Unaligned double-word load and store.
 
35491
+;; Split after reload into two unaligned single-word accesses.
 
35492
+;; It prevents lower_subreg from splitting some other aligned
 
35493
+;; double-word accesses too early. Used for internal memcpy.
 
35494
+
 
35495
+(define_insn_and_split "unaligned_loaddi"
 
35496
+  [(set (match_operand:DI 0 "s_register_operand" "=l,r")
 
35497
+       (unspec:DI [(match_operand:DI 1 "memory_operand" "o,o")]
 
35498
+                  UNSPEC_UNALIGNED_LOAD))]
 
35499
+  "unaligned_access && TARGET_32BIT"
 
35500
+  "#"
 
35501
+  "&& reload_completed"
 
35502
+  [(set (match_dup 0) (unspec:SI [(match_dup 1)] UNSPEC_UNALIGNED_LOAD))
 
35503
+   (set (match_dup 2) (unspec:SI [(match_dup 3)] UNSPEC_UNALIGNED_LOAD))]
 
35504
+  {
 
35505
+    operands[2] = gen_highpart (SImode, operands[0]);
 
35506
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
35507
+    operands[3] = gen_highpart (SImode, operands[1]);
 
35508
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
35509
+
 
35510
+    /* If the first destination register overlaps with the base address,
 
35511
+       swap the order in which the loads are emitted.  */
 
35512
+    if (reg_overlap_mentioned_p (operands[0], operands[1]))
 
35513
+      {
 
35514
+        rtx tmp = operands[1];
 
35515
+        operands[1] = operands[3];
 
35516
+        operands[3] = tmp;
 
35517
+        tmp = operands[0];
 
35518
+        operands[0] = operands[2];
 
35519
+        operands[2] = tmp;
 
35520
+      }
 
35521
+  }
 
35522
+  [(set_attr "arch" "t2,any")
 
35523
+   (set_attr "length" "4,8")
 
35524
+   (set_attr "predicable" "yes")
 
35525
+   (set_attr "type" "load2")])
 
35526
+
 
35527
+(define_insn_and_split "unaligned_storedi"
 
35528
+  [(set (match_operand:DI 0 "memory_operand" "=o,o")
 
35529
+       (unspec:DI [(match_operand:DI 1 "s_register_operand" "l,r")]
 
35530
+                  UNSPEC_UNALIGNED_STORE))]
 
35531
+  "unaligned_access && TARGET_32BIT"
 
35532
+  "#"
 
35533
+  "&& reload_completed"
 
35534
+  [(set (match_dup 0) (unspec:SI [(match_dup 1)] UNSPEC_UNALIGNED_STORE))
 
35535
+   (set (match_dup 2) (unspec:SI [(match_dup 3)] UNSPEC_UNALIGNED_STORE))]
 
35536
+  {
 
35537
+    operands[2] = gen_highpart (SImode, operands[0]);
 
35538
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
35539
+    operands[3] = gen_highpart (SImode, operands[1]);
 
35540
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
35541
+  }
 
35542
+  [(set_attr "arch" "t2,any")
 
35543
+   (set_attr "length" "4,8")
 
35544
+   (set_attr "predicable" "yes")
 
35545
+   (set_attr "type" "store2")])
 
35546
+
 
35547
+
 
35548
 (define_insn "*extv_reg"
 
35549
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
35550
        (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r")
 
35551
@@ -4098,7 +4793,8 @@
 
35552
   "arm_arch_thumb2"
 
35553
   "sbfx%?\t%0, %1, %3, %2"
 
35554
   [(set_attr "length" "4")
 
35555
-   (set_attr "predicable" "yes")]
 
35556
+   (set_attr "predicable" "yes")
 
35557
+   (set_attr "predicable_short_it" "no")]
 
35558
 )
 
35559
 
 
35560
 (define_insn "extzv_t2"
 
35561
@@ -4109,7 +4805,8 @@
 
35562
   "arm_arch_thumb2"
 
35563
   "ubfx%?\t%0, %1, %3, %2"
 
35564
   [(set_attr "length" "4")
 
35565
-   (set_attr "predicable" "yes")]
 
35566
+   (set_attr "predicable" "yes")
 
35567
+   (set_attr "predicable_short_it" "no")]
 
35568
 )
 
35569
 
 
35570
 
 
35571
@@ -4121,7 +4818,8 @@
 
35572
   "TARGET_IDIV"
 
35573
   "sdiv%?\t%0, %1, %2"
 
35574
   [(set_attr "predicable" "yes")
 
35575
-   (set_attr "insn" "sdiv")]
 
35576
+   (set_attr "predicable_short_it" "no")
 
35577
+   (set_attr "type" "sdiv")]
 
35578
 )
 
35579
 
 
35580
 (define_insn "udivsi3"
 
35581
@@ -4131,7 +4829,8 @@
 
35582
   "TARGET_IDIV"
 
35583
   "udiv%?\t%0, %1, %2"
 
35584
   [(set_attr "predicable" "yes")
 
35585
-   (set_attr "insn" "udiv")]
 
35586
+   (set_attr "predicable_short_it" "no")
 
35587
+   (set_attr "type" "udiv")]
 
35588
 )
 
35589
 
 
35590
 
 
35591
@@ -4154,12 +4853,24 @@
 
35592
 
 
35593
 ;; The constraints here are to prevent a *partial* overlap (where %Q0 == %R1).
 
35594
 ;; The first alternative allows the common case of a *full* overlap.
 
35595
-(define_insn "*arm_negdi2"
 
35596
+(define_insn_and_split "*arm_negdi2"
 
35597
   [(set (match_operand:DI         0 "s_register_operand" "=r,&r")
 
35598
        (neg:DI (match_operand:DI 1 "s_register_operand"  "0,r")))
 
35599
    (clobber (reg:CC CC_REGNUM))]
 
35600
   "TARGET_ARM"
 
35601
-  "rsbs\\t%Q0, %Q1, #0\;rsc\\t%R0, %R1, #0"
 
35602
+  "#"   ; "rsbs\\t%Q0, %Q1, #0\;rsc\\t%R0, %R1, #0"
 
35603
+  "&& reload_completed"
 
35604
+  [(parallel [(set (reg:CC CC_REGNUM)
 
35605
+                  (compare:CC (const_int 0) (match_dup 1)))
 
35606
+             (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1)))])
 
35607
+   (set (match_dup 2) (minus:SI (minus:SI (const_int 0) (match_dup 3))
 
35608
+                                (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
35609
+  {
 
35610
+    operands[2] = gen_highpart (SImode, operands[0]);
 
35611
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
35612
+    operands[3] = gen_highpart (SImode, operands[1]);
 
35613
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
35614
+  }
 
35615
   [(set_attr "conds" "clob")
 
35616
    (set_attr "length" "8")]
 
35617
 )
 
35618
@@ -4181,11 +4892,14 @@
 
35619
 )
 
35620
 
 
35621
 (define_insn "*arm_negsi2"
 
35622
-  [(set (match_operand:SI         0 "s_register_operand" "=r")
 
35623
-       (neg:SI (match_operand:SI 1 "s_register_operand" "r")))]
 
35624
+  [(set (match_operand:SI         0 "s_register_operand" "=l,r")
 
35625
+       (neg:SI (match_operand:SI 1 "s_register_operand" "l,r")))]
 
35626
   "TARGET_32BIT"
 
35627
   "rsb%?\\t%0, %1, #0"
 
35628
-  [(set_attr "predicable" "yes")]
 
35629
+  [(set_attr "predicable" "yes")
 
35630
+   (set_attr "predicable_short_it" "yes,no")
 
35631
+   (set_attr "arch" "t2,*")
 
35632
+   (set_attr "length" "4")]
 
35633
 )
 
35634
 
 
35635
 (define_insn "*thumb1_negsi2"
 
35636
@@ -4209,6 +4923,73 @@
 
35637
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
35638
   "")
 
35639
 
 
35640
+;; Negate an extended 32-bit value.
 
35641
+(define_insn_and_split "*negdi_extendsidi"
 
35642
+  [(set (match_operand:DI 0 "s_register_operand" "=r,&r,l,&l")
 
35643
+       (neg:DI (sign_extend:DI (match_operand:SI 1 "s_register_operand" "0,r,0,l"))))
 
35644
+   (clobber (reg:CC CC_REGNUM))]
 
35645
+  "TARGET_32BIT"
 
35646
+  "#" ; rsb\\t%Q0, %1, #0\;asr\\t%R0, %Q0, #31
 
35647
+  "&& reload_completed"
 
35648
+  [(const_int 0)]
 
35649
+  {
 
35650
+     operands[2] = gen_highpart (SImode, operands[0]);
 
35651
+     operands[0] = gen_lowpart (SImode, operands[0]);
 
35652
+     rtx tmp = gen_rtx_SET (VOIDmode,
 
35653
+                            operands[0],
 
35654
+                            gen_rtx_MINUS (SImode,
 
35655
+                                           const0_rtx,
 
35656
+                                           operands[1]));
 
35657
+     if (TARGET_ARM)
 
35658
+       {
 
35659
+         emit_insn (tmp);
 
35660
+       }
 
35661
+     else
 
35662
+       {
 
35663
+         /* Set the flags, to emit the short encoding in Thumb2.  */
 
35664
+         rtx flags = gen_rtx_SET (VOIDmode,
 
35665
+                                  gen_rtx_REG (CCmode, CC_REGNUM),
 
35666
+                                  gen_rtx_COMPARE (CCmode,
 
35667
+                                                   const0_rtx,
 
35668
+                                                   operands[1]));
 
35669
+         emit_insn (gen_rtx_PARALLEL (VOIDmode,
 
35670
+                                      gen_rtvec (2,
 
35671
+                                                 flags,
 
35672
+                                                 tmp)));
 
35673
+       }
 
35674
+       emit_insn (gen_rtx_SET (VOIDmode,
 
35675
+                              operands[2],
 
35676
+                              gen_rtx_ASHIFTRT (SImode,
 
35677
+                                                operands[0],
 
35678
+                                                GEN_INT (31))));
 
35679
+     DONE;
 
35680
+  }
 
35681
+  [(set_attr "length" "8,8,4,4")
 
35682
+   (set_attr "arch" "a,a,t2,t2")]
 
35683
+)
 
35684
+
 
35685
+(define_insn_and_split "*negdi_zero_extendsidi"
 
35686
+  [(set (match_operand:DI 0 "s_register_operand" "=r,&r")
 
35687
+       (neg:DI (zero_extend:DI (match_operand:SI 1 "s_register_operand" "0,r"))))
 
35688
+   (clobber (reg:CC CC_REGNUM))]
 
35689
+  "TARGET_32BIT"
 
35690
+  "#" ; "rsbs\\t%Q0, %1, #0\;sbc\\t%R0,%R0,%R0"
 
35691
+      ;; Don't care what register is input to sbc,
 
35692
+      ;; since we just just need to propagate the carry.
 
35693
+  "&& reload_completed"
 
35694
+  [(parallel [(set (reg:CC CC_REGNUM)
 
35695
+                   (compare:CC (const_int 0) (match_dup 1)))
 
35696
+              (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1)))])
 
35697
+   (set (match_dup 2) (minus:SI (minus:SI (match_dup 2) (match_dup 2))
 
35698
+                                (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
 
35699
+  {
 
35700
+    operands[2] = gen_highpart (SImode, operands[0]);
 
35701
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
35702
+  }
 
35703
+  [(set_attr "conds" "clob")
 
35704
+   (set_attr "length" "8")]   ;; length in thumb is 4
 
35705
+)
 
35706
+
 
35707
 ;; abssi2 doesn't really clobber the condition codes if a different register
 
35708
 ;; is being set.  To keep things simple, assume during rtl manipulations that
 
35709
 ;; it does, but tell the final scan operator the truth.  Similarly for
 
35710
@@ -4227,14 +5008,67 @@
 
35711
     operands[2] = gen_rtx_REG (CCmode, CC_REGNUM);
 
35712
 ")
 
35713
 
 
35714
-(define_insn "*arm_abssi2"
 
35715
+(define_insn_and_split "*arm_abssi2"
 
35716
   [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
 
35717
        (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))
 
35718
    (clobber (reg:CC CC_REGNUM))]
 
35719
   "TARGET_ARM"
 
35720
-  "@
 
35721
-   cmp\\t%0, #0\;rsblt\\t%0, %0, #0
 
35722
-   eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31"
 
35723
+  "#"
 
35724
+  "&& reload_completed"
 
35725
+  [(const_int 0)]
 
35726
+  {
 
35727
+   /* if (which_alternative == 0) */
 
35728
+   if (REGNO(operands[0]) == REGNO(operands[1]))
 
35729
+     {
 
35730
+      /* Emit the pattern:
 
35731
+         cmp\\t%0, #0\;rsblt\\t%0, %0, #0
 
35732
+         [(set (reg:CC CC_REGNUM)
 
35733
+               (compare:CC (match_dup 0) (const_int 0)))
 
35734
+          (cond_exec (lt:CC (reg:CC CC_REGNUM) (const_int 0))
 
35735
+                     (set (match_dup 0) (minus:SI (const_int 0) (match_dup 1))))]
 
35736
+      */
 
35737
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35738
+                              gen_rtx_REG (CCmode, CC_REGNUM),
 
35739
+                              gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
 
35740
+      emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
35741
+                                    (gen_rtx_LT (SImode,
 
35742
+                                                 gen_rtx_REG (CCmode, CC_REGNUM),
 
35743
+                                                 const0_rtx)),
 
35744
+                                    (gen_rtx_SET (VOIDmode,
 
35745
+                                                  operands[0],
 
35746
+                                                  (gen_rtx_MINUS (SImode,
 
35747
+                                                                  const0_rtx,
 
35748
+                                                                  operands[1]))))));
 
35749
+      DONE;
 
35750
+     }
 
35751
+   else
 
35752
+     {
 
35753
+      /* Emit the pattern:
 
35754
+         alt1: eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31
 
35755
+         [(set (match_dup 0)
 
35756
+               (xor:SI (match_dup 1)
 
35757
+                       (ashiftrt:SI (match_dup 1) (const_int 31))))
 
35758
+          (set (match_dup 0)
 
35759
+               (minus:SI (match_dup 0)
 
35760
+                      (ashiftrt:SI (match_dup 1) (const_int 31))))]
 
35761
+      */
 
35762
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35763
+                              operands[0],
 
35764
+                              gen_rtx_XOR (SImode,
 
35765
+                                           gen_rtx_ASHIFTRT (SImode,
 
35766
+                                                             operands[1],
 
35767
+                                                             GEN_INT (31)),
 
35768
+                                           operands[1])));
 
35769
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35770
+                              operands[0],
 
35771
+                              gen_rtx_MINUS (SImode,
 
35772
+                                             operands[0],
 
35773
+                                             gen_rtx_ASHIFTRT (SImode,
 
35774
+                                                               operands[1],
 
35775
+                                                               GEN_INT (31)))));
 
35776
+      DONE;
 
35777
+     }
 
35778
+  }
 
35779
   [(set_attr "conds" "clob,*")
 
35780
    (set_attr "shift" "1")
 
35781
    (set_attr "predicable" "no, yes")
 
35782
@@ -4255,14 +5089,56 @@
 
35783
   [(set_attr "length" "6")]
 
35784
 )
 
35785
 
 
35786
-(define_insn "*arm_neg_abssi2"
 
35787
+(define_insn_and_split "*arm_neg_abssi2"
 
35788
   [(set (match_operand:SI 0 "s_register_operand" "=r,&r")
 
35789
        (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))))
 
35790
    (clobber (reg:CC CC_REGNUM))]
 
35791
   "TARGET_ARM"
 
35792
-  "@
 
35793
-   cmp\\t%0, #0\;rsbgt\\t%0, %0, #0
 
35794
-   eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"
 
35795
+  "#"
 
35796
+  "&& reload_completed"
 
35797
+  [(const_int 0)]
 
35798
+  {
 
35799
+   /* if (which_alternative == 0) */
 
35800
+   if (REGNO (operands[0]) == REGNO (operands[1]))
 
35801
+     {
 
35802
+      /* Emit the pattern:
 
35803
+         cmp\\t%0, #0\;rsbgt\\t%0, %0, #0
 
35804
+      */
 
35805
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35806
+                              gen_rtx_REG (CCmode, CC_REGNUM),
 
35807
+                              gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
 
35808
+      emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
35809
+                                    gen_rtx_GT (SImode,
 
35810
+                                                gen_rtx_REG (CCmode, CC_REGNUM),
 
35811
+                                                const0_rtx),
 
35812
+                                    gen_rtx_SET (VOIDmode,
 
35813
+                                                 operands[0],
 
35814
+                                                 (gen_rtx_MINUS (SImode,
 
35815
+                                                                 const0_rtx,
 
35816
+                                                                 operands[1])))));
 
35817
+     }
 
35818
+   else
 
35819
+     {
 
35820
+      /* Emit the pattern:
 
35821
+         eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31
 
35822
+      */
 
35823
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35824
+                              operands[0],
 
35825
+                              gen_rtx_XOR (SImode,
 
35826
+                                           gen_rtx_ASHIFTRT (SImode,
 
35827
+                                                             operands[1],
 
35828
+                                                             GEN_INT (31)),
 
35829
+                                           operands[1])));
 
35830
+      emit_insn (gen_rtx_SET (VOIDmode,
 
35831
+                              operands[0],
 
35832
+                              gen_rtx_MINUS (SImode,
 
35833
+                                             gen_rtx_ASHIFTRT (SImode,
 
35834
+                                                               operands[1],
 
35835
+                                                               GEN_INT (31)),
 
35836
+                                             operands[0])));
 
35837
+     }
 
35838
+   DONE;
 
35839
+  }
 
35840
   [(set_attr "conds" "clob,*")
 
35841
    (set_attr "shift" "1")
 
35842
    (set_attr "predicable" "no, yes")
 
35843
@@ -4330,7 +5206,7 @@
 
35844
   [(set_attr "length" "*,8,8,*")
 
35845
    (set_attr "predicable" "no,yes,yes,no")
 
35846
    (set_attr "neon_type" "neon_int_1,*,*,neon_int_1")
 
35847
-   (set_attr "arch" "neon_nota8,*,*,neon_onlya8")]
 
35848
+   (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits")]
 
35849
 )
 
35850
 
 
35851
 (define_expand "one_cmplsi2"
 
35852
@@ -4341,12 +5217,15 @@
 
35853
 )
 
35854
 
 
35855
 (define_insn "*arm_one_cmplsi2"
 
35856
-  [(set (match_operand:SI         0 "s_register_operand" "=r")
 
35857
-       (not:SI (match_operand:SI 1 "s_register_operand"  "r")))]
 
35858
+  [(set (match_operand:SI         0 "s_register_operand" "=l,r")
 
35859
+       (not:SI (match_operand:SI 1 "s_register_operand"  "l,r")))]
 
35860
   "TARGET_32BIT"
 
35861
   "mvn%?\\t%0, %1"
 
35862
   [(set_attr "predicable" "yes")
 
35863
-   (set_attr "insn" "mvn")]
 
35864
+   (set_attr "predicable_short_it" "yes,no")
 
35865
+   (set_attr "arch" "t2,*")
 
35866
+   (set_attr "length" "4")
 
35867
+   (set_attr "type" "mvn_reg")]
 
35868
 )
 
35869
 
 
35870
 (define_insn "*thumb1_one_cmplsi2"
 
35871
@@ -4355,7 +5234,7 @@
 
35872
   "TARGET_THUMB1"
 
35873
   "mvn\\t%0, %1"
 
35874
   [(set_attr "length" "2")
 
35875
-   (set_attr "insn" "mvn")]
 
35876
+   (set_attr "type" "mvn_reg")]
 
35877
 )
 
35878
 
 
35879
 (define_insn "*notsi_compare0"
 
35880
@@ -4367,7 +5246,7 @@
 
35881
   "TARGET_32BIT"
 
35882
   "mvn%.\\t%0, %1"
 
35883
   [(set_attr "conds" "set")
 
35884
-   (set_attr "insn" "mvn")]
 
35885
+   (set_attr "type" "mvn_reg")]
 
35886
 )
 
35887
 
 
35888
 (define_insn "*notsi_compare0_scratch"
 
35889
@@ -4378,7 +5257,7 @@
 
35890
   "TARGET_32BIT"
 
35891
   "mvn%.\\t%0, %1"
 
35892
   [(set_attr "conds" "set")
 
35893
-   (set_attr "insn" "mvn")]
 
35894
+   (set_attr "type" "mvn_reg")]
 
35895
 )
 
35896
 
 
35897
 ;; Fixed <--> Floating conversion insns
 
35898
@@ -4498,7 +5377,7 @@
 
35899
   "TARGET_32BIT <qhs_zextenddi_cond>"
 
35900
   "#"
 
35901
   [(set_attr "length" "8,4,8,8")
 
35902
-   (set_attr "arch" "neon_nota8,*,*,neon_onlya8")
 
35903
+   (set_attr "arch" "neon_for_64bits,*,*,avoid_neon_for_64bits")
 
35904
    (set_attr "ce_count" "2")
 
35905
    (set_attr "predicable" "yes")]
 
35906
 )
 
35907
@@ -4513,7 +5392,7 @@
 
35908
    (set_attr "ce_count" "2")
 
35909
    (set_attr "shift" "1")
 
35910
    (set_attr "predicable" "yes")
 
35911
-   (set_attr "arch" "neon_nota8,*,a,t,neon_onlya8")]
 
35912
+   (set_attr "arch" "neon_for_64bits,*,a,t,avoid_neon_for_64bits")]
 
35913
 )
 
35914
 
 
35915
 ;; Splits for all extensions to DImode
 
35916
@@ -4639,7 +5518,7 @@
 
35917
                         [(if_then_else (eq_attr "is_arch6" "yes")
 
35918
                                       (const_int 2) (const_int 4))
 
35919
                         (const_int 4)])
 
35920
-   (set_attr "type" "simple_alu_shift, load_byte")]
 
35921
+   (set_attr "type" "extend,load_byte")]
 
35922
 )
 
35923
 
 
35924
 (define_insn "*arm_zero_extendhisi2"
 
35925
@@ -4649,7 +5528,7 @@
 
35926
   "@
 
35927
    #
 
35928
    ldr%(h%)\\t%0, %1"
 
35929
-  [(set_attr "type" "alu_shift,load_byte")
 
35930
+  [(set_attr "type" "arlo_shift,load_byte")
 
35931
    (set_attr "predicable" "yes")]
 
35932
 )
 
35933
 
 
35934
@@ -4661,7 +5540,7 @@
 
35935
    uxth%?\\t%0, %1
 
35936
    ldr%(h%)\\t%0, %1"
 
35937
   [(set_attr "predicable" "yes")
 
35938
-   (set_attr "type" "simple_alu_shift,load_byte")]
 
35939
+   (set_attr "type" "extend,load_byte")]
 
35940
 )
 
35941
 
 
35942
 (define_insn "*arm_zero_extendhisi2addsi"
 
35943
@@ -4670,8 +5549,9 @@
 
35944
                 (match_operand:SI 2 "s_register_operand" "r")))]
 
35945
   "TARGET_INT_SIMD"
 
35946
   "uxtah%?\\t%0, %2, %1"
 
35947
-  [(set_attr "type" "alu_shift")
 
35948
-   (set_attr "predicable" "yes")]
 
35949
+  [(set_attr "type" "arlo_shift")
 
35950
+   (set_attr "predicable" "yes")
 
35951
+   (set_attr "predicable_short_it" "no")]
 
35952
 )
 
35953
 
 
35954
 (define_expand "zero_extendqisi2"
 
35955
@@ -4719,7 +5599,7 @@
 
35956
    #
 
35957
    ldrb\\t%0, %1"
 
35958
   [(set_attr "length" "4,2")
 
35959
-   (set_attr "type" "alu_shift,load_byte")
 
35960
+   (set_attr "type" "arlo_shift,load_byte")
 
35961
    (set_attr "pool_range" "*,32")]
 
35962
 )
 
35963
 
 
35964
@@ -4731,7 +5611,7 @@
 
35965
    uxtb\\t%0, %1
 
35966
    ldrb\\t%0, %1"
 
35967
   [(set_attr "length" "2")
 
35968
-   (set_attr "type" "simple_alu_shift,load_byte")]
 
35969
+   (set_attr "type" "extend,load_byte")]
 
35970
 )
 
35971
 
 
35972
 (define_insn "*arm_zero_extendqisi2"
 
35973
@@ -4742,7 +5622,7 @@
 
35974
    #
 
35975
    ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2"
 
35976
   [(set_attr "length" "8,4")
 
35977
-   (set_attr "type" "alu_shift,load_byte")
 
35978
+   (set_attr "type" "arlo_shift,load_byte")
 
35979
    (set_attr "predicable" "yes")]
 
35980
 )
 
35981
 
 
35982
@@ -4753,7 +5633,7 @@
 
35983
   "@
 
35984
    uxtb%(%)\\t%0, %1
 
35985
    ldr%(b%)\\t%0, %1\\t%@ zero_extendqisi2"
 
35986
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
35987
+  [(set_attr "type" "extend,load_byte")
 
35988
    (set_attr "predicable" "yes")]
 
35989
 )
 
35990
 
 
35991
@@ -4764,8 +5644,8 @@
 
35992
   "TARGET_INT_SIMD"
 
35993
   "uxtab%?\\t%0, %2, %1"
 
35994
   [(set_attr "predicable" "yes")
 
35995
-   (set_attr "insn" "xtab")
 
35996
-   (set_attr "type" "alu_shift")]
 
35997
+   (set_attr "predicable_short_it" "no")
 
35998
+   (set_attr "type" "arlo_shift")]
 
35999
 )
 
36000
 
 
36001
 (define_split
 
36002
@@ -4816,7 +5696,8 @@
 
36003
   "TARGET_32BIT"
 
36004
   "tst%?\\t%0, #255"
 
36005
   [(set_attr "conds" "set")
 
36006
-   (set_attr "predicable" "yes")]
 
36007
+   (set_attr "predicable" "yes")
 
36008
+   (set_attr "predicable_short_it" "no")]
 
36009
 )
 
36010
 
 
36011
 (define_expand "extendhisi2"
 
36012
@@ -4927,7 +5808,7 @@
 
36013
                         [(if_then_else (eq_attr "is_arch6" "yes")
 
36014
                                        (const_int 2) (const_int 4))
 
36015
                          (const_int 4)])
 
36016
-   (set_attr "type" "simple_alu_shift,load_byte")
 
36017
+   (set_attr "type" "extend,load_byte")
 
36018
    (set_attr "pool_range" "*,1018")]
 
36019
 )
 
36020
 
 
36021
@@ -4986,7 +5867,7 @@
 
36022
    #
 
36023
    ldr%(sh%)\\t%0, %1"
 
36024
   [(set_attr "length" "8,4")
 
36025
-   (set_attr "type" "alu_shift,load_byte")
 
36026
+   (set_attr "type" "arlo_shift,load_byte")
 
36027
    (set_attr "predicable" "yes")
 
36028
    (set_attr "pool_range" "*,256")
 
36029
    (set_attr "neg_pool_range" "*,244")]
 
36030
@@ -5000,8 +5881,9 @@
 
36031
   "@
 
36032
    sxth%?\\t%0, %1
 
36033
    ldr%(sh%)\\t%0, %1"
 
36034
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
36035
+  [(set_attr "type" "extend,load_byte")
 
36036
    (set_attr "predicable" "yes")
 
36037
+   (set_attr "predicable_short_it" "no")
 
36038
    (set_attr "pool_range" "*,256")
 
36039
    (set_attr "neg_pool_range" "*,244")]
 
36040
 )
 
36041
@@ -5086,7 +5968,7 @@
 
36042
    #
 
36043
    ldr%(sb%)\\t%0, %1"
 
36044
   [(set_attr "length" "8,4")
 
36045
-   (set_attr "type" "alu_shift,load_byte")
 
36046
+   (set_attr "type" "arlo_shift,load_byte")
 
36047
    (set_attr "predicable" "yes")
 
36048
    (set_attr "pool_range" "*,256")
 
36049
    (set_attr "neg_pool_range" "*,244")]
 
36050
@@ -5100,7 +5982,7 @@
 
36051
   "@
 
36052
    sxtb%?\\t%0, %1
 
36053
    ldr%(sb%)\\t%0, %1"
 
36054
-  [(set_attr "type" "simple_alu_shift,load_byte")
 
36055
+  [(set_attr "type" "extend,load_byte")
 
36056
    (set_attr "predicable" "yes")
 
36057
    (set_attr "pool_range" "*,256")
 
36058
    (set_attr "neg_pool_range" "*,244")]
 
36059
@@ -5112,9 +5994,9 @@
 
36060
                 (match_operand:SI 2 "s_register_operand" "r")))]
 
36061
   "TARGET_INT_SIMD"
 
36062
   "sxtab%?\\t%0, %2, %1"
 
36063
-  [(set_attr "type" "alu_shift")
 
36064
-   (set_attr "insn" "xtab")
 
36065
-   (set_attr "predicable" "yes")]
 
36066
+  [(set_attr "type" "arlo_shift")
 
36067
+   (set_attr "predicable" "yes")
 
36068
+   (set_attr "predicable_short_it" "no")]
 
36069
 )
 
36070
 
 
36071
 (define_split
 
36072
@@ -5213,7 +6095,7 @@
 
36073
                          (const_int 2)
 
36074
                          (if_then_else (eq_attr "is_arch6" "yes")
 
36075
                                        (const_int 4) (const_int 6))])
 
36076
-   (set_attr "type" "simple_alu_shift,load_byte,load_byte")]
 
36077
+   (set_attr "type" "extend,load_byte,load_byte")]
 
36078
 )
 
36079
 
 
36080
 (define_expand "extendsfdf2"
 
36081
@@ -5313,8 +6195,8 @@
 
36082
 )
 
36083
 
 
36084
 (define_insn "*arm_movdi"
 
36085
-  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m")
 
36086
-       (match_operand:DI 1 "di_operand"              "rDa,Db,Dc,mi,r"))]
 
36087
+  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, q, m")
 
36088
+       (match_operand:DI 1 "di_operand"              "rDa,Db,Dc,mi,q"))]
 
36089
   "TARGET_32BIT
 
36090
    && !(TARGET_HARD_FLOAT && TARGET_VFP)
 
36091
    && !TARGET_IWMMXT
 
36092
@@ -5472,8 +6354,7 @@
 
36093
     }
 
36094
   }"
 
36095
   [(set_attr "length" "4,4,6,2,2,6,4,4")
 
36096
-   (set_attr "type" "*,*,*,load2,store2,load2,store2,*")
 
36097
-   (set_attr "insn" "*,mov,*,*,*,*,*,mov")
 
36098
+   (set_attr "type" "*,mov_reg,*,load2,store2,load2,store2,mov_reg")
 
36099
    (set_attr "pool_range" "*,*,*,*,*,1018,*,*")]
 
36100
 )
 
36101
 
 
36102
@@ -5570,6 +6451,7 @@
 
36103
   "arm_arch_thumb2"
 
36104
   "movt%?\t%0, #:upper16:%c2"
 
36105
   [(set_attr "predicable" "yes")
 
36106
+   (set_attr "predicable_short_it" "no")
 
36107
    (set_attr "length" "4")]
 
36108
 )
 
36109
 
 
36110
@@ -5587,8 +6469,7 @@
 
36111
    movw%?\\t%0, %1
 
36112
    ldr%?\\t%0, %1
 
36113
    str%?\\t%1, %0"
 
36114
-  [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,simple_alu_imm,load1,store1")
 
36115
-   (set_attr "insn" "mov,mov,mvn,mov,*,*")
 
36116
+  [(set_attr "type" "mov_reg,mov_imm,mvn_imm,mov_imm,load1,store1")
 
36117
    (set_attr "predicable" "yes")
 
36118
    (set_attr "pool_range" "*,*,*,*,4096,*")
 
36119
    (set_attr "neg_pool_range" "*,*,*,*,4084,*")]
 
36120
@@ -5890,7 +6771,7 @@
 
36121
    cmp%?\\t%0, #0
 
36122
    sub%.\\t%0, %1, #0"
 
36123
   [(set_attr "conds" "set")
 
36124
-   (set_attr "type" "simple_alu_imm,simple_alu_imm")]
 
36125
+   (set_attr "type" "arlo_imm,arlo_imm")]
 
36126
 )
 
36127
 
 
36128
 ;; Subroutine to store a half word from a register into memory.
 
36129
@@ -6304,14 +7185,13 @@
 
36130
    str%(h%)\\t%1, %0\\t%@ movhi
 
36131
    ldr%(h%)\\t%0, %1\\t%@ movhi"
 
36132
   [(set_attr "predicable" "yes")
 
36133
-   (set_attr "insn" "mov,mvn,*,*")
 
36134
    (set_attr "pool_range" "*,*,*,256")
 
36135
    (set_attr "neg_pool_range" "*,*,*,244")
 
36136
    (set_attr_alternative "type"
 
36137
                          [(if_then_else (match_operand 1 "const_int_operand" "")
 
36138
-                                        (const_string "simple_alu_imm" )
 
36139
-                                        (const_string "*"))
 
36140
-                          (const_string "simple_alu_imm")
 
36141
+                                        (const_string "mov_imm" )
 
36142
+                                        (const_string "mov_reg"))
 
36143
+                          (const_string "mvn_imm")
 
36144
                           (const_string "store1")
 
36145
                           (const_string "load1")])]
 
36146
 )
 
36147
@@ -6325,8 +7205,7 @@
 
36148
    mov%?\\t%0, %1\\t%@ movhi
 
36149
    mvn%?\\t%0, #%B1\\t%@ movhi"
 
36150
   [(set_attr "predicable" "yes")
 
36151
-   (set_attr "insn" "mov, mov,mvn")
 
36152
-   (set_attr "type" "simple_alu_imm,*,simple_alu_imm")]
 
36153
+   (set_attr "type" "mov_imm,mov_reg,mvn_imm")]
 
36154
 )
 
36155
 
 
36156
 (define_expand "thumb_movhi_clobber"
 
36157
@@ -6449,26 +7328,27 @@
 
36158
   "
 
36159
 )
 
36160
 
 
36161
-
 
36162
 (define_insn "*arm_movqi_insn"
 
36163
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,Uu,r,m")
 
36164
-       (match_operand:QI 1 "general_operand" "r,I,K,Uu,l,m,r"))]
 
36165
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,l,r,l,Uu,r,m")
 
36166
+       (match_operand:QI 1 "general_operand" "r,r,I,Py,K,Uu,l,m,r"))]
 
36167
   "TARGET_32BIT
 
36168
    && (   register_operand (operands[0], QImode)
 
36169
        || register_operand (operands[1], QImode))"
 
36170
   "@
 
36171
    mov%?\\t%0, %1
 
36172
    mov%?\\t%0, %1
 
36173
+   mov%?\\t%0, %1
 
36174
+   mov%?\\t%0, %1
 
36175
    mvn%?\\t%0, #%B1
 
36176
    ldr%(b%)\\t%0, %1
 
36177
    str%(b%)\\t%1, %0
 
36178
    ldr%(b%)\\t%0, %1
 
36179
    str%(b%)\\t%1, %0"
 
36180
-  [(set_attr "type" "*,simple_alu_imm,simple_alu_imm,load1, store1, load1, store1")
 
36181
-   (set_attr "insn" "mov,mov,mvn,*,*,*,*")
 
36182
+  [(set_attr "type" "mov_reg,mov_reg,mov_imm,mov_imm,mvn_imm,load1,store1,load1,store1")
 
36183
    (set_attr "predicable" "yes")
 
36184
-   (set_attr "arch" "any,any,any,t2,t2,any,any")
 
36185
-   (set_attr "length" "4,4,4,2,2,4,4")]
 
36186
+   (set_attr "predicable_short_it" "yes,yes,yes,no,no,no,no,no,no")
 
36187
+   (set_attr "arch" "t2,any,any,t2,any,t2,t2,any,any")
 
36188
+   (set_attr "length" "2,4,4,2,4,2,2,4,4")]
 
36189
 )
 
36190
 
 
36191
 (define_insn "*thumb1_movqi_insn"
 
36192
@@ -6485,8 +7365,7 @@
 
36193
    mov\\t%0, %1
 
36194
    mov\\t%0, %1"
 
36195
   [(set_attr "length" "2")
 
36196
-   (set_attr "type" "simple_alu_imm,load1,store1,*,*,simple_alu_imm")
 
36197
-   (set_attr "insn" "*,*,*,mov,mov,mov")
 
36198
+   (set_attr "type" "arlo_imm,load1,store1,mov_reg,mov_imm,mov_imm")
 
36199
    (set_attr "pool_range" "*,32,*,*,*,*")
 
36200
    (set_attr "conds" "clob,nocond,nocond,nocond,nocond,clob")])
 
36201
 
 
36202
@@ -6515,7 +7394,7 @@
 
36203
 (define_insn "*arm32_movhf"
 
36204
   [(set (match_operand:HF 0 "nonimmediate_operand" "=r,m,r,r")
 
36205
        (match_operand:HF 1 "general_operand"      " m,r,r,F"))]
 
36206
-  "TARGET_32BIT && !(TARGET_HARD_FLOAT && TARGET_FP16)
 
36207
+  "TARGET_32BIT && !(TARGET_HARD_FLOAT && TARGET_FP16) && !arm_restrict_it
 
36208
    && (          s_register_operand (operands[0], HFmode)
 
36209
        || s_register_operand (operands[1], HFmode))"
 
36210
   "*
 
36211
@@ -6551,8 +7430,7 @@
 
36212
     }
 
36213
   "
 
36214
   [(set_attr "conds" "unconditional")
 
36215
-   (set_attr "type" "load1,store1,*,*")
 
36216
-   (set_attr "insn" "*,*,mov,mov")
 
36217
+   (set_attr "type" "load1,store1,mov_reg,mov_reg")
 
36218
    (set_attr "length" "4,4,4,8")
 
36219
    (set_attr "predicable" "yes")]
 
36220
 )
 
36221
@@ -6587,8 +7465,7 @@
 
36222
     }
 
36223
   "
 
36224
   [(set_attr "length" "2")
 
36225
-   (set_attr "type" "*,load1,store1,*,*")
 
36226
-   (set_attr "insn" "mov,*,*,mov,mov")
 
36227
+   (set_attr "type" "mov_reg,load1,store1,mov_reg,mov_reg")
 
36228
    (set_attr "pool_range" "*,1018,*,*,*")
 
36229
    (set_attr "conds" "clob,nocond,nocond,nocond,nocond")])
 
36230
 
 
36231
@@ -6642,8 +7519,8 @@
 
36232
    ldr%?\\t%0, %1\\t%@ float
 
36233
    str%?\\t%1, %0\\t%@ float"
 
36234
   [(set_attr "predicable" "yes")
 
36235
-   (set_attr "type" "*,load1,store1")
 
36236
-   (set_attr "insn" "mov,*,*")
 
36237
+   (set_attr "predicable_short_it" "no")
 
36238
+   (set_attr "type" "mov_reg,load1,store1")
 
36239
    (set_attr "arm_pool_range" "*,4096,*")
 
36240
    (set_attr "thumb2_pool_range" "*,4094,*")
 
36241
    (set_attr "arm_neg_pool_range" "*,4084,*")
 
36242
@@ -6666,9 +7543,8 @@
 
36243
    mov\\t%0, %1
 
36244
    mov\\t%0, %1"
 
36245
   [(set_attr "length" "2")
 
36246
-   (set_attr "type" "*,load1,store1,load1,store1,*,*")
 
36247
+   (set_attr "type" "*,load1,store1,load1,store1,mov_reg,mov_reg")
 
36248
    (set_attr "pool_range" "*,*,*,1018,*,*,*")
 
36249
-   (set_attr "insn" "*,*,*,*,*,mov,mov")
 
36250
    (set_attr "conds" "clob,nocond,nocond,nocond,nocond,nocond,nocond")]
 
36251
 )
 
36252
 
 
36253
@@ -6738,8 +7614,8 @@
 
36254
 )
 
36255
 
 
36256
 (define_insn "*movdf_soft_insn"
 
36257
-  [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,r,m")
 
36258
-       (match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,r"))]
 
36259
+  [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,q,m")
 
36260
+       (match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,q"))]
 
36261
   "TARGET_32BIT && TARGET_SOFT_FLOAT
 
36262
    && (   register_operand (operands[0], DFmode)
 
36263
        || register_operand (operands[1], DFmode))"
 
36264
@@ -6799,8 +7675,7 @@
 
36265
     }
 
36266
   "
 
36267
   [(set_attr "length" "4,2,2,6,4,4")
 
36268
-   (set_attr "type" "*,load2,store2,load2,store2,*")
 
36269
-   (set_attr "insn" "*,*,*,*,*,mov")
 
36270
+   (set_attr "type" "*,load2,store2,load2,store2,mov_reg")
 
36271
    (set_attr "pool_range" "*,*,*,1018,*,*")]
 
36272
 )
 
36273
 
 
36274
@@ -6869,10 +7744,18 @@
 
36275
    (match_operand:BLK 1 "general_operand" "")
 
36276
    (match_operand:SI 2 "const_int_operand" "")
 
36277
    (match_operand:SI 3 "const_int_operand" "")]
 
36278
-  "TARGET_EITHER"
 
36279
+  ""
 
36280
   "
 
36281
   if (TARGET_32BIT)
 
36282
     {
 
36283
+      if (TARGET_LDRD && current_tune->prefer_ldrd_strd
 
36284
+          && !optimize_function_for_size_p (cfun))
 
36285
+        {
 
36286
+          if (gen_movmem_ldrd_strd (operands))
 
36287
+            DONE;
 
36288
+          FAIL;
 
36289
+        }
 
36290
+
 
36291
       if (arm_gen_movmemqi (operands))
 
36292
         DONE;
 
36293
       FAIL;
 
36294
@@ -7568,7 +8451,7 @@
 
36295
    (set_attr "arch" "t2,t2,any,any")
 
36296
    (set_attr "length" "2,2,4,4")
 
36297
    (set_attr "predicable" "yes")
 
36298
-   (set_attr "type" "*,*,*,simple_alu_imm")]
 
36299
+   (set_attr "type" "*,*,*,arlo_imm")]
 
36300
 )
 
36301
 
 
36302
 (define_insn "*cmpsi_shiftsi"
 
36303
@@ -7582,7 +8465,7 @@
 
36304
   [(set_attr "conds" "set")
 
36305
    (set_attr "shift" "1")
 
36306
    (set_attr "arch" "32,a")
 
36307
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36308
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36309
 
 
36310
 (define_insn "*cmpsi_shiftsi_swp"
 
36311
   [(set (reg:CC_SWP CC_REGNUM)
 
36312
@@ -7595,7 +8478,7 @@
 
36313
   [(set_attr "conds" "set")
 
36314
    (set_attr "shift" "1")
 
36315
    (set_attr "arch" "32,a")
 
36316
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36317
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36318
 
 
36319
 (define_insn "*arm_cmpsi_negshiftsi_si"
 
36320
   [(set (reg:CC_Z CC_REGNUM)
 
36321
@@ -7608,8 +8491,8 @@
 
36322
   "cmn%?\\t%0, %2%S1"
 
36323
   [(set_attr "conds" "set")
 
36324
    (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
 
36325
-                                   (const_string "alu_shift")
 
36326
-                                   (const_string "alu_shift_reg")))
 
36327
+                                   (const_string "arlo_shift")
 
36328
+                                   (const_string "arlo_shift_reg")))
 
36329
    (set_attr "predicable" "yes")]
 
36330
 )
 
36331
 
 
36332
@@ -7617,25 +8500,69 @@
 
36333
 ;; if-conversion can not reduce to a conditional compare, so we do
 
36334
 ;; that directly.
 
36335
 
 
36336
-(define_insn "*arm_cmpdi_insn"
 
36337
+(define_insn_and_split "*arm_cmpdi_insn"
 
36338
   [(set (reg:CC_NCV CC_REGNUM)
 
36339
        (compare:CC_NCV (match_operand:DI 0 "s_register_operand" "r")
 
36340
                        (match_operand:DI 1 "arm_di_operand"       "rDi")))
 
36341
    (clobber (match_scratch:SI 2 "=r"))]
 
36342
   "TARGET_32BIT"
 
36343
-  "cmp\\t%Q0, %Q1\;sbcs\\t%2, %R0, %R1"
 
36344
+  "#"   ; "cmp\\t%Q0, %Q1\;sbcs\\t%2, %R0, %R1"
 
36345
+  "&& reload_completed"
 
36346
+  [(set (reg:CC CC_REGNUM)
 
36347
+        (compare:CC (match_dup 0) (match_dup 1)))
 
36348
+   (parallel [(set (reg:CC CC_REGNUM)
 
36349
+                   (compare:CC (match_dup 3) (match_dup 4)))
 
36350
+              (set (match_dup 2)
 
36351
+                   (minus:SI (match_dup 5)
 
36352
+                            (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))])]
 
36353
+  {
 
36354
+    operands[3] = gen_highpart (SImode, operands[0]);
 
36355
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
36356
+    if (CONST_INT_P (operands[1]))
 
36357
+      {
 
36358
+        operands[4] = GEN_INT (~INTVAL (gen_highpart_mode (SImode,
 
36359
+                                                           DImode,
 
36360
+                                                           operands[1])));
 
36361
+        operands[5] = gen_rtx_PLUS (SImode, operands[3], operands[4]);
 
36362
+      }
 
36363
+    else
 
36364
+      {
 
36365
+        operands[4] = gen_highpart (SImode, operands[1]);
 
36366
+        operands[5] = gen_rtx_MINUS (SImode, operands[3], operands[4]);
 
36367
+      }
 
36368
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
36369
+    operands[2] = gen_lowpart (SImode, operands[2]);
 
36370
+  }
 
36371
   [(set_attr "conds" "set")
 
36372
    (set_attr "length" "8")]
 
36373
 )
 
36374
 
 
36375
-(define_insn "*arm_cmpdi_unsigned"
 
36376
+(define_insn_and_split "*arm_cmpdi_unsigned"
 
36377
   [(set (reg:CC_CZ CC_REGNUM)
 
36378
-       (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "r")
 
36379
-                      (match_operand:DI 1 "arm_di_operand"     "rDi")))]
 
36380
+        (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r")
 
36381
+                       (match_operand:DI 1 "arm_di_operand"     "Py,r,rDi")))]
 
36382
+
 
36383
   "TARGET_32BIT"
 
36384
-  "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1"
 
36385
+  "#"   ; "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1"
 
36386
+  "&& reload_completed"
 
36387
+  [(set (reg:CC CC_REGNUM)
 
36388
+        (compare:CC (match_dup 2) (match_dup 3)))
 
36389
+   (cond_exec (eq:SI (reg:CC CC_REGNUM) (const_int 0))
 
36390
+              (set (reg:CC CC_REGNUM)
 
36391
+                   (compare:CC (match_dup 0) (match_dup 1))))]
 
36392
+  {
 
36393
+    operands[2] = gen_highpart (SImode, operands[0]);
 
36394
+    operands[0] = gen_lowpart (SImode, operands[0]);
 
36395
+    if (CONST_INT_P (operands[1]))
 
36396
+      operands[3] = gen_highpart_mode (SImode, DImode, operands[1]);
 
36397
+    else
 
36398
+      operands[3] = gen_highpart (SImode, operands[1]);
 
36399
+    operands[1] = gen_lowpart (SImode, operands[1]);
 
36400
+  }
 
36401
   [(set_attr "conds" "set")
 
36402
-   (set_attr "length" "8")]
 
36403
+   (set_attr "enabled_for_depr_it" "yes,yes,no")
 
36404
+   (set_attr "arch" "t2,t2,*")
 
36405
+   (set_attr "length" "6,6,8")]
 
36406
 )
 
36407
 
 
36408
 (define_insn "*arm_cmpdi_zero"
 
36409
@@ -7758,36 +8685,56 @@
 
36410
    operands[3] = const0_rtx;"
 
36411
 )
 
36412
 
 
36413
-(define_insn "*mov_scc"
 
36414
+(define_insn_and_split "*mov_scc"
 
36415
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
36416
        (match_operator:SI 1 "arm_comparison_operator"
 
36417
         [(match_operand 2 "cc_register" "") (const_int 0)]))]
 
36418
   "TARGET_ARM"
 
36419
-  "mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
 
36420
+  "#"   ; "mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
 
36421
+  "TARGET_ARM"
 
36422
+  [(set (match_dup 0)
 
36423
+        (if_then_else:SI (match_dup 1)
 
36424
+                         (const_int 1)
 
36425
+                         (const_int 0)))]
 
36426
+  ""
 
36427
   [(set_attr "conds" "use")
 
36428
-   (set_attr "insn" "mov")
 
36429
    (set_attr "length" "8")]
 
36430
 )
 
36431
 
 
36432
-(define_insn "*mov_negscc"
 
36433
+(define_insn_and_split "*mov_negscc"
 
36434
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
36435
        (neg:SI (match_operator:SI 1 "arm_comparison_operator"
 
36436
                 [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
36437
   "TARGET_ARM"
 
36438
-  "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
 
36439
+  "#"   ; "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
 
36440
+  "TARGET_ARM"
 
36441
+  [(set (match_dup 0)
 
36442
+        (if_then_else:SI (match_dup 1)
 
36443
+                         (match_dup 3)
 
36444
+                         (const_int 0)))]
 
36445
+  {
 
36446
+    operands[3] = GEN_INT (~0);
 
36447
+  }
 
36448
   [(set_attr "conds" "use")
 
36449
-   (set_attr "insn" "mov")
 
36450
    (set_attr "length" "8")]
 
36451
 )
 
36452
 
 
36453
-(define_insn "*mov_notscc"
 
36454
+(define_insn_and_split "*mov_notscc"
 
36455
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
36456
        (not:SI (match_operator:SI 1 "arm_comparison_operator"
 
36457
                 [(match_operand 2 "cc_register" "") (const_int 0)])))]
 
36458
   "TARGET_ARM"
 
36459
-  "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
 
36460
+  "#"   ; "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
 
36461
+  "TARGET_ARM"
 
36462
+  [(set (match_dup 0)
 
36463
+        (if_then_else:SI (match_dup 1)
 
36464
+                         (match_dup 3)
 
36465
+                         (match_dup 4)))]
 
36466
+  {
 
36467
+    operands[3] = GEN_INT (~1);
 
36468
+    operands[4] = GEN_INT (~0);
 
36469
+  }
 
36470
   [(set_attr "conds" "use")
 
36471
-   (set_attr "insn" "mov")
 
36472
    (set_attr "length" "8")]
 
36473
 )
 
36474
 
 
36475
@@ -8069,7 +9016,7 @@
 
36476
 
 
36477
 (define_expand "movsfcc"
 
36478
   [(set (match_operand:SF 0 "s_register_operand" "")
 
36479
-       (if_then_else:SF (match_operand 1 "expandable_comparison_operator" "")
 
36480
+       (if_then_else:SF (match_operand 1 "arm_cond_move_operator" "")
 
36481
                         (match_operand:SF 2 "s_register_operand" "")
 
36482
                         (match_operand:SF 3 "s_register_operand" "")))]
 
36483
   "TARGET_32BIT && TARGET_HARD_FLOAT"
 
36484
@@ -8091,7 +9038,7 @@
 
36485
 
 
36486
 (define_expand "movdfcc"
 
36487
   [(set (match_operand:DF 0 "s_register_operand" "")
 
36488
-       (if_then_else:DF (match_operand 1 "expandable_comparison_operator" "")
 
36489
+       (if_then_else:DF (match_operand 1 "arm_cond_move_operator" "")
 
36490
                         (match_operand:DF 2 "s_register_operand" "")
 
36491
                         (match_operand:DF 3 "s_register_operand" "")))]
 
36492
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
 
36493
@@ -8110,7 +9057,40 @@
 
36494
   }"
 
36495
 )
 
36496
 
 
36497
-(define_insn "*movsicc_insn"
 
36498
+(define_insn "*cmov<mode>"
 
36499
+    [(set (match_operand:SDF 0 "s_register_operand" "=<F_constraint>")
 
36500
+       (if_then_else:SDF (match_operator 1 "arm_vsel_comparison_operator"
 
36501
+                         [(match_operand 2 "cc_register" "") (const_int 0)])
 
36502
+                         (match_operand:SDF 3 "s_register_operand"
 
36503
+                                             "<F_constraint>")
 
36504
+                         (match_operand:SDF 4 "s_register_operand"
 
36505
+                                             "<F_constraint>")))]
 
36506
+  "TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 <vfp_double_cond>"
 
36507
+  "*
 
36508
+  {
 
36509
+    enum arm_cond_code code = maybe_get_arm_condition_code (operands[1]);
 
36510
+    switch (code)
 
36511
+      {
 
36512
+      case ARM_GE:
 
36513
+      case ARM_GT:
 
36514
+      case ARM_EQ:
 
36515
+      case ARM_VS:
 
36516
+        return \"vsel%d1.<V_if_elem>\\t%<V_reg>0, %<V_reg>3, %<V_reg>4\";
 
36517
+      case ARM_LT:
 
36518
+      case ARM_LE:
 
36519
+      case ARM_NE:
 
36520
+      case ARM_VC:
 
36521
+        return \"vsel%D1.<V_if_elem>\\t%<V_reg>0, %<V_reg>4, %<V_reg>3\";
 
36522
+      default:
 
36523
+        gcc_unreachable ();
 
36524
+      }
 
36525
+    return \"\";
 
36526
+  }"
 
36527
+  [(set_attr "conds" "use")
 
36528
+   (set_attr "type" "f_sel<vfp_type>")]
 
36529
+)
 
36530
+
 
36531
+(define_insn_and_split "*movsicc_insn"
 
36532
   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r")
 
36533
        (if_then_else:SI
 
36534
         (match_operator 3 "arm_comparison_operator"
 
36535
@@ -8123,26 +9103,60 @@
 
36536
    mvn%D3\\t%0, #%B2
 
36537
    mov%d3\\t%0, %1
 
36538
    mvn%d3\\t%0, #%B1
 
36539
-   mov%d3\\t%0, %1\;mov%D3\\t%0, %2
 
36540
-   mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2
 
36541
-   mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2
 
36542
-   mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2"
 
36543
+   #
 
36544
+   #
 
36545
+   #
 
36546
+   #"
 
36547
+   ; alt4: mov%d3\\t%0, %1\;mov%D3\\t%0, %2
 
36548
+   ; alt5: mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2
 
36549
+   ; alt6: mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2
 
36550
+   ; alt7: mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2"
 
36551
+  "&& reload_completed"
 
36552
+  [(const_int 0)]
 
36553
+  {
 
36554
+    enum rtx_code rev_code;
 
36555
+    enum machine_mode mode;
 
36556
+    rtx rev_cond;
 
36557
+
 
36558
+    emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
36559
+                                  operands[3],
 
36560
+                                  gen_rtx_SET (VOIDmode,
 
36561
+                                               operands[0],
 
36562
+                                               operands[1])));
 
36563
+
 
36564
+    rev_code = GET_CODE (operands[3]);
 
36565
+    mode = GET_MODE (operands[4]);
 
36566
+    if (mode == CCFPmode || mode == CCFPEmode)
 
36567
+      rev_code = reverse_condition_maybe_unordered (rev_code);
 
36568
+    else
 
36569
+      rev_code = reverse_condition (rev_code);
 
36570
+
 
36571
+    rev_cond = gen_rtx_fmt_ee (rev_code,
 
36572
+                               VOIDmode,
 
36573
+                               operands[4],
 
36574
+                               const0_rtx);
 
36575
+    emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
36576
+                                  rev_cond,
 
36577
+                                  gen_rtx_SET (VOIDmode,
 
36578
+                                               operands[0],
 
36579
+                                               operands[2])));
 
36580
+    DONE;
 
36581
+  }
 
36582
   [(set_attr "length" "4,4,4,4,8,8,8,8")
 
36583
    (set_attr "conds" "use")
 
36584
-   (set_attr "insn" "mov,mvn,mov,mvn,mov,mov,mvn,mvn")
 
36585
    (set_attr_alternative "type"
 
36586
                          [(if_then_else (match_operand 2 "const_int_operand" "")
 
36587
-                                        (const_string "simple_alu_imm")
 
36588
-                                        (const_string "*"))
 
36589
-                          (const_string "simple_alu_imm")
 
36590
+                                        (const_string "mov_imm")
 
36591
+                                        (const_string "mov_reg"))
 
36592
+                          (const_string "mvn_imm")
 
36593
                           (if_then_else (match_operand 1 "const_int_operand" "")
 
36594
-                                        (const_string "simple_alu_imm")
 
36595
-                                        (const_string "*"))
 
36596
-                          (const_string "simple_alu_imm")
 
36597
-                          (const_string "*")
 
36598
-                          (const_string "*")
 
36599
-                          (const_string "*")
 
36600
-                          (const_string "*")])]
 
36601
+                                        (const_string "mov_imm")
 
36602
+                                        (const_string "mov_reg"))
 
36603
+                          (const_string "mvn_imm")
 
36604
+                          (const_string "mov_reg")
 
36605
+                          (const_string "mov_reg")
 
36606
+                          (const_string "mov_reg")
 
36607
+                          (const_string "mov_reg")])]
 
36608
 )
 
36609
 
 
36610
 (define_insn "*movsfcc_soft_insn"
 
36611
@@ -8156,7 +9170,7 @@
 
36612
    mov%D3\\t%0, %2
 
36613
    mov%d3\\t%0, %1"
 
36614
   [(set_attr "conds" "use")
 
36615
-   (set_attr "insn" "mov")]
 
36616
+   (set_attr "type" "mov_reg")]
 
36617
 )
 
36618
 
 
36619
 
 
36620
@@ -8255,7 +9269,7 @@
 
36621
          (match_operand 1 "" ""))
 
36622
    (use (match_operand 2 "" ""))
 
36623
    (clobber (reg:SI LR_REGNUM))]
 
36624
-  "TARGET_ARM && arm_arch5"
 
36625
+  "TARGET_ARM && arm_arch5 && !SIBLING_CALL_P (insn)"
 
36626
   "blx%?\\t%0"
 
36627
   [(set_attr "type" "call")]
 
36628
 )
 
36629
@@ -8265,7 +9279,7 @@
 
36630
          (match_operand 1 "" ""))
 
36631
    (use (match_operand 2 "" ""))
 
36632
    (clobber (reg:SI LR_REGNUM))]
 
36633
-  "TARGET_ARM && !arm_arch5"
 
36634
+  "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)"
 
36635
   "*
 
36636
   return output_call (operands);
 
36637
   "
 
36638
@@ -8284,7 +9298,7 @@
 
36639
         (match_operand 1 "" ""))
 
36640
    (use (match_operand 2 "" ""))
 
36641
    (clobber (reg:SI LR_REGNUM))]
 
36642
-  "TARGET_ARM && !arm_arch5"
 
36643
+  "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)"
 
36644
   "*
 
36645
   return output_call_mem (operands);
 
36646
   "
 
36647
@@ -8297,7 +9311,7 @@
 
36648
         (match_operand 1 "" ""))
 
36649
    (use (match_operand 2 "" ""))
 
36650
    (clobber (reg:SI LR_REGNUM))]
 
36651
-  "TARGET_THUMB1 && arm_arch5"
 
36652
+  "TARGET_THUMB1 && arm_arch5 && !SIBLING_CALL_P (insn)"
 
36653
   "blx\\t%0"
 
36654
   [(set_attr "length" "2")
 
36655
    (set_attr "type" "call")]
 
36656
@@ -8308,7 +9322,7 @@
 
36657
         (match_operand 1 "" ""))
 
36658
    (use (match_operand 2 "" ""))
 
36659
    (clobber (reg:SI LR_REGNUM))]
 
36660
-  "TARGET_THUMB1 && !arm_arch5"
 
36661
+  "TARGET_THUMB1 && !arm_arch5 && !SIBLING_CALL_P (insn)"
 
36662
   "*
 
36663
   {
 
36664
     if (!TARGET_CALLER_INTERWORKING)
 
36665
@@ -8367,7 +9381,7 @@
 
36666
              (match_operand 2 "" "")))
 
36667
    (use (match_operand 3 "" ""))
 
36668
    (clobber (reg:SI LR_REGNUM))]
 
36669
-  "TARGET_ARM && arm_arch5"
 
36670
+  "TARGET_ARM && arm_arch5 && !SIBLING_CALL_P (insn)"
 
36671
   "blx%?\\t%1"
 
36672
   [(set_attr "type" "call")]
 
36673
 )
 
36674
@@ -8378,7 +9392,7 @@
 
36675
              (match_operand 2 "" "")))
 
36676
    (use (match_operand 3 "" ""))
 
36677
    (clobber (reg:SI LR_REGNUM))]
 
36678
-  "TARGET_ARM && !arm_arch5"
 
36679
+  "TARGET_ARM && !arm_arch5 && !SIBLING_CALL_P (insn)"
 
36680
   "*
 
36681
   return output_call (&operands[1]);
 
36682
   "
 
36683
@@ -8394,7 +9408,8 @@
 
36684
              (match_operand 2 "" "")))
 
36685
    (use (match_operand 3 "" ""))
 
36686
    (clobber (reg:SI LR_REGNUM))]
 
36687
-  "TARGET_ARM && !arm_arch5 && (!CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))"
 
36688
+  "TARGET_ARM && !arm_arch5 && (!CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
 
36689
+   && !SIBLING_CALL_P (insn)"
 
36690
   "*
 
36691
   return output_call_mem (&operands[1]);
 
36692
   "
 
36693
@@ -8444,6 +9459,7 @@
 
36694
    (use (match_operand 2 "" ""))
 
36695
    (clobber (reg:SI LR_REGNUM))]
 
36696
   "TARGET_32BIT
 
36697
+   && !SIBLING_CALL_P (insn)
 
36698
    && (GET_CODE (operands[0]) == SYMBOL_REF)
 
36699
    && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))"
 
36700
   "*
 
36701
@@ -8460,6 +9476,7 @@
 
36702
    (use (match_operand 3 "" ""))
 
36703
    (clobber (reg:SI LR_REGNUM))]
 
36704
   "TARGET_32BIT
 
36705
+   && !SIBLING_CALL_P (insn)
 
36706
    && (GET_CODE (operands[1]) == SYMBOL_REF)
 
36707
    && !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))"
 
36708
   "*
 
36709
@@ -8505,6 +9522,10 @@
 
36710
   "TARGET_32BIT"
 
36711
   "
 
36712
   {
 
36713
+    if (!REG_P (XEXP (operands[0], 0))
 
36714
+       && (GET_CODE (XEXP (operands[0], 0)) != SYMBOL_REF))
 
36715
+     XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0));
 
36716
+
 
36717
     if (operands[2] == NULL_RTX)
 
36718
       operands[2] = const0_rtx;
 
36719
   }"
 
36720
@@ -8519,47 +9540,67 @@
 
36721
   "TARGET_32BIT"
 
36722
   "
 
36723
   {
 
36724
+    if (!REG_P (XEXP (operands[1], 0)) &&
 
36725
+       (GET_CODE (XEXP (operands[1],0)) != SYMBOL_REF))
 
36726
+     XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0));
 
36727
+
 
36728
     if (operands[3] == NULL_RTX)
 
36729
       operands[3] = const0_rtx;
 
36730
   }"
 
36731
 )
 
36732
 
 
36733
 (define_insn "*sibcall_insn"
 
36734
- [(call (mem:SI (match_operand:SI 0 "" "X"))
 
36735
+ [(call (mem:SI (match_operand:SI 0 "call_insn_operand" "Cs, US"))
 
36736
        (match_operand 1 "" ""))
 
36737
   (return)
 
36738
   (use (match_operand 2 "" ""))]
 
36739
-  "TARGET_32BIT && GET_CODE (operands[0]) == SYMBOL_REF"
 
36740
+  "TARGET_32BIT && SIBLING_CALL_P (insn)"
 
36741
   "*
 
36742
-  return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\";
 
36743
+  if (which_alternative == 1)
 
36744
+    return NEED_PLT_RELOC ? \"b%?\\t%a0(PLT)\" : \"b%?\\t%a0\";
 
36745
+  else
 
36746
+    {
 
36747
+      if (arm_arch5 || arm_arch4t)
 
36748
+       return \"bx%?\\t%0\\t%@ indirect register sibling call\";
 
36749
+      else
 
36750
+       return \"mov%?\\t%|pc, %0\\t%@ indirect register sibling call\";
 
36751
+    }
 
36752
   "
 
36753
   [(set_attr "type" "call")]
 
36754
 )
 
36755
 
 
36756
 (define_insn "*sibcall_value_insn"
 
36757
  [(set (match_operand 0 "" "")
 
36758
-       (call (mem:SI (match_operand:SI 1 "" "X"))
 
36759
+       (call (mem:SI (match_operand:SI 1 "call_insn_operand" "Cs,US"))
 
36760
             (match_operand 2 "" "")))
 
36761
   (return)
 
36762
   (use (match_operand 3 "" ""))]
 
36763
-  "TARGET_32BIT && GET_CODE (operands[1]) == SYMBOL_REF"
 
36764
+  "TARGET_32BIT && SIBLING_CALL_P (insn)"
 
36765
   "*
 
36766
-  return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\";
 
36767
+  if (which_alternative == 1)
 
36768
+   return NEED_PLT_RELOC ? \"b%?\\t%a1(PLT)\" : \"b%?\\t%a1\";
 
36769
+  else
 
36770
+    {
 
36771
+      if (arm_arch5 || arm_arch4t)
 
36772
+       return \"bx%?\\t%1\";
 
36773
+      else
 
36774
+       return \"mov%?\\t%|pc, %1\\t@ indirect sibling call \";
 
36775
+    }
 
36776
   "
 
36777
   [(set_attr "type" "call")]
 
36778
 )
 
36779
 
 
36780
-(define_expand "return"
 
36781
-  [(return)]
 
36782
+(define_expand "<return_str>return"
 
36783
+  [(returns)]
 
36784
   "(TARGET_ARM || (TARGET_THUMB2
 
36785
                    && ARM_FUNC_TYPE (arm_current_func_type ()) == ARM_FT_NORMAL
 
36786
                    && !IS_STACKALIGN (arm_current_func_type ())))
 
36787
-    && USE_RETURN_INSN (FALSE)"
 
36788
+    <return_cond_false>"
 
36789
   "
 
36790
   {
 
36791
     if (TARGET_THUMB2)
 
36792
       {
 
36793
-        thumb2_expand_return ();
 
36794
+        thumb2_expand_return (<return_simple_p>);
 
36795
         DONE;
 
36796
       }
 
36797
   }
 
36798
@@ -8584,13 +9625,13 @@
 
36799
    (set_attr "predicable" "yes")]
 
36800
 )
 
36801
 
 
36802
-(define_insn "*cond_return"
 
36803
+(define_insn "*cond_<return_str>return"
 
36804
   [(set (pc)
 
36805
         (if_then_else (match_operator 0 "arm_comparison_operator"
 
36806
                       [(match_operand 1 "cc_register" "") (const_int 0)])
 
36807
-                      (return)
 
36808
+                      (returns)
 
36809
                       (pc)))]
 
36810
-  "TARGET_ARM && USE_RETURN_INSN (TRUE)"
 
36811
+  "TARGET_ARM  <return_cond_true>"
 
36812
   "*
 
36813
   {
 
36814
     if (arm_ccfsm_state == 2)
 
36815
@@ -8598,20 +9639,21 @@
 
36816
         arm_ccfsm_state += 2;
 
36817
         return \"\";
 
36818
       }
 
36819
-    return output_return_instruction (operands[0], true, false, false);
 
36820
+    return output_return_instruction (operands[0], true, false,
 
36821
+                                     <return_simple_p>);
 
36822
   }"
 
36823
   [(set_attr "conds" "use")
 
36824
    (set_attr "length" "12")
 
36825
    (set_attr "type" "load1")]
 
36826
 )
 
36827
 
 
36828
-(define_insn "*cond_return_inverted"
 
36829
+(define_insn "*cond_<return_str>return_inverted"
 
36830
   [(set (pc)
 
36831
         (if_then_else (match_operator 0 "arm_comparison_operator"
 
36832
                       [(match_operand 1 "cc_register" "") (const_int 0)])
 
36833
                       (pc)
 
36834
-                     (return)))]
 
36835
-  "TARGET_ARM && USE_RETURN_INSN (TRUE)"
 
36836
+                     (returns)))]
 
36837
+  "TARGET_ARM <return_cond_true>"
 
36838
   "*
 
36839
   {
 
36840
     if (arm_ccfsm_state == 2)
 
36841
@@ -8619,7 +9661,8 @@
 
36842
         arm_ccfsm_state += 2;
 
36843
         return \"\";
 
36844
       }
 
36845
-    return output_return_instruction (operands[0], true, true, false);
 
36846
+    return output_return_instruction (operands[0], true, true,
 
36847
+                                     <return_simple_p>);
 
36848
   }"
 
36849
   [(set_attr "conds" "use")
 
36850
    (set_attr "length" "12")
 
36851
@@ -8991,7 +10034,7 @@
 
36852
                          (if_then_else
 
36853
                           (match_operand:SI 3 "mult_operator" "")
 
36854
                           (const_string "no") (const_string "yes"))])
 
36855
-   (set_attr "type" "alu_shift,alu_shift,alu_shift,alu_shift_reg")])
 
36856
+   (set_attr "type" "arlo_shift,arlo_shift,arlo_shift,arlo_shift_reg")])
 
36857
 
 
36858
 (define_split
 
36859
   [(set (match_operand:SI 0 "s_register_operand" "")
 
36860
@@ -9028,7 +10071,7 @@
 
36861
   [(set_attr "conds" "set")
 
36862
    (set_attr "shift" "4")
 
36863
    (set_attr "arch" "32,a")
 
36864
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36865
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36866
 
 
36867
 (define_insn "*arith_shiftsi_compare0_scratch"
 
36868
   [(set (reg:CC_NOOV CC_REGNUM)
 
36869
@@ -9045,7 +10088,7 @@
 
36870
   [(set_attr "conds" "set")
 
36871
    (set_attr "shift" "4")
 
36872
    (set_attr "arch" "32,a")
 
36873
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36874
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36875
 
 
36876
 (define_insn "*sub_shiftsi"
 
36877
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
36878
@@ -9058,7 +10101,7 @@
 
36879
   [(set_attr "predicable" "yes")
 
36880
    (set_attr "shift" "3")
 
36881
    (set_attr "arch" "32,a")
 
36882
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36883
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36884
 
 
36885
 (define_insn "*sub_shiftsi_compare0"
 
36886
   [(set (reg:CC_NOOV CC_REGNUM)
 
36887
@@ -9076,7 +10119,7 @@
 
36888
   [(set_attr "conds" "set")
 
36889
    (set_attr "shift" "3")
 
36890
    (set_attr "arch" "32,a")
 
36891
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36892
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36893
 
 
36894
 (define_insn "*sub_shiftsi_compare0_scratch"
 
36895
   [(set (reg:CC_NOOV CC_REGNUM)
 
36896
@@ -9092,30 +10135,67 @@
 
36897
   [(set_attr "conds" "set")
 
36898
    (set_attr "shift" "3")
 
36899
    (set_attr "arch" "32,a")
 
36900
-   (set_attr "type" "alu_shift,alu_shift_reg")])
 
36901
+   (set_attr "type" "arlo_shift,arlo_shift_reg")])
 
36902
 
 
36903
 
 
36904
-(define_insn "*and_scc"
 
36905
+(define_insn_and_split "*and_scc"
 
36906
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
36907
        (and:SI (match_operator:SI 1 "arm_comparison_operator"
 
36908
-                [(match_operand 3 "cc_register" "") (const_int 0)])
 
36909
-               (match_operand:SI 2 "s_register_operand" "r")))]
 
36910
+                [(match_operand 2 "cc_register" "") (const_int 0)])
 
36911
+               (match_operand:SI 3 "s_register_operand" "r")))]
 
36912
   "TARGET_ARM"
 
36913
-  "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1"
 
36914
+  "#"   ; "mov%D1\\t%0, #0\;and%d1\\t%0, %3, #1"
 
36915
+  "&& reload_completed"
 
36916
+  [(cond_exec (match_dup 5) (set (match_dup 0) (const_int 0)))
 
36917
+   (cond_exec (match_dup 4) (set (match_dup 0)
 
36918
+                                 (and:SI (match_dup 3) (const_int 1))))]
 
36919
+  {
 
36920
+    enum machine_mode mode = GET_MODE (operands[2]);
 
36921
+    enum rtx_code rc = GET_CODE (operands[1]);
 
36922
+
 
36923
+    /* Note that operands[4] is the same as operands[1],
 
36924
+       but with VOIDmode as the result. */
 
36925
+    operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
36926
+    if (mode == CCFPmode || mode == CCFPEmode)
 
36927
+      rc = reverse_condition_maybe_unordered (rc);
 
36928
+    else
 
36929
+      rc = reverse_condition (rc);
 
36930
+    operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
36931
+  }
 
36932
   [(set_attr "conds" "use")
 
36933
-   (set_attr "insn" "mov")
 
36934
+   (set_attr "type" "mov_reg")
 
36935
    (set_attr "length" "8")]
 
36936
 )
 
36937
 
 
36938
-(define_insn "*ior_scc"
 
36939
+(define_insn_and_split "*ior_scc"
 
36940
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
36941
-       (ior:SI (match_operator:SI 2 "arm_comparison_operator"
 
36942
-                [(match_operand 3 "cc_register" "") (const_int 0)])
 
36943
-               (match_operand:SI 1 "s_register_operand" "0,?r")))]
 
36944
+       (ior:SI (match_operator:SI 1 "arm_comparison_operator"
 
36945
+                [(match_operand 2 "cc_register" "") (const_int 0)])
 
36946
+               (match_operand:SI 3 "s_register_operand" "0,?r")))]
 
36947
   "TARGET_ARM"
 
36948
   "@
 
36949
-   orr%d2\\t%0, %1, #1
 
36950
-   mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1"
 
36951
+   orr%d1\\t%0, %3, #1
 
36952
+   #"
 
36953
+  "&& reload_completed
 
36954
+   && REGNO (operands [0]) != REGNO (operands[3])"
 
36955
+  ;; && which_alternative == 1
 
36956
+  ; mov%D1\\t%0, %3\;orr%d1\\t%0, %3, #1
 
36957
+  [(cond_exec (match_dup 5) (set (match_dup 0) (match_dup 3)))
 
36958
+   (cond_exec (match_dup 4) (set (match_dup 0)
 
36959
+                                 (ior:SI (match_dup 3) (const_int 1))))]
 
36960
+  {
 
36961
+    enum machine_mode mode = GET_MODE (operands[2]);
 
36962
+    enum rtx_code rc = GET_CODE (operands[1]);
 
36963
+
 
36964
+    /* Note that operands[4] is the same as operands[1],
 
36965
+       but with VOIDmode as the result. */
 
36966
+    operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
36967
+    if (mode == CCFPmode || mode == CCFPEmode)
 
36968
+      rc = reverse_condition_maybe_unordered (rc);
 
36969
+    else
 
36970
+      rc = reverse_condition (rc);
 
36971
+    operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
 
36972
+  }
 
36973
   [(set_attr "conds" "use")
 
36974
    (set_attr "length" "4,8")]
 
36975
 )
 
36976
@@ -9144,6 +10224,16 @@
 
36977
        (eq:SI (match_operand:SI 1 "s_register_operand" "")
 
36978
               (const_int 0)))
 
36979
    (clobber (reg:CC CC_REGNUM))]
 
36980
+  "arm_arch5 && TARGET_32BIT"
 
36981
+  [(set (match_dup 0) (clz:SI (match_dup 1)))
 
36982
+   (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))]
 
36983
+)
 
36984
+
 
36985
+(define_split
 
36986
+  [(set (match_operand:SI 0 "s_register_operand" "")
 
36987
+       (eq:SI (match_operand:SI 1 "s_register_operand" "")
 
36988
+              (const_int 0)))
 
36989
+   (clobber (reg:CC CC_REGNUM))]
 
36990
   "TARGET_32BIT && reload_completed"
 
36991
   [(parallel
 
36992
     [(set (reg:CC CC_REGNUM)
 
36993
@@ -9184,7 +10274,7 @@
 
36994
              (set (match_dup 0) (const_int 1)))])
 
36995
 
 
36996
 (define_insn_and_split "*compare_scc"
 
36997
-  [(set (match_operand:SI 0 "s_register_operand" "=r,r")
 
36998
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts,Ts")
 
36999
        (match_operator:SI 1 "arm_comparison_operator"
 
37000
         [(match_operand:SI 2 "s_register_operand" "r,r")
 
37001
          (match_operand:SI 3 "arm_add_operand" "rI,L")]))
 
37002
@@ -9213,29 +10303,93 @@
 
37003
 
 
37004
 ;; Attempt to improve the sequence generated by the compare_scc splitters
 
37005
 ;; not to use conditional execution.
 
37006
+
 
37007
+;; Rd = (eq (reg1) (const_int0))  // ARMv5
 
37008
+;;     clz Rd, reg1
 
37009
+;;     lsr Rd, Rd, #5
 
37010
 (define_peephole2
 
37011
   [(set (reg:CC CC_REGNUM)
 
37012
        (compare:CC (match_operand:SI 1 "register_operand" "")
 
37013
+                   (const_int 0)))
 
37014
+   (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0))
 
37015
+             (set (match_operand:SI 0 "register_operand" "") (const_int 0)))
 
37016
+   (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0))
 
37017
+             (set (match_dup 0) (const_int 1)))]
 
37018
+  "arm_arch5 && TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)"
 
37019
+  [(set (match_dup 0) (clz:SI (match_dup 1)))
 
37020
+   (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))]
 
37021
+)
 
37022
+
 
37023
+;; Rd = (eq (reg1) (const_int0))  // !ARMv5
 
37024
+;;     negs Rd, reg1
 
37025
+;;     adc  Rd, Rd, reg1
 
37026
+(define_peephole2
 
37027
+  [(set (reg:CC CC_REGNUM)
 
37028
+       (compare:CC (match_operand:SI 1 "register_operand" "")
 
37029
+                   (const_int 0)))
 
37030
+   (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0))
 
37031
+             (set (match_operand:SI 0 "register_operand" "") (const_int 0)))
 
37032
+   (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0))
 
37033
+             (set (match_dup 0) (const_int 1)))
 
37034
+   (match_scratch:SI 2 "r")]
 
37035
+  "TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)"
 
37036
+  [(parallel
 
37037
+    [(set (reg:CC CC_REGNUM)
 
37038
+         (compare:CC (const_int 0) (match_dup 1)))
 
37039
+     (set (match_dup 2) (minus:SI (const_int 0) (match_dup 1)))])
 
37040
+   (set (match_dup 0)
 
37041
+       (plus:SI (plus:SI (match_dup 1) (match_dup 2))
 
37042
+                (geu:SI (reg:CC CC_REGNUM) (const_int 0))))]
 
37043
+)
 
37044
+
 
37045
+;; Rd = (eq (reg1) (reg2/imm)) // ARMv5 and optimising for speed.
 
37046
+;;     sub  Rd, Reg1, reg2
 
37047
+;;     clz  Rd, Rd
 
37048
+;;     lsr  Rd, Rd, #5
 
37049
+(define_peephole2
 
37050
+  [(set (reg:CC CC_REGNUM)
 
37051
+       (compare:CC (match_operand:SI 1 "register_operand" "")
 
37052
                    (match_operand:SI 2 "arm_rhs_operand" "")))
 
37053
    (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0))
 
37054
              (set (match_operand:SI 0 "register_operand" "") (const_int 0)))
 
37055
    (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0))
 
37056
+             (set (match_dup 0) (const_int 1)))]
 
37057
+  "arm_arch5 && TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)
 
37058
+  && !(TARGET_THUMB2 && optimize_insn_for_size_p ())"
 
37059
+  [(set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))
 
37060
+   (set (match_dup 0) (clz:SI (match_dup 0)))
 
37061
+   (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 5)))]
 
37062
+)
 
37063
+
 
37064
+
 
37065
+;; Rd = (eq (reg1) (reg2))     // ! ARMv5 or optimising for size.
 
37066
+;;     sub  T1, Reg1, reg2
 
37067
+;;     negs Rd, T1
 
37068
+;;     adc  Rd, Rd, T1
 
37069
+(define_peephole2
 
37070
+  [(set (reg:CC CC_REGNUM)
 
37071
+       (compare:CC (match_operand:SI 1 "register_operand" "")
 
37072
+                   (match_operand:SI 2 "arm_rhs_operand" "")))
 
37073
+   (cond_exec (ne (reg:CC CC_REGNUM) (const_int 0))
 
37074
+             (set (match_operand:SI 0 "register_operand" "") (const_int 0)))
 
37075
+   (cond_exec (eq (reg:CC CC_REGNUM) (const_int 0))
 
37076
              (set (match_dup 0) (const_int 1)))
 
37077
    (match_scratch:SI 3 "r")]
 
37078
-  "TARGET_32BIT"
 
37079
-  [(parallel
 
37080
-    [(set (reg:CC CC_REGNUM)
 
37081
-         (compare:CC (match_dup 1) (match_dup 2)))
 
37082
-     (set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2)))])
 
37083
+  "TARGET_32BIT && peep2_regno_dead_p (3, CC_REGNUM)"
 
37084
+  [(set (match_dup 3) (match_dup 4))
 
37085
    (parallel
 
37086
     [(set (reg:CC CC_REGNUM)
 
37087
          (compare:CC (const_int 0) (match_dup 3)))
 
37088
      (set (match_dup 0) (minus:SI (const_int 0) (match_dup 3)))])
 
37089
-   (parallel
 
37090
-    [(set (match_dup 0)
 
37091
-         (plus:SI (plus:SI (match_dup 0) (match_dup 3))
 
37092
-                  (geu:SI (reg:CC CC_REGNUM) (const_int 0))))
 
37093
-     (clobber (reg:CC CC_REGNUM))])])
 
37094
+   (set (match_dup 0)
 
37095
+       (plus:SI (plus:SI (match_dup 0) (match_dup 3))
 
37096
+                (geu:SI (reg:CC CC_REGNUM) (const_int 0))))]
 
37097
+  "
 
37098
+  if (CONST_INT_P (operands[2]))
 
37099
+    operands[4] = plus_constant (SImode, operands[1], -INTVAL (operands[2]));
 
37100
+  else
 
37101
+    operands[4] = gen_rtx_MINUS (SImode, operands[1], operands[2]);
 
37102
+  ")
 
37103
 
 
37104
 (define_insn "*cond_move"
 
37105
   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
37106
@@ -9262,7 +10416,7 @@
 
37107
     return \"\";
 
37108
   "
 
37109
   [(set_attr "conds" "use")
 
37110
-   (set_attr "insn" "mov")
 
37111
+   (set_attr "type" "mov_reg")
 
37112
    (set_attr "length" "4,4,8")]
 
37113
 )
 
37114
 
 
37115
@@ -9636,7 +10790,7 @@
 
37116
 )
 
37117
 
 
37118
 (define_insn_and_split "*ior_scc_scc"
 
37119
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37120
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts")
 
37121
        (ior:SI (match_operator:SI 3 "arm_comparison_operator"
 
37122
                 [(match_operand:SI 1 "s_register_operand" "r")
 
37123
                  (match_operand:SI 2 "arm_add_operand" "rIL")])
 
37124
@@ -9674,7 +10828,7 @@
 
37125
                          [(match_operand:SI 4 "s_register_operand" "r")
 
37126
                           (match_operand:SI 5 "arm_add_operand" "rIL")]))
 
37127
                 (const_int 0)))
 
37128
-   (set (match_operand:SI 7 "s_register_operand" "=r")
 
37129
+   (set (match_operand:SI 7 "s_register_operand" "=Ts")
 
37130
        (ior:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)])
 
37131
                (match_op_dup 6 [(match_dup 4) (match_dup 5)])))]
 
37132
   "TARGET_32BIT"
 
37133
@@ -9692,7 +10846,7 @@
 
37134
    (set_attr "length" "16")])
 
37135
 
 
37136
 (define_insn_and_split "*and_scc_scc"
 
37137
-  [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37138
+  [(set (match_operand:SI 0 "s_register_operand" "=Ts")
 
37139
        (and:SI (match_operator:SI 3 "arm_comparison_operator"
 
37140
                 [(match_operand:SI 1 "s_register_operand" "r")
 
37141
                  (match_operand:SI 2 "arm_add_operand" "rIL")])
 
37142
@@ -9732,7 +10886,7 @@
 
37143
                          [(match_operand:SI 4 "s_register_operand" "r")
 
37144
                           (match_operand:SI 5 "arm_add_operand" "rIL")]))
 
37145
                 (const_int 0)))
 
37146
-   (set (match_operand:SI 7 "s_register_operand" "=r")
 
37147
+   (set (match_operand:SI 7 "s_register_operand" "=Ts")
 
37148
        (and:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)])
 
37149
                (match_op_dup 6 [(match_dup 4) (match_dup 5)])))]
 
37150
   "TARGET_32BIT"
 
37151
@@ -9754,7 +10908,7 @@
 
37152
 ;; need only zero the value if false (if true, then the value is already
 
37153
 ;; correct).
 
37154
 (define_insn_and_split "*and_scc_scc_nodom"
 
37155
-  [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r")
 
37156
+  [(set (match_operand:SI 0 "s_register_operand" "=&Ts,&Ts,&Ts")
 
37157
        (and:SI (match_operator:SI 3 "arm_comparison_operator"
 
37158
                 [(match_operand:SI 1 "s_register_operand" "r,r,0")
 
37159
                  (match_operand:SI 2 "arm_add_operand" "rIL,0,rIL")])
 
37160
@@ -9822,28 +10976,117 @@
 
37161
   "")
 
37162
 ;; ??? The conditional patterns above need checking for Thumb-2 usefulness
 
37163
 
 
37164
-(define_insn "*negscc"
 
37165
+(define_insn_and_split "*negscc"
 
37166
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37167
        (neg:SI (match_operator 3 "arm_comparison_operator"
 
37168
                 [(match_operand:SI 1 "s_register_operand" "r")
 
37169
                  (match_operand:SI 2 "arm_rhs_operand" "rI")])))
 
37170
    (clobber (reg:CC CC_REGNUM))]
 
37171
   "TARGET_ARM"
 
37172
-  "*
 
37173
-  if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
 
37174
-    return \"mov\\t%0, %1, asr #31\";
 
37175
+  "#"
 
37176
+  "&& reload_completed"
 
37177
+  [(const_int 0)]
 
37178
+  {
 
37179
+    rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
 
37180
 
 
37181
-  if (GET_CODE (operands[3]) == NE)
 
37182
-    return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\";
 
37183
+    if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
 
37184
+       {
 
37185
+         /* Emit mov\\t%0, %1, asr #31 */
 
37186
+         emit_insn (gen_rtx_SET (VOIDmode,
 
37187
+                                 operands[0],
 
37188
+                                 gen_rtx_ASHIFTRT (SImode,
 
37189
+                                                   operands[1],
 
37190
+                                                   GEN_INT (31))));
 
37191
+         DONE;
 
37192
+       }
 
37193
+     else if (GET_CODE (operands[3]) == NE)
 
37194
+       {
 
37195
+        /* Emit subs\\t%0, %1, %2\;mvnne\\t%0, #0 */
 
37196
+        if (CONST_INT_P (operands[2]))
 
37197
+          emit_insn (gen_cmpsi2_addneg (operands[0], operands[1], operands[2],
 
37198
+                                        GEN_INT (- INTVAL (operands[2]))));
 
37199
+        else
 
37200
+          emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2]));
 
37201
 
 
37202
-  output_asm_insn (\"cmp\\t%1, %2\", operands);
 
37203
-  output_asm_insn (\"mov%D3\\t%0, #0\", operands);
 
37204
-  return \"mvn%d3\\t%0, #0\";
 
37205
-  "
 
37206
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
37207
+                                      gen_rtx_NE (SImode,
 
37208
+                                                  cc_reg,
 
37209
+                                                  const0_rtx),
 
37210
+                                      gen_rtx_SET (SImode,
 
37211
+                                                   operands[0],
 
37212
+                                                   GEN_INT (~0))));
 
37213
+        DONE;
 
37214
+      }
 
37215
+    else
 
37216
+      {
 
37217
+        /* Emit: cmp\\t%1, %2\;mov%D3\\t%0, #0\;mvn%d3\\t%0, #0 */
 
37218
+        emit_insn (gen_rtx_SET (VOIDmode,
 
37219
+                                cc_reg,
 
37220
+                                gen_rtx_COMPARE (CCmode, operands[1], operands[2])));
 
37221
+        enum rtx_code rc = GET_CODE (operands[3]);
 
37222
+
 
37223
+        rc = reverse_condition (rc);
 
37224
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
37225
+                                      gen_rtx_fmt_ee (rc,
 
37226
+                                                      VOIDmode,
 
37227
+                                                      cc_reg,
 
37228
+                                                      const0_rtx),
 
37229
+                                      gen_rtx_SET (VOIDmode, operands[0], const0_rtx)));
 
37230
+        rc = GET_CODE (operands[3]);
 
37231
+        emit_insn (gen_rtx_COND_EXEC (VOIDmode,
 
37232
+                                      gen_rtx_fmt_ee (rc,
 
37233
+                                                      VOIDmode,
 
37234
+                                                      cc_reg,
 
37235
+                                                      const0_rtx),
 
37236
+                                      gen_rtx_SET (VOIDmode,
 
37237
+                                                   operands[0],
 
37238
+                                                   GEN_INT (~0))));
 
37239
+        DONE;
 
37240
+      }
 
37241
+     FAIL;
 
37242
+  }
 
37243
   [(set_attr "conds" "clob")
 
37244
    (set_attr "length" "12")]
 
37245
 )
 
37246
 
 
37247
+(define_insn_and_split "movcond_addsi"
 
37248
+  [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
 
37249
+       (if_then_else:SI
 
37250
+        (match_operator 5 "comparison_operator"
 
37251
+         [(plus:SI (match_operand:SI 3 "s_register_operand" "r,r,r")
 
37252
+                   (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL"))
 
37253
+            (const_int 0)])
 
37254
+        (match_operand:SI 1 "arm_rhs_operand" "rI,rPy,r")
 
37255
+        (match_operand:SI 2 "arm_rhs_operand" "rI,rPy,r")))
 
37256
+   (clobber (reg:CC CC_REGNUM))]
 
37257
+   "TARGET_32BIT"
 
37258
+   "#"
 
37259
+   "&& reload_completed"
 
37260
+  [(set (reg:CC_NOOV CC_REGNUM)
 
37261
+       (compare:CC_NOOV
 
37262
+        (plus:SI (match_dup 3)
 
37263
+                 (match_dup 4))
 
37264
+        (const_int 0)))
 
37265
+   (set (match_dup 0) (match_dup 1))
 
37266
+   (cond_exec (match_dup 6)
 
37267
+             (set (match_dup 0) (match_dup 2)))]
 
37268
+  "
 
37269
+  {
 
37270
+    enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[5]),
 
37271
+                                            operands[3], operands[4]);
 
37272
+    enum rtx_code rc = GET_CODE (operands[5]);
 
37273
+
 
37274
+    operands[6] = gen_rtx_REG (mode, CC_REGNUM);
 
37275
+    gcc_assert (!(mode == CCFPmode || mode == CCFPEmode));
 
37276
+    rc = reverse_condition (rc);
 
37277
+
 
37278
+    operands[6] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx);
 
37279
+  }
 
37280
+  "
 
37281
+  [(set_attr "conds" "clob")
 
37282
+   (set_attr "enabled_for_depr_it" "no,yes,yes")]
 
37283
+)
 
37284
+
 
37285
 (define_insn "movcond"
 
37286
   [(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
 
37287
        (if_then_else:SI
 
37288
@@ -9944,9 +11187,9 @@
 
37289
    (set_attr "length" "4,4,8,8")
 
37290
    (set_attr_alternative "type"
 
37291
                          [(if_then_else (match_operand 3 "const_int_operand" "")
 
37292
-                                        (const_string "simple_alu_imm" )
 
37293
+                                        (const_string "arlo_imm" )
 
37294
                                         (const_string "*"))
 
37295
-                          (const_string "simple_alu_imm")
 
37296
+                          (const_string "arlo_imm")
 
37297
                           (const_string "*")
 
37298
                           (const_string "*")])]
 
37299
 )
 
37300
@@ -9986,9 +11229,9 @@
 
37301
    (set_attr "length" "4,4,8,8")
 
37302
    (set_attr_alternative "type"
 
37303
                          [(if_then_else (match_operand 3 "const_int_operand" "")
 
37304
-                                        (const_string "simple_alu_imm" )
 
37305
+                                        (const_string "arlo_imm" )
 
37306
                                         (const_string "*"))
 
37307
-                          (const_string "simple_alu_imm")
 
37308
+                          (const_string "arlo_imm")
 
37309
                           (const_string "*")
 
37310
                           (const_string "*")])]
 
37311
 )
 
37312
@@ -10174,7 +11417,7 @@
 
37313
    mov%d4\\t%0, %1\;mvn%D4\\t%0, %2
 
37314
    mvn%d4\\t%0, #%B1\;mvn%D4\\t%0, %2"
 
37315
   [(set_attr "conds" "use")
 
37316
-   (set_attr "insn" "mvn")
 
37317
+   (set_attr "type" "mvn_reg")
 
37318
    (set_attr "length" "4,8,8")]
 
37319
 )
 
37320
 
 
37321
@@ -10207,7 +11450,7 @@
 
37322
    mov%D4\\t%0, %1\;mvn%d4\\t%0, %2
 
37323
    mvn%D4\\t%0, #%B1\;mvn%d4\\t%0, %2"
 
37324
   [(set_attr "conds" "use")
 
37325
-   (set_attr "insn" "mvn")
 
37326
+   (set_attr "type" "mvn_reg")
 
37327
    (set_attr "length" "4,8,8")]
 
37328
 )
 
37329
 
 
37330
@@ -10245,10 +11488,9 @@
 
37331
   [(set_attr "conds" "use")
 
37332
    (set_attr "shift" "2")
 
37333
    (set_attr "length" "4,8,8")
 
37334
-   (set_attr "insn" "mov")
 
37335
    (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
 
37336
-                     (const_string "alu_shift")
 
37337
-                     (const_string "alu_shift_reg")))]
 
37338
+                     (const_string "mov_shift")
 
37339
+                     (const_string "mov_shift_reg")))]
 
37340
 )
 
37341
 
 
37342
 (define_insn "*ifcompare_move_shift"
 
37343
@@ -10285,10 +11527,9 @@
 
37344
   [(set_attr "conds" "use")
 
37345
    (set_attr "shift" "2")
 
37346
    (set_attr "length" "4,8,8")
 
37347
-   (set_attr "insn" "mov")
 
37348
    (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "")
 
37349
-                     (const_string "alu_shift")
 
37350
-                     (const_string "alu_shift_reg")))]
 
37351
+                     (const_string "mov_shift")
 
37352
+                     (const_string "mov_shift_reg")))]
 
37353
 )
 
37354
 
 
37355
 (define_insn "*ifcompare_shift_shift"
 
37356
@@ -10326,12 +11567,11 @@
 
37357
   [(set_attr "conds" "use")
 
37358
    (set_attr "shift" "1")
 
37359
    (set_attr "length" "8")
 
37360
-   (set_attr "insn" "mov")
 
37361
    (set (attr "type") (if_then_else
 
37362
                        (and (match_operand 2 "const_int_operand" "")
 
37363
                              (match_operand 4 "const_int_operand" ""))
 
37364
-                     (const_string "alu_shift")
 
37365
-                     (const_string "alu_shift_reg")))]
 
37366
+                     (const_string "mov_shift")
 
37367
+                     (const_string "mov_shift_reg")))]
 
37368
 )
 
37369
 
 
37370
 (define_insn "*ifcompare_not_arith"
 
37371
@@ -10363,7 +11603,7 @@
 
37372
   "TARGET_ARM"
 
37373
   "mvn%d5\\t%0, %1\;%I6%D5\\t%0, %2, %3"
 
37374
   [(set_attr "conds" "use")
 
37375
-   (set_attr "insn" "mvn")
 
37376
+   (set_attr "type" "mvn_reg")
 
37377
    (set_attr "length" "8")]
 
37378
 )
 
37379
 
 
37380
@@ -10396,7 +11636,7 @@
 
37381
   "TARGET_ARM"
 
37382
   "mvn%D5\\t%0, %1\;%I6%d5\\t%0, %2, %3"
 
37383
   [(set_attr "conds" "use")
 
37384
-   (set_attr "insn" "mvn")
 
37385
+   (set_attr "type" "mvn_reg")
 
37386
    (set_attr "length" "8")]
 
37387
 )
 
37388
 
 
37389
@@ -10844,7 +12084,7 @@
 
37390
    mvn%D4\\t%0, %2
 
37391
    mov%d4\\t%0, %1\;mvn%D4\\t%0, %2"
 
37392
   [(set_attr "conds" "use")
 
37393
-   (set_attr "insn" "mvn")
 
37394
+   (set_attr "type" "mvn_reg")
 
37395
    (set_attr "length" "4,8")]
 
37396
 )
 
37397
 
 
37398
@@ -11239,7 +12479,7 @@
 
37399
   "TARGET_32BIT && arm_arch5"
 
37400
   "clz%?\\t%0, %1"
 
37401
   [(set_attr "predicable" "yes")
 
37402
-   (set_attr "insn" "clz")])
 
37403
+   (set_attr "type" "clz")])
 
37404
 
 
37405
 (define_insn "rbitsi2"
 
37406
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37407
@@ -11247,7 +12487,7 @@
 
37408
   "TARGET_32BIT && arm_arch_thumb2"
 
37409
   "rbit%?\\t%0, %1"
 
37410
   [(set_attr "predicable" "yes")
 
37411
-   (set_attr "insn" "clz")])
 
37412
+   (set_attr "type" "clz")])
 
37413
 
 
37414
 (define_expand "ctzsi2"
 
37415
  [(set (match_operand:SI           0 "s_register_operand" "")
 
37416
@@ -11280,6 +12520,7 @@
 
37417
      (const_int 0)])]
 
37418
   "TARGET_32BIT"
 
37419
   ""
 
37420
+[(set_attr "predicated" "yes")]
 
37421
 )
 
37422
 
 
37423
 (define_insn "force_register_use"
 
37424
@@ -11399,7 +12640,8 @@
 
37425
   "arm_arch_thumb2"
 
37426
   "movt%?\t%0, %L1"
 
37427
  [(set_attr "predicable" "yes")
 
37428
-   (set_attr "length" "4")]
 
37429
+  (set_attr "predicable_short_it" "no")
 
37430
+  (set_attr "length" "4")]
 
37431
 )
 
37432
 
 
37433
 (define_insn "*arm_rev"
 
37434
@@ -11550,7 +12792,8 @@
 
37435
                                   false, true))"
 
37436
   "ldrd%?\t%0, %3, [%1, %2]"
 
37437
   [(set_attr "type" "load2")
 
37438
-   (set_attr "predicable" "yes")])
 
37439
+   (set_attr "predicable" "yes")
 
37440
+   (set_attr "predicable_short_it" "no")])
 
37441
 
 
37442
 (define_insn "*thumb2_ldrd_base"
 
37443
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37444
@@ -11564,7 +12807,8 @@
 
37445
                                   operands[1], 0, false, true))"
 
37446
   "ldrd%?\t%0, %2, [%1]"
 
37447
   [(set_attr "type" "load2")
 
37448
-   (set_attr "predicable" "yes")])
 
37449
+   (set_attr "predicable" "yes")
 
37450
+   (set_attr "predicable_short_it" "no")])
 
37451
 
 
37452
 (define_insn "*thumb2_ldrd_base_neg"
 
37453
   [(set (match_operand:SI 0 "s_register_operand" "=r")
 
37454
@@ -11578,7 +12822,8 @@
 
37455
                                   operands[1], -4, false, true))"
 
37456
   "ldrd%?\t%0, %2, [%1, #-4]"
 
37457
   [(set_attr "type" "load2")
 
37458
-   (set_attr "predicable" "yes")])
 
37459
+   (set_attr "predicable" "yes")
 
37460
+   (set_attr "predicable_short_it" "no")])
 
37461
 
 
37462
 (define_insn "*thumb2_strd"
 
37463
   [(set (mem:SI (plus:SI (match_operand:SI 0 "s_register_operand" "rk")
 
37464
@@ -11595,7 +12840,8 @@
 
37465
                                   false, false))"
 
37466
   "strd%?\t%2, %4, [%0, %1]"
 
37467
   [(set_attr "type" "store2")
 
37468
-   (set_attr "predicable" "yes")])
 
37469
+   (set_attr "predicable" "yes")
 
37470
+   (set_attr "predicable_short_it" "no")])
 
37471
 
 
37472
 (define_insn "*thumb2_strd_base"
 
37473
   [(set (mem:SI (match_operand:SI 0 "s_register_operand" "rk"))
 
37474
@@ -11609,7 +12855,8 @@
 
37475
                                   operands[0], 0, false, false))"
 
37476
   "strd%?\t%1, %2, [%0]"
 
37477
   [(set_attr "type" "store2")
 
37478
-   (set_attr "predicable" "yes")])
 
37479
+   (set_attr "predicable" "yes")
 
37480
+   (set_attr "predicable_short_it" "no")])
 
37481
 
 
37482
 (define_insn "*thumb2_strd_base_neg"
 
37483
   [(set (mem:SI (plus:SI (match_operand:SI 0 "s_register_operand" "rk")
 
37484
@@ -11623,9 +12870,13 @@
 
37485
                                   operands[0], -4, false, false))"
 
37486
   "strd%?\t%1, %2, [%0, #-4]"
 
37487
   [(set_attr "type" "store2")
 
37488
-   (set_attr "predicable" "yes")])
 
37489
+   (set_attr "predicable" "yes")
 
37490
+   (set_attr "predicable_short_it" "no")])
 
37491
 
 
37492
 
 
37493
+;; Load the load/store double peephole optimizations.
 
37494
+(include "ldrdstrd.md")
 
37495
+
 
37496
 ;; Load the load/store multiple patterns
 
37497
 (include "ldmstm.md")
 
37498
 
 
37499
--- a/src/gcc/config/arm/fmp626.md
 
37500
+++ b/src/gcc/config/arm/fmp626.md
 
37501
@@ -63,12 +63,15 @@
 
37502
 ;; ALU operations
 
37503
 (define_insn_reservation "mp626_alu_op" 1
 
37504
  (and (eq_attr "tune" "fmp626")
 
37505
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
37506
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
37507
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
37508
  "fmp626_core")
 
37509
 
 
37510
 (define_insn_reservation "mp626_alu_shift_op" 2
 
37511
  (and (eq_attr "tune" "fmp626")
 
37512
-      (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg"))
 
37513
+      (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\
 
37514
+                       mov_shift,mov_shift_reg,\
 
37515
+                       mvn_shift,mvn_shift_reg"))
 
37516
  "fmp626_core")
 
37517
 
 
37518
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
37519
@@ -77,22 +80,22 @@
 
37520
 
 
37521
 (define_insn_reservation "mp626_mult1" 2
 
37522
  (and (eq_attr "tune" "fmp626")
 
37523
-      (eq_attr "insn" "smulwy,smlawy,smulxy,smlaxy"))
 
37524
+      (eq_attr "type" "smulwy,smlawy,smulxy,smlaxy"))
 
37525
  "fmp626_core")
 
37526
 
 
37527
 (define_insn_reservation "mp626_mult2" 2
 
37528
  (and (eq_attr "tune" "fmp626")
 
37529
-      (eq_attr "insn" "mul,mla"))
 
37530
+      (eq_attr "type" "mul,mla"))
 
37531
  "fmp626_core")
 
37532
 
 
37533
 (define_insn_reservation "mp626_mult3" 3
 
37534
  (and (eq_attr "tune" "fmp626")
 
37535
-      (eq_attr "insn" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx"))
 
37536
+      (eq_attr "type" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx"))
 
37537
  "fmp626_core*2")
 
37538
 
 
37539
 (define_insn_reservation "mp626_mult4" 4
 
37540
  (and (eq_attr "tune" "fmp626")
 
37541
-      (eq_attr "insn" "smulls,smlals,umulls,umlals"))
 
37542
+      (eq_attr "type" "smulls,smlals,umulls,umlals"))
 
37543
  "fmp626_core*3")
 
37544
 
 
37545
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
37546
--- a/src/gcc/config/arm/fa526.md
 
37547
+++ b/src/gcc/config/arm/fa526.md
 
37548
@@ -62,12 +62,15 @@
 
37549
 ;; ALU operations
 
37550
 (define_insn_reservation "526_alu_op" 1
 
37551
  (and (eq_attr "tune" "fa526")
 
37552
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
37553
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
37554
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
37555
  "fa526_core")
 
37556
 
 
37557
 (define_insn_reservation "526_alu_shift_op" 2
 
37558
  (and (eq_attr "tune" "fa526")
 
37559
-      (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg"))
 
37560
+      (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\
 
37561
+                       mov_shift,mov_shift_reg,\
 
37562
+                       mvn_shift,mvn_shift_reg"))
 
37563
  "fa526_core")
 
37564
 
 
37565
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
37566
@@ -76,12 +79,12 @@
 
37567
 
 
37568
 (define_insn_reservation "526_mult1" 2
 
37569
  (and (eq_attr "tune" "fa526")
 
37570
-      (eq_attr "insn" "smlalxy,smulxy,smlaxy,smlalxy"))
 
37571
+      (eq_attr "type" "smlalxy,smulxy,smlaxy,smlalxy"))
 
37572
  "fa526_core")
 
37573
 
 
37574
 (define_insn_reservation "526_mult2" 5
 
37575
  (and (eq_attr "tune" "fa526")
 
37576
-      (eq_attr "insn" "mul,mla,muls,mlas,umull,umlal,smull,smlal,umulls,\
 
37577
+      (eq_attr "type" "mul,mla,muls,mlas,umull,umlal,smull,smlal,umulls,\
 
37578
                        umlals,smulls,smlals,smlawx"))
 
37579
  "fa526_core*4")
 
37580
 
 
37581
--- a/src/gcc/config/arm/arm-generic.md
 
37582
+++ b/src/gcc/config/arm/arm-generic.md
 
37583
@@ -114,7 +114,9 @@
 
37584
 
 
37585
 (define_insn_reservation "mult" 16
 
37586
   (and (eq_attr "generic_sched" "yes")
 
37587
-       (and (eq_attr "ldsched" "no") (eq_attr "type" "mult")))
 
37588
+       (and (eq_attr "ldsched" "no")
 
37589
+           (ior (eq_attr "mul32" "yes")
 
37590
+                (eq_attr "mul64" "yes"))))
 
37591
   "core*16")
 
37592
 
 
37593
 (define_insn_reservation "mult_ldsched_strongarm" 3
 
37594
@@ -122,7 +124,8 @@
 
37595
        (and (eq_attr "ldsched" "yes") 
 
37596
            (and (eq_attr "tune"
 
37597
                  "strongarm,strongarm110,strongarm1100,strongarm1110")
 
37598
-                (eq_attr "type" "mult"))))
 
37599
+                (ior (eq_attr "mul32" "yes")
 
37600
+                     (eq_attr "mul64" "yes")))))
 
37601
   "core*2")
 
37602
 
 
37603
 (define_insn_reservation "mult_ldsched" 4
 
37604
@@ -130,13 +133,17 @@
 
37605
        (and (eq_attr "ldsched" "yes") 
 
37606
            (and (eq_attr "tune"
 
37607
                  "!strongarm,strongarm110,strongarm1100,strongarm1110")
 
37608
-                (eq_attr "type" "mult"))))
 
37609
+                (ior (eq_attr "mul32" "yes")
 
37610
+                     (eq_attr "mul64" "yes")))))
 
37611
   "core*4")
 
37612
 
 
37613
 (define_insn_reservation "multi_cycle" 32
 
37614
   (and (eq_attr "generic_sched" "yes")
 
37615
        (and (eq_attr "core_cycles" "multi")
 
37616
-            (eq_attr "type" "!mult,load_byte,load1,load2,load3,load4,store1,store2,store3,store4")))
 
37617
+            (and (eq_attr "type" "!load_byte,load1,load2,load3,load4,\
 
37618
+                                  store1,store2,store3,store4")
 
37619
+                (not (ior (eq_attr "mul32" "yes")
 
37620
+                          (eq_attr "mul64" "yes"))))))
 
37621
   "core*32")
 
37622
 
 
37623
 (define_insn_reservation "single_cycle" 1
 
37624
--- a/src/gcc/config/arm/iwmmxt2.md
 
37625
+++ b/src/gcc/config/arm/iwmmxt2.md
 
37626
@@ -24,7 +24,7 @@
 
37627
   "TARGET_REALLY_IWMMXT"
 
37628
   "wabs<MMX_char>%?\\t%0, %1"
 
37629
   [(set_attr "predicable" "yes")
 
37630
-   (set_attr "wtype" "wabs")]
 
37631
+   (set_attr "type" "wmmx_wabs")]
 
37632
 )
 
37633
 
 
37634
 (define_insn "iwmmxt_wabsdiffb"
 
37635
@@ -37,7 +37,7 @@
 
37636
  "TARGET_REALLY_IWMMXT"
 
37637
  "wabsdiffb%?\\t%0, %1, %2"
 
37638
  [(set_attr "predicable" "yes")
 
37639
-  (set_attr "wtype" "wabsdiff")]
 
37640
+  (set_attr "type" "wmmx_wabsdiff")]
 
37641
 )
 
37642
 
 
37643
 (define_insn "iwmmxt_wabsdiffh"
 
37644
@@ -50,7 +50,7 @@
 
37645
   "TARGET_REALLY_IWMMXT"
 
37646
   "wabsdiffh%?\\t%0, %1, %2"
 
37647
   [(set_attr "predicable" "yes")
 
37648
-   (set_attr "wtype" "wabsdiff")]
 
37649
+   (set_attr "type" "wmmx_wabsdiff")]
 
37650
 )
 
37651
 
 
37652
 (define_insn "iwmmxt_wabsdiffw"
 
37653
@@ -63,7 +63,7 @@
 
37654
  "TARGET_REALLY_IWMMXT"
 
37655
  "wabsdiffw%?\\t%0, %1, %2"
 
37656
  [(set_attr "predicable" "yes")
 
37657
-  (set_attr "wtype" "wabsdiff")]
 
37658
+  (set_attr "type" "wmmx_wabsdiff")]
 
37659
 )
 
37660
 
 
37661
 (define_insn "iwmmxt_waddsubhx"
 
37662
@@ -81,7 +81,7 @@
 
37663
   "TARGET_REALLY_IWMMXT"
 
37664
   "waddsubhx%?\\t%0, %1, %2"
 
37665
   [(set_attr "predicable" "yes")
 
37666
-   (set_attr "wtype" "waddsubhx")]
 
37667
+   (set_attr "type" "wmmx_waddsubhx")]
 
37668
 )
 
37669
 
 
37670
 (define_insn "iwmmxt_wsubaddhx"
 
37671
@@ -99,7 +99,7 @@
 
37672
   "TARGET_REALLY_IWMMXT"
 
37673
   "wsubaddhx%?\\t%0, %1, %2"
 
37674
   [(set_attr "predicable" "yes")
 
37675
-   (set_attr "wtype" "wsubaddhx")]
 
37676
+   (set_attr "type" "wmmx_wsubaddhx")]
 
37677
 )
 
37678
 
 
37679
 (define_insn "addc<mode>3"
 
37680
@@ -111,7 +111,7 @@
 
37681
   "TARGET_REALLY_IWMMXT"
 
37682
   "wadd<MMX_char>c%?\\t%0, %1, %2"
 
37683
   [(set_attr "predicable" "yes")
 
37684
-   (set_attr "wtype" "wadd")]
 
37685
+   (set_attr "type" "wmmx_wadd")]
 
37686
 )
 
37687
 
 
37688
 (define_insn "iwmmxt_avg4"
 
37689
@@ -143,7 +143,7 @@
 
37690
   "TARGET_REALLY_IWMMXT"
 
37691
   "wavg4%?\\t%0, %1, %2"
 
37692
   [(set_attr "predicable" "yes")
 
37693
-   (set_attr "wtype" "wavg4")]
 
37694
+   (set_attr "type" "wmmx_wavg4")]
 
37695
 )
 
37696
 
 
37697
 (define_insn "iwmmxt_avg4r"
 
37698
@@ -175,7 +175,7 @@
 
37699
   "TARGET_REALLY_IWMMXT"
 
37700
   "wavg4r%?\\t%0, %1, %2"
 
37701
   [(set_attr "predicable" "yes")
 
37702
-   (set_attr "wtype" "wavg4")]
 
37703
+   (set_attr "type" "wmmx_wavg4")]
 
37704
 )
 
37705
 
 
37706
 (define_insn "iwmmxt_wmaddsx"
 
37707
@@ -194,7 +194,7 @@
 
37708
  "TARGET_REALLY_IWMMXT"
 
37709
   "wmaddsx%?\\t%0, %1, %2"
 
37710
   [(set_attr "predicable" "yes")
 
37711
-       (set_attr "wtype" "wmadd")]
 
37712
+       (set_attr "type" "wmmx_wmadd")]
 
37713
 )
 
37714
 
 
37715
 (define_insn "iwmmxt_wmaddux"
 
37716
@@ -213,7 +213,7 @@
 
37717
   "TARGET_REALLY_IWMMXT"
 
37718
   "wmaddux%?\\t%0, %1, %2"
 
37719
   [(set_attr "predicable" "yes")
 
37720
-   (set_attr "wtype" "wmadd")]
 
37721
+   (set_attr "type" "wmmx_wmadd")]
 
37722
 )
 
37723
 
 
37724
 (define_insn "iwmmxt_wmaddsn"
 
37725
@@ -232,7 +232,7 @@
 
37726
  "TARGET_REALLY_IWMMXT"
 
37727
  "wmaddsn%?\\t%0, %1, %2"
 
37728
  [(set_attr "predicable" "yes")
 
37729
-  (set_attr "wtype" "wmadd")]
 
37730
+  (set_attr "type" "wmmx_wmadd")]
 
37731
 )
 
37732
 
 
37733
 (define_insn "iwmmxt_wmaddun"
 
37734
@@ -251,7 +251,7 @@
 
37735
   "TARGET_REALLY_IWMMXT"
 
37736
   "wmaddun%?\\t%0, %1, %2"
 
37737
   [(set_attr "predicable" "yes")
 
37738
-   (set_attr "wtype" "wmadd")]
 
37739
+   (set_attr "type" "wmmx_wmadd")]
 
37740
 )
 
37741
 
 
37742
 (define_insn "iwmmxt_wmulwsm"
 
37743
@@ -265,7 +265,7 @@
 
37744
   "TARGET_REALLY_IWMMXT"
 
37745
   "wmulwsm%?\\t%0, %1, %2"
 
37746
   [(set_attr "predicable" "yes")
 
37747
-   (set_attr "wtype" "wmulw")]
 
37748
+   (set_attr "type" "wmmx_wmulw")]
 
37749
 )
 
37750
 
 
37751
 (define_insn "iwmmxt_wmulwum"
 
37752
@@ -279,7 +279,7 @@
 
37753
   "TARGET_REALLY_IWMMXT"
 
37754
   "wmulwum%?\\t%0, %1, %2"
 
37755
   [(set_attr "predicable" "yes")
 
37756
-   (set_attr "wtype" "wmulw")]
 
37757
+   (set_attr "type" "wmmx_wmulw")]
 
37758
 )
 
37759
 
 
37760
 (define_insn "iwmmxt_wmulsmr"
 
37761
@@ -297,7 +297,7 @@
 
37762
   "TARGET_REALLY_IWMMXT"
 
37763
   "wmulsmr%?\\t%0, %1, %2"
 
37764
   [(set_attr "predicable" "yes")
 
37765
-   (set_attr "wtype" "wmul")]
 
37766
+   (set_attr "type" "wmmx_wmul")]
 
37767
 )
 
37768
 
 
37769
 (define_insn "iwmmxt_wmulumr"
 
37770
@@ -316,7 +316,7 @@
 
37771
   "TARGET_REALLY_IWMMXT"
 
37772
   "wmulumr%?\\t%0, %1, %2"
 
37773
   [(set_attr "predicable" "yes")
 
37774
-   (set_attr "wtype" "wmul")]
 
37775
+   (set_attr "type" "wmmx_wmul")]
 
37776
 )
 
37777
 
 
37778
 (define_insn "iwmmxt_wmulwsmr"
 
37779
@@ -333,7 +333,7 @@
 
37780
   "TARGET_REALLY_IWMMXT"
 
37781
   "wmulwsmr%?\\t%0, %1, %2"
 
37782
   [(set_attr "predicable" "yes")
 
37783
-   (set_attr "wtype" "wmul")]
 
37784
+   (set_attr "type" "wmmx_wmul")]
 
37785
 )
 
37786
 
 
37787
 (define_insn "iwmmxt_wmulwumr"
 
37788
@@ -350,7 +350,7 @@
 
37789
   "TARGET_REALLY_IWMMXT"
 
37790
   "wmulwumr%?\\t%0, %1, %2"
 
37791
   [(set_attr "predicable" "yes")
 
37792
-   (set_attr "wtype" "wmulw")]
 
37793
+   (set_attr "type" "wmmx_wmulw")]
 
37794
 )
 
37795
 
 
37796
 (define_insn "iwmmxt_wmulwl"
 
37797
@@ -361,7 +361,7 @@
 
37798
   "TARGET_REALLY_IWMMXT"
 
37799
   "wmulwl%?\\t%0, %1, %2"
 
37800
   [(set_attr "predicable" "yes")
 
37801
-   (set_attr "wtype" "wmulw")]
 
37802
+   (set_attr "type" "wmmx_wmulw")]
 
37803
 )
 
37804
 
 
37805
 (define_insn "iwmmxt_wqmulm"
 
37806
@@ -371,7 +371,7 @@
 
37807
   "TARGET_REALLY_IWMMXT"
 
37808
   "wqmulm%?\\t%0, %1, %2"
 
37809
   [(set_attr "predicable" "yes")
 
37810
-   (set_attr "wtype" "wqmulm")]
 
37811
+   (set_attr "type" "wmmx_wqmulm")]
 
37812
 )
 
37813
 
 
37814
 (define_insn "iwmmxt_wqmulwm"
 
37815
@@ -381,7 +381,7 @@
 
37816
   "TARGET_REALLY_IWMMXT"
 
37817
   "wqmulwm%?\\t%0, %1, %2"
 
37818
   [(set_attr "predicable" "yes")
 
37819
-   (set_attr "wtype" "wqmulwm")]
 
37820
+   (set_attr "type" "wmmx_wqmulwm")]
 
37821
 )
 
37822
 
 
37823
 (define_insn "iwmmxt_wqmulmr"
 
37824
@@ -391,7 +391,7 @@
 
37825
   "TARGET_REALLY_IWMMXT"
 
37826
   "wqmulmr%?\\t%0, %1, %2"
 
37827
   [(set_attr "predicable" "yes")
 
37828
-   (set_attr "wtype" "wqmulm")]
 
37829
+   (set_attr "type" "wmmx_wqmulm")]
 
37830
 )
 
37831
 
 
37832
 (define_insn "iwmmxt_wqmulwmr"
 
37833
@@ -401,7 +401,7 @@
 
37834
   "TARGET_REALLY_IWMMXT"
 
37835
   "wqmulwmr%?\\t%0, %1, %2"
 
37836
   [(set_attr "predicable" "yes")
 
37837
-   (set_attr "wtype" "wqmulwm")]
 
37838
+   (set_attr "type" "wmmx_wqmulwm")]
 
37839
 )
 
37840
 
 
37841
 (define_insn "iwmmxt_waddbhusm"
 
37842
@@ -417,7 +417,7 @@
 
37843
   "TARGET_REALLY_IWMMXT"
 
37844
   "waddbhusm%?\\t%0, %1, %2"
 
37845
   [(set_attr "predicable" "yes")
 
37846
-   (set_attr "wtype" "waddbhus")]
 
37847
+   (set_attr "type" "wmmx_waddbhus")]
 
37848
 )
 
37849
 
 
37850
 (define_insn "iwmmxt_waddbhusl"
 
37851
@@ -433,7 +433,7 @@
 
37852
   "TARGET_REALLY_IWMMXT"
 
37853
   "waddbhusl%?\\t%0, %1, %2"
 
37854
   [(set_attr "predicable" "yes")
 
37855
-   (set_attr "wtype" "waddbhus")]
 
37856
+   (set_attr "type" "wmmx_waddbhus")]
 
37857
 )
 
37858
 
 
37859
 (define_insn "iwmmxt_wqmiabb"
 
37860
@@ -446,7 +446,7 @@
 
37861
   "TARGET_REALLY_IWMMXT"
 
37862
   "wqmiabb%?\\t%0, %2, %3"
 
37863
   [(set_attr "predicable" "yes")
 
37864
-   (set_attr "wtype" "wqmiaxy")]
 
37865
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37866
 )
 
37867
 
 
37868
 (define_insn "iwmmxt_wqmiabt"
 
37869
@@ -459,7 +459,7 @@
 
37870
   "TARGET_REALLY_IWMMXT"
 
37871
   "wqmiabt%?\\t%0, %2, %3"
 
37872
   [(set_attr "predicable" "yes")
 
37873
-   (set_attr "wtype" "wqmiaxy")]
 
37874
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37875
 )
 
37876
 
 
37877
 (define_insn "iwmmxt_wqmiatb"
 
37878
@@ -472,7 +472,7 @@
 
37879
   "TARGET_REALLY_IWMMXT"
 
37880
   "wqmiatb%?\\t%0, %2, %3"
 
37881
   [(set_attr "predicable" "yes")
 
37882
-   (set_attr "wtype" "wqmiaxy")]
 
37883
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37884
 )
 
37885
 
 
37886
 (define_insn "iwmmxt_wqmiatt"
 
37887
@@ -485,7 +485,7 @@
 
37888
   "TARGET_REALLY_IWMMXT"
 
37889
   "wqmiatt%?\\t%0, %2, %3"
 
37890
   [(set_attr "predicable" "yes")
 
37891
-   (set_attr "wtype" "wqmiaxy")]
 
37892
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37893
 )
 
37894
 
 
37895
 (define_insn "iwmmxt_wqmiabbn"
 
37896
@@ -498,7 +498,7 @@
 
37897
   "TARGET_REALLY_IWMMXT"
 
37898
   "wqmiabbn%?\\t%0, %2, %3"
 
37899
   [(set_attr "predicable" "yes")
 
37900
-   (set_attr "wtype" "wqmiaxy")]
 
37901
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37902
 )
 
37903
 
 
37904
 (define_insn "iwmmxt_wqmiabtn"
 
37905
@@ -511,7 +511,7 @@
 
37906
   "TARGET_REALLY_IWMMXT"
 
37907
   "wqmiabtn%?\\t%0, %2, %3"
 
37908
   [(set_attr "predicable" "yes")
 
37909
-   (set_attr "wtype" "wqmiaxy")]
 
37910
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37911
 )
 
37912
 
 
37913
 (define_insn "iwmmxt_wqmiatbn"
 
37914
@@ -524,7 +524,7 @@
 
37915
   "TARGET_REALLY_IWMMXT"
 
37916
   "wqmiatbn%?\\t%0, %2, %3"
 
37917
   [(set_attr "predicable" "yes")
 
37918
-   (set_attr "wtype" "wqmiaxy")]
 
37919
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37920
 )
 
37921
 
 
37922
 (define_insn "iwmmxt_wqmiattn"
 
37923
@@ -537,7 +537,7 @@
 
37924
   "TARGET_REALLY_IWMMXT"
 
37925
   "wqmiattn%?\\t%0, %2, %3"
 
37926
   [(set_attr "predicable" "yes")
 
37927
-   (set_attr "wtype" "wqmiaxy")]
 
37928
+   (set_attr "type" "wmmx_wqmiaxy")]
 
37929
 )
 
37930
 
 
37931
 (define_insn "iwmmxt_wmiabb"
 
37932
@@ -561,7 +561,7 @@
 
37933
   "TARGET_REALLY_IWMMXT"
 
37934
   "wmiabb%?\\t%0, %2, %3"
 
37935
   [(set_attr "predicable" "yes")
 
37936
-   (set_attr "wtype" "wmiaxy")]
 
37937
+   (set_attr "type" "wmmx_wmiaxy")]
 
37938
 )
 
37939
 
 
37940
 (define_insn "iwmmxt_wmiabt"
 
37941
@@ -585,7 +585,7 @@
 
37942
   "TARGET_REALLY_IWMMXT"
 
37943
   "wmiabt%?\\t%0, %2, %3"
 
37944
   [(set_attr "predicable" "yes")
 
37945
-   (set_attr "wtype" "wmiaxy")]
 
37946
+   (set_attr "type" "wmmx_wmiaxy")]
 
37947
 )
 
37948
 
 
37949
 (define_insn "iwmmxt_wmiatb"
 
37950
@@ -609,7 +609,7 @@
 
37951
   "TARGET_REALLY_IWMMXT"
 
37952
   "wmiatb%?\\t%0, %2, %3"
 
37953
   [(set_attr "predicable" "yes")
 
37954
-   (set_attr "wtype" "wmiaxy")]
 
37955
+   (set_attr "type" "wmmx_wmiaxy")]
 
37956
 )
 
37957
 
 
37958
 (define_insn "iwmmxt_wmiatt"
 
37959
@@ -633,7 +633,7 @@
 
37960
   "TARGET_REALLY_IWMMXT"
 
37961
   "wmiatt%?\\t%0, %2, %3"
 
37962
   [(set_attr "predicable" "yes")
 
37963
-   (set_attr "wtype" "wmiaxy")]
 
37964
+   (set_attr "type" "wmmx_wmiaxy")]
 
37965
 )
 
37966
 
 
37967
 (define_insn "iwmmxt_wmiabbn"
 
37968
@@ -657,7 +657,7 @@
 
37969
   "TARGET_REALLY_IWMMXT"
 
37970
   "wmiabbn%?\\t%0, %2, %3"
 
37971
   [(set_attr "predicable" "yes")
 
37972
-   (set_attr "wtype" "wmiaxy")]
 
37973
+   (set_attr "type" "wmmx_wmiaxy")]
 
37974
 )
 
37975
 
 
37976
 (define_insn "iwmmxt_wmiabtn"
 
37977
@@ -681,7 +681,7 @@
 
37978
   "TARGET_REALLY_IWMMXT"
 
37979
   "wmiabtn%?\\t%0, %2, %3"
 
37980
   [(set_attr "predicable" "yes")
 
37981
-   (set_attr "wtype" "wmiaxy")]
 
37982
+   (set_attr "type" "wmmx_wmiaxy")]
 
37983
 )
 
37984
 
 
37985
 (define_insn "iwmmxt_wmiatbn"
 
37986
@@ -705,7 +705,7 @@
 
37987
   "TARGET_REALLY_IWMMXT"
 
37988
   "wmiatbn%?\\t%0, %2, %3"
 
37989
   [(set_attr "predicable" "yes")
 
37990
-   (set_attr "wtype" "wmiaxy")]
 
37991
+   (set_attr "type" "wmmx_wmiaxy")]
 
37992
 )
 
37993
 
 
37994
 (define_insn "iwmmxt_wmiattn"
 
37995
@@ -729,7 +729,7 @@
 
37996
   "TARGET_REALLY_IWMMXT"
 
37997
   "wmiattn%?\\t%0, %2, %3"
 
37998
   [(set_attr "predicable" "yes")
 
37999
-   (set_attr "wtype" "wmiaxy")]
 
38000
+   (set_attr "type" "wmmx_wmiaxy")]
 
38001
 )
 
38002
 
 
38003
 (define_insn "iwmmxt_wmiawbb"
 
38004
@@ -742,7 +742,7 @@
 
38005
   "TARGET_REALLY_IWMMXT"
 
38006
   "wmiawbb%?\\t%0, %2, %3"
 
38007
   [(set_attr "predicable" "yes")
 
38008
-   (set_attr "wtype" "wmiawxy")]
 
38009
+   (set_attr "type" "wmmx_wmiawxy")]
 
38010
 )
 
38011
 
 
38012
 (define_insn "iwmmxt_wmiawbt"
 
38013
@@ -755,7 +755,7 @@
 
38014
   "TARGET_REALLY_IWMMXT"
 
38015
   "wmiawbt%?\\t%0, %2, %3"
 
38016
   [(set_attr "predicable" "yes")
 
38017
-   (set_attr "wtype" "wmiawxy")]
 
38018
+   (set_attr "type" "wmmx_wmiawxy")]
 
38019
 )
 
38020
 
 
38021
 (define_insn "iwmmxt_wmiawtb"
 
38022
@@ -768,7 +768,7 @@
 
38023
   "TARGET_REALLY_IWMMXT"
 
38024
   "wmiawtb%?\\t%0, %2, %3"
 
38025
   [(set_attr "predicable" "yes")
 
38026
-   (set_attr "wtype" "wmiawxy")]
 
38027
+   (set_attr "type" "wmmx_wmiawxy")]
 
38028
 )
 
38029
 
 
38030
 (define_insn "iwmmxt_wmiawtt"
 
38031
@@ -781,7 +781,7 @@
 
38032
   "TARGET_REALLY_IWMMXT"
 
38033
   "wmiawtt%?\\t%0, %2, %3"
 
38034
   [(set_attr "predicable" "yes")
 
38035
-   (set_attr "wtype" "wmiawxy")]
 
38036
+   (set_attr "type" "wmmx_wmiawxy")]
 
38037
 )
 
38038
 
 
38039
 (define_insn "iwmmxt_wmiawbbn"
 
38040
@@ -794,7 +794,7 @@
 
38041
   "TARGET_REALLY_IWMMXT"
 
38042
   "wmiawbbn%?\\t%0, %2, %3"
 
38043
   [(set_attr "predicable" "yes")
 
38044
-   (set_attr "wtype" "wmiawxy")]
 
38045
+   (set_attr "type" "wmmx_wmiawxy")]
 
38046
 )
 
38047
 
 
38048
 (define_insn "iwmmxt_wmiawbtn"
 
38049
@@ -807,7 +807,7 @@
 
38050
   "TARGET_REALLY_IWMMXT"
 
38051
   "wmiawbtn%?\\t%0, %2, %3"
 
38052
   [(set_attr "predicable" "yes")
 
38053
-   (set_attr "wtype" "wmiawxy")]
 
38054
+   (set_attr "type" "wmmx_wmiawxy")]
 
38055
 )
 
38056
 
 
38057
 (define_insn "iwmmxt_wmiawtbn"
 
38058
@@ -820,7 +820,7 @@
 
38059
   "TARGET_REALLY_IWMMXT"
 
38060
   "wmiawtbn%?\\t%0, %2, %3"
 
38061
   [(set_attr "predicable" "yes")
 
38062
-   (set_attr "wtype" "wmiawxy")]
 
38063
+   (set_attr "type" "wmmx_wmiawxy")]
 
38064
 )
 
38065
 
 
38066
 (define_insn "iwmmxt_wmiawttn"
 
38067
@@ -833,7 +833,7 @@
 
38068
   "TARGET_REALLY_IWMMXT"
 
38069
   "wmiawttn%?\\t%0, %2, %3"
 
38070
   [(set_attr "predicable" "yes")
 
38071
-   (set_attr "wtype" "wmiawxy")]
 
38072
+   (set_attr "type" "wmmx_wmiawxy")]
 
38073
 )
 
38074
 
 
38075
 (define_insn "iwmmxt_wmerge"
 
38076
@@ -858,7 +858,7 @@
 
38077
   "TARGET_REALLY_IWMMXT"
 
38078
   "wmerge%?\\t%0, %1, %2, %3"
 
38079
   [(set_attr "predicable" "yes")
 
38080
-   (set_attr "wtype" "wmerge")]
 
38081
+   (set_attr "type" "wmmx_wmerge")]
 
38082
 )
 
38083
 
 
38084
 (define_insn "iwmmxt_tandc<mode>3"
 
38085
@@ -868,7 +868,7 @@
 
38086
   "TARGET_REALLY_IWMMXT"
 
38087
   "tandc<MMX_char>%?\\t r15"
 
38088
   [(set_attr "predicable" "yes")
 
38089
-   (set_attr "wtype" "tandc")]
 
38090
+   (set_attr "type" "wmmx_tandc")]
 
38091
 )
 
38092
 
 
38093
 (define_insn "iwmmxt_torc<mode>3"
 
38094
@@ -878,7 +878,7 @@
 
38095
   "TARGET_REALLY_IWMMXT"
 
38096
   "torc<MMX_char>%?\\t r15"
 
38097
   [(set_attr "predicable" "yes")
 
38098
-   (set_attr "wtype" "torc")]
 
38099
+   (set_attr "type" "wmmx_torc")]
 
38100
 )
 
38101
 
 
38102
 (define_insn "iwmmxt_torvsc<mode>3"
 
38103
@@ -888,7 +888,7 @@
 
38104
   "TARGET_REALLY_IWMMXT"
 
38105
   "torvsc<MMX_char>%?\\t r15"
 
38106
   [(set_attr "predicable" "yes")
 
38107
-   (set_attr "wtype" "torvsc")]
 
38108
+   (set_attr "type" "wmmx_torvsc")]
 
38109
 )
 
38110
 
 
38111
 (define_insn "iwmmxt_textrc<mode>3"
 
38112
@@ -899,5 +899,5 @@
 
38113
   "TARGET_REALLY_IWMMXT"
 
38114
   "textrc<MMX_char>%?\\t r15, %0"
 
38115
   [(set_attr "predicable" "yes")
 
38116
-   (set_attr "wtype" "textrc")]
 
38117
+   (set_attr "type" "wmmx_textrc")]
 
38118
 )
 
38119
--- a/src/gcc/config/arm/cortex-a5.md
 
38120
+++ b/src/gcc/config/arm/cortex-a5.md
 
38121
@@ -58,12 +58,15 @@
 
38122
 
 
38123
 (define_insn_reservation "cortex_a5_alu" 2
 
38124
   (and (eq_attr "tune" "cortexa5")
 
38125
-       (eq_attr "type" "alu_reg,simple_alu_imm"))
 
38126
+       (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
38127
+                        mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
38128
   "cortex_a5_ex1")
 
38129
 
 
38130
 (define_insn_reservation "cortex_a5_alu_shift" 2
 
38131
   (and (eq_attr "tune" "cortexa5")
 
38132
-       (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg"))
 
38133
+       (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\
 
38134
+                        mov_shift,mov_shift_reg,\
 
38135
+                        mvn_shift,mvn_shift_reg"))
 
38136
   "cortex_a5_ex1")
 
38137
 
 
38138
 ;; Forwarding path for unshifted operands.
 
38139
@@ -80,7 +83,8 @@
 
38140
 
 
38141
 (define_insn_reservation "cortex_a5_mul" 2
 
38142
   (and (eq_attr "tune" "cortexa5")
 
38143
-       (eq_attr "type" "mult"))
 
38144
+       (ior (eq_attr "mul32" "yes")
 
38145
+           (eq_attr "mul64" "yes")))
 
38146
   "cortex_a5_ex1")
 
38147
 
 
38148
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
38149
--- a/src/gcc/config/arm/fa606te.md
 
38150
+++ b/src/gcc/config/arm/fa606te.md
 
38151
@@ -62,7 +62,10 @@
 
38152
 ;; ALU operations
 
38153
 (define_insn_reservation "606te_alu_op" 1
 
38154
  (and (eq_attr "tune" "fa606te")
 
38155
-      (eq_attr "type" "alu_reg,simple_alu_imm,simple_alu_shift,alu_shift,alu_shift_reg"))
 
38156
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,
 
38157
+                       extend,arlo_shift,arlo_shift_reg,\
 
38158
+                       mov_imm,mov_reg,mov_shift,mov_shift_reg,\
 
38159
+                       mvn_imm,mvn_reg,mvn_shift,mvn_shift_reg"))
 
38160
  "fa606te_core")
 
38161
 
 
38162
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
38163
@@ -71,22 +74,22 @@
 
38164
 
 
38165
 (define_insn_reservation "606te_mult1" 2
 
38166
  (and (eq_attr "tune" "fa606te")
 
38167
-      (eq_attr "insn" "smlalxy"))
 
38168
+      (eq_attr "type" "smlalxy"))
 
38169
  "fa606te_core")
 
38170
 
 
38171
 (define_insn_reservation "606te_mult2" 3
 
38172
  (and (eq_attr "tune" "fa606te")
 
38173
-      (eq_attr "insn" "smlaxy,smulxy,smulwy,smlawy"))
 
38174
+      (eq_attr "type" "smlaxy,smulxy,smulwy,smlawy"))
 
38175
  "fa606te_core*2")
 
38176
 
 
38177
 (define_insn_reservation "606te_mult3" 4
 
38178
  (and (eq_attr "tune" "fa606te")
 
38179
-      (eq_attr "insn" "mul,mla,muls,mlas"))
 
38180
+      (eq_attr "type" "mul,mla,muls,mlas"))
 
38181
  "fa606te_core*3")
 
38182
 
 
38183
 (define_insn_reservation "606te_mult4" 5
 
38184
  (and (eq_attr "tune" "fa606te")
 
38185
-      (eq_attr "insn" "umull,umlal,smull,smlal,umulls,umlals,smulls,smlals"))
 
38186
+      (eq_attr "type" "umull,umlal,smull,smlal,umulls,umlals,smulls,smlals"))
 
38187
  "fa606te_core*4")
 
38188
 
 
38189
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
38190
--- a/src/gcc/config/arm/cortex-a9.md
 
38191
+++ b/src/gcc/config/arm/cortex-a9.md
 
38192
@@ -80,18 +80,17 @@
 
38193
 ;; which can go down E2 without any problem.
 
38194
 (define_insn_reservation "cortex_a9_dp" 2
 
38195
   (and (eq_attr "tune" "cortexa9")
 
38196
-         (ior (and (eq_attr "type" "alu_reg,simple_alu_imm")
 
38197
-                        (eq_attr "neon_type" "none"))
 
38198
-             (and (and (eq_attr "type" "alu_shift_reg, simple_alu_shift,alu_shift")
 
38199
-                       (eq_attr "insn" "mov"))
 
38200
-                 (eq_attr "neon_type" "none"))))
 
38201
+       (and (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
38202
+                             mov_imm,mov_reg,mvn_imm,mvn_reg,\
 
38203
+                             mov_shift_reg,mov_shift")
 
38204
+            (eq_attr "neon_type" "none")))
 
38205
   "cortex_a9_p0_default|cortex_a9_p1_default")
 
38206
 
 
38207
 ;; An instruction using the shifter will go down E1.
 
38208
 (define_insn_reservation "cortex_a9_dp_shift" 3
 
38209
    (and (eq_attr "tune" "cortexa9")
 
38210
-       (and (eq_attr "type" "alu_shift_reg, simple_alu_shift,alu_shift")
 
38211
-            (not (eq_attr "insn" "mov"))))
 
38212
+        (eq_attr "type" "arlo_shift_reg,extend,arlo_shift,\
 
38213
+                         mvn_shift,mvn_shift_reg"))
 
38214
    "cortex_a9_p0_shift | cortex_a9_p1_shift")
 
38215
 
 
38216
 ;; Loads have a latency of 4 cycles.
 
38217
@@ -130,29 +129,29 @@
 
38218
 ;; We get 16*16 multiply / mac results in 3 cycles.
 
38219
 (define_insn_reservation "cortex_a9_mult16" 3
 
38220
   (and (eq_attr "tune" "cortexa9")
 
38221
-       (eq_attr "insn" "smulxy"))
 
38222
+       (eq_attr "type" "smulxy"))
 
38223
        "cortex_a9_mult16")
 
38224
 
 
38225
 ;; The 16*16 mac is slightly different that it
 
38226
 ;; reserves M1 and M2 in the same cycle.
 
38227
 (define_insn_reservation "cortex_a9_mac16" 3
 
38228
   (and (eq_attr "tune" "cortexa9")
 
38229
-       (eq_attr "insn" "smlaxy"))
 
38230
+       (eq_attr "type" "smlaxy"))
 
38231
   "cortex_a9_mac16")
 
38232
 
 
38233
 (define_insn_reservation "cortex_a9_multiply" 4
 
38234
   (and (eq_attr "tune" "cortexa9")
 
38235
-       (eq_attr "insn" "mul,smmul,smmulr"))
 
38236
+       (eq_attr "type" "mul,smmul,smmulr"))
 
38237
        "cortex_a9_mult")
 
38238
 
 
38239
 (define_insn_reservation "cortex_a9_mac" 4
 
38240
   (and (eq_attr "tune" "cortexa9")
 
38241
-       (eq_attr "insn" "mla,smmla"))
 
38242
+       (eq_attr "type" "mla,smmla"))
 
38243
        "cortex_a9_mac")
 
38244
 
 
38245
 (define_insn_reservation "cortex_a9_multiply_long" 5
 
38246
   (and (eq_attr "tune" "cortexa9")
 
38247
-       (eq_attr "insn" "smull,umull,smulls,umulls,smlal,smlals,umlal,umlals"))
 
38248
+       (eq_attr "type" "smull,umull,smulls,umulls,smlal,smlals,umlal,umlals"))
 
38249
        "cortex_a9_mult_long")
 
38250
 
 
38251
 ;; An instruction with a result in E2 can be forwarded
 
38252
--- a/src/gcc/config/arm/fa626te.md
 
38253
+++ b/src/gcc/config/arm/fa626te.md
 
38254
@@ -68,12 +68,15 @@
 
38255
 ;; ALU operations
 
38256
 (define_insn_reservation "626te_alu_op" 1
 
38257
  (and (eq_attr "tune" "fa626,fa626te")
 
38258
-      (eq_attr "type" "alu_reg,simple_alu_imm"))
 
38259
+      (eq_attr "type" "arlo_imm,arlo_reg,shift,shift_reg,\
 
38260
+                       mov_imm,mov_reg,mvn_imm,mvn_reg"))
 
38261
  "fa626te_core")
 
38262
 
 
38263
 (define_insn_reservation "626te_alu_shift_op" 2
 
38264
  (and (eq_attr "tune" "fa626,fa626te")
 
38265
-      (eq_attr "type" "simple_alu_shift,alu_shift,alu_shift_reg"))
 
38266
+      (eq_attr "type" "extend,arlo_shift,arlo_shift_reg,\
 
38267
+                       mov_shift,mov_shift_reg,\
 
38268
+                       mvn_shift,mvn_shift_reg"))
 
38269
  "fa626te_core")
 
38270
 
 
38271
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
38272
@@ -82,22 +85,22 @@
 
38273
 
 
38274
 (define_insn_reservation "626te_mult1" 2
 
38275
  (and (eq_attr "tune" "fa626,fa626te")
 
38276
-      (eq_attr "insn" "smulwy,smlawy,smulxy,smlaxy"))
 
38277
+      (eq_attr "type" "smulwy,smlawy,smulxy,smlaxy"))
 
38278
  "fa626te_core")
 
38279
 
 
38280
 (define_insn_reservation "626te_mult2" 2
 
38281
  (and (eq_attr "tune" "fa626,fa626te")
 
38282
-      (eq_attr "insn" "mul,mla"))
 
38283
+      (eq_attr "type" "mul,mla"))
 
38284
  "fa626te_core")
 
38285
 
 
38286
 (define_insn_reservation "626te_mult3" 3
 
38287
  (and (eq_attr "tune" "fa626,fa626te")
 
38288
-      (eq_attr "insn" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx"))
 
38289
+      (eq_attr "type" "muls,mlas,smull,smlal,umull,umlal,smlalxy,smlawx"))
 
38290
  "fa626te_core*2")
 
38291
 
 
38292
 (define_insn_reservation "626te_mult4" 4
 
38293
  (and (eq_attr "tune" "fa626,fa626te")
 
38294
-      (eq_attr "insn" "smulls,smlals,umulls,umlals"))
 
38295
+      (eq_attr "type" "smulls,smlals,umulls,umlals"))
 
38296
  "fa626te_core*3")
 
38297
 
 
38298
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
38299
--- a/src/gcc/config/arm/neon-gen.ml
 
38300
+++ b/src/gcc/config/arm/neon-gen.ml
 
38301
@@ -121,6 +121,7 @@
 
38302
   | T_uint16 | T_int16 -> T_intHI
 
38303
   | T_uint32 | T_int32 -> T_intSI
 
38304
   | T_uint64 | T_int64 -> T_intDI
 
38305
+  | T_float16 -> T_floatHF
 
38306
   | T_float32 -> T_floatSF
 
38307
   | T_poly8 -> T_intQI
 
38308
   | T_poly16 -> T_intHI
 
38309
@@ -275,8 +276,8 @@
 
38310
     let mode = mode_of_elt elttype shape in
 
38311
     string_of_mode mode
 
38312
   with MixedMode (dst, src) ->
 
38313
-    let dstmode = mode_of_elt dst shape
 
38314
-    and srcmode = mode_of_elt src shape in
 
38315
+    let dstmode = mode_of_elt ~argpos:0 dst shape
 
38316
+    and srcmode = mode_of_elt ~argpos:1 src shape in
 
38317
     string_of_mode dstmode ^ string_of_mode srcmode
 
38318
 
 
38319
 let get_shuffle features =
 
38320
@@ -291,19 +292,24 @@
 
38321
     match List.find (fun feature ->
 
38322
                        match feature with Requires_feature _ -> true
 
38323
                                         | Requires_arch _ -> true
 
38324
+                                        | Requires_FP_bit _ -> true
 
38325
                                         | _ -> false)
 
38326
                      features with
 
38327
-      Requires_feature feature -> 
 
38328
+      Requires_feature feature ->
 
38329
         Format.printf "#ifdef __ARM_FEATURE_%s@\n" feature
 
38330
     | Requires_arch arch ->
 
38331
         Format.printf "#if __ARM_ARCH >= %d@\n" arch
 
38332
+    | Requires_FP_bit bit ->
 
38333
+        Format.printf "#if ((__ARM_FP & 0x%X) != 0)@\n"
 
38334
+                      (1 lsl bit)
 
38335
     | _ -> assert false
 
38336
   with Not_found -> assert true
 
38337
 
 
38338
 let print_feature_test_end features =
 
38339
   let feature =
 
38340
-    List.exists (function Requires_feature x -> true
 
38341
-                          | Requires_arch x -> true
 
38342
+    List.exists (function Requires_feature _ -> true
 
38343
+                          | Requires_arch _ -> true
 
38344
+                          | Requires_FP_bit _ -> true
 
38345
                           |  _ -> false) features in
 
38346
   if feature then Format.printf "#endif@\n"
 
38347
 
 
38348
@@ -365,6 +371,7 @@
 
38349
     "__builtin_neon_hi", "int", 16, 4;
 
38350
     "__builtin_neon_si", "int", 32, 2;
 
38351
     "__builtin_neon_di", "int", 64, 1;
 
38352
+    "__builtin_neon_hf", "float", 16, 4;
 
38353
     "__builtin_neon_sf", "float", 32, 2;
 
38354
     "__builtin_neon_poly8", "poly", 8, 8;
 
38355
     "__builtin_neon_poly16", "poly", 16, 4;
 
38356
--- a/src/gcc/config/mips/linux-common.h
 
38357
+++ b/src/gcc/config/mips/linux-common.h
 
38358
@@ -44,7 +44,7 @@
 
38359
 #undef  LIB_SPEC
 
38360
 #define LIB_SPEC                                                       \
 
38361
   LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC,                       \
 
38362
-                      GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
 
38363
+                   GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
 
38364
 
 
38365
 #undef  STARTFILE_SPEC
 
38366
 #define STARTFILE_SPEC                                                 \
 
38367
--- a/src/libobjc/ChangeLog.linaro
 
38368
+++ b/src/libobjc/ChangeLog.linaro
 
38369
@@ -0,0 +1,27 @@
 
38370
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38371
+
 
38372
+        GCC Linaro 4.8-2013.09 released.
 
38373
+
 
38374
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38375
+
 
38376
+       GCC Linaro 4.8-2013.08 released.
 
38377
+
 
38378
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38379
+
 
38380
+        GCC Linaro 4.8-2013.07-1 released.
 
38381
+
 
38382
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38383
+
 
38384
+       GCC Linaro 4.8-2013.07 released.
 
38385
+
 
38386
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38387
+
 
38388
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38389
+
 
38390
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38391
+
 
38392
+       GCC Linaro 4.8-2013.05 released.
 
38393
+
 
38394
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38395
+
 
38396
+       * GCC Linaro 4.8-2013.04 released.
 
38397
--- a/src/libgfortran/ChangeLog.linaro
 
38398
+++ b/src/libgfortran/ChangeLog.linaro
 
38399
@@ -0,0 +1,27 @@
 
38400
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38401
+
 
38402
+        GCC Linaro 4.8-2013.09 released.
 
38403
+
 
38404
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38405
+
 
38406
+       GCC Linaro 4.8-2013.08 released.
 
38407
+
 
38408
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38409
+
 
38410
+        GCC Linaro 4.8-2013.07-1 released.
 
38411
+
 
38412
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38413
+
 
38414
+       GCC Linaro 4.8-2013.07 released.
 
38415
+
 
38416
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38417
+
 
38418
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38419
+
 
38420
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38421
+
 
38422
+       GCC Linaro 4.8-2013.05 released.
 
38423
+
 
38424
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38425
+
 
38426
+       * GCC Linaro 4.8-2013.04 released.
 
38427
--- a/src/libada/ChangeLog.linaro
 
38428
+++ b/src/libada/ChangeLog.linaro
 
38429
@@ -0,0 +1,27 @@
 
38430
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38431
+
 
38432
+        GCC Linaro 4.8-2013.09 released.
 
38433
+
 
38434
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38435
+
 
38436
+       GCC Linaro 4.8-2013.08 released.
 
38437
+
 
38438
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38439
+
 
38440
+        GCC Linaro 4.8-2013.07-1 released.
 
38441
+
 
38442
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38443
+
 
38444
+       GCC Linaro 4.8-2013.07 released.
 
38445
+
 
38446
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38447
+
 
38448
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38449
+
 
38450
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38451
+
 
38452
+       GCC Linaro 4.8-2013.05 released.
 
38453
+
 
38454
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38455
+
 
38456
+       * GCC Linaro 4.8-2013.04 released.
 
38457
--- a/src/libffi/ChangeLog.linaro
 
38458
+++ b/src/libffi/ChangeLog.linaro
 
38459
@@ -0,0 +1,27 @@
 
38460
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38461
+
 
38462
+        GCC Linaro 4.8-2013.09 released.
 
38463
+
 
38464
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38465
+
 
38466
+       GCC Linaro 4.8-2013.08 released.
 
38467
+
 
38468
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38469
+
 
38470
+        GCC Linaro 4.8-2013.07-1 released.
 
38471
+
 
38472
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38473
+
 
38474
+       GCC Linaro 4.8-2013.07 released.
 
38475
+
 
38476
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38477
+
 
38478
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38479
+
 
38480
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38481
+
 
38482
+       GCC Linaro 4.8-2013.05 released.
 
38483
+
 
38484
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38485
+
 
38486
+       * GCC Linaro 4.8-2013.04 released.
 
38487
--- a/src/libssp/ChangeLog.linaro
 
38488
+++ b/src/libssp/ChangeLog.linaro
 
38489
@@ -0,0 +1,27 @@
 
38490
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38491
+
 
38492
+        GCC Linaro 4.8-2013.09 released.
 
38493
+
 
38494
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38495
+
 
38496
+       GCC Linaro 4.8-2013.08 released.
 
38497
+
 
38498
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38499
+
 
38500
+        GCC Linaro 4.8-2013.07-1 released.
 
38501
+
 
38502
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38503
+
 
38504
+       GCC Linaro 4.8-2013.07 released.
 
38505
+
 
38506
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38507
+
 
38508
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38509
+
 
38510
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38511
+
 
38512
+       GCC Linaro 4.8-2013.05 released.
 
38513
+
 
38514
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38515
+
 
38516
+       * GCC Linaro 4.8-2013.04 released.
 
38517
--- a/src/libcpp/configure
 
38518
+++ b/src/libcpp/configure
 
38519
@@ -7152,9 +7152,7 @@
 
38520
 case $target in
 
38521
        aarch64*-*-* | \
 
38522
        alpha*-*-* | \
 
38523
-       arm*-*-*eabi* | \
 
38524
-       arm*-*-rtems* | \
 
38525
-       arm*-*-symbianelf* | \
 
38526
+       arm*-*-* | \
 
38527
        x86_64-*-* | \
 
38528
        ia64-*-* | \
 
38529
        hppa*64*-*-* | \
 
38530
--- a/src/libcpp/configure.ac
 
38531
+++ b/src/libcpp/configure.ac
 
38532
@@ -184,9 +184,7 @@
 
38533
 case $target in
 
38534
        aarch64*-*-* | \
 
38535
        alpha*-*-* | \
 
38536
-       arm*-*-*eabi* | \
 
38537
-       arm*-*-rtems* | \
 
38538
-       arm*-*-symbianelf* | \
 
38539
+       arm*-*-* | \
 
38540
        x86_64-*-* | \
 
38541
        ia64-*-* | \
 
38542
        hppa*64*-*-* | \
 
38543
--- a/src/libcpp/ChangeLog.linaro
 
38544
+++ b/src/libcpp/ChangeLog.linaro
 
38545
@@ -0,0 +1,35 @@
 
38546
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38547
+
 
38548
+        GCC Linaro 4.8-2013.09 released.
 
38549
+
 
38550
+2013-09-05  Yvan Roux  <yvan.roux@linaro.org>
 
38551
+
 
38552
+       Backport from trunk r201566.
 
38553
+       2013-08-07  Richard Earnshaw  <rearnsha@arm.com>
 
38554
+
 
38555
+       * configure.ac: Set need_64bit_hwint for all arm targets.
 
38556
+       * configure: Regenerated.
 
38557
+
 
38558
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38559
+
 
38560
+       GCC Linaro 4.8-2013.08 released.
 
38561
+
 
38562
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38563
+
 
38564
+       GCC Linaro 4.8-2013.07-1 released.
 
38565
+
 
38566
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38567
+
 
38568
+       GCC Linaro 4.8-2013.07 released.
 
38569
+
 
38570
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38571
+
 
38572
+       GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38573
+
 
38574
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38575
+
 
38576
+       GCC Linaro 4.8-2013.05 released.
 
38577
+
 
38578
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38579
+
 
38580
+       * GCC Linaro 4.8-2013.04 released.
 
38581
--- a/src/libcpp/po/ChangeLog.linaro
 
38582
+++ b/src/libcpp/po/ChangeLog.linaro
 
38583
@@ -0,0 +1,27 @@
 
38584
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38585
+
 
38586
+        GCC Linaro 4.8-2013.09 released.
 
38587
+
 
38588
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38589
+
 
38590
+       GCC Linaro 4.8-2013.08 released.
 
38591
+
 
38592
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38593
+
 
38594
+        GCC Linaro 4.8-2013.07-1 released.
 
38595
+
 
38596
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38597
+
 
38598
+       GCC Linaro 4.8-2013.07 released.
 
38599
+
 
38600
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38601
+
 
38602
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38603
+
 
38604
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38605
+
 
38606
+       GCC Linaro 4.8-2013.05 released.
 
38607
+
 
38608
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38609
+
 
38610
+       * GCC Linaro 4.8-2013.04 released.
 
38611
--- a/src/fixincludes/ChangeLog.linaro
 
38612
+++ b/src/fixincludes/ChangeLog.linaro
 
38613
@@ -0,0 +1,27 @@
 
38614
+2013-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
 
38615
+
 
38616
+        GCC Linaro 4.8-2013.09 released.
 
38617
+
 
38618
+2013-08-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
38619
+
 
38620
+       GCC Linaro 4.8-2013.08 released.
 
38621
+
 
38622
+2013-07-19  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38623
+
 
38624
+        GCC Linaro 4.8-2013.07-1 released.
 
38625
+
 
38626
+2013-07-05  Christophe Lyon  <christophe.lyon@linaro.org>
 
38627
+
 
38628
+       GCC Linaro 4.8-2013.07 released.
 
38629
+
 
38630
+2013-06-11  Rob Savoye  <rob.savoye@linaro.org>
 
38631
+
 
38632
+        GCC Linaro gcc-linaro-4.8-2013.06 released.
 
38633
+
 
38634
+2013-05-14  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38635
+
 
38636
+       GCC Linaro 4.8-2013.05 released.
 
38637
+
 
38638
+2013-04-09  Matthew Gretton-Dann  <matthew.gretton-dann@linaro.org>
 
38639
+
 
38640
+       * GCC Linaro 4.8-2013.04 released.