1
# DP: Changes for the Linaro 4.8-2013.10 release.
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/
7
--- a/src/libitm/ChangeLog.linaro
8
+++ b/src/libitm/ChangeLog.linaro
10
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
12
+ GCC Linaro 4.8-2013.09 released.
14
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
16
+ GCC Linaro 4.8-2013.08 released.
18
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
20
+ GCC Linaro 4.8-2013.07-1 released.
22
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
24
+ GCC Linaro 4.8-2013.07 released.
26
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
28
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
30
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
32
+ GCC Linaro 4.8-2013.05 released.
34
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
36
+ * GCC Linaro 4.8-2013.04 released.
37
--- a/src/libgomp/ChangeLog.linaro
38
+++ b/src/libgomp/ChangeLog.linaro
40
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
42
+ GCC Linaro 4.8-2013.09 released.
44
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
46
+ GCC Linaro 4.8-2013.08 released.
48
+2013-07-22 Yvan Roux <yvan.roux@linaro.org>
50
+ Backport from trunk r200521.
51
+ 2013-06-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
53
+ * testsuite/libgomp.fortran/strassen.f90:
54
+ Add dg-skip-if aarch64_tiny.
56
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
58
+ GCC Linaro 4.8-2013.07-1 released.
60
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
62
+ GCC Linaro 4.8-2013.07 released.
64
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
66
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
68
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
70
+ GCC Linaro 4.8-2013.05 released.
72
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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
78
! { dg-options "-O2" }
79
+! { dg-skip-if "AArch64 tiny code model does not support programs larger than 1MiB" {aarch64_tiny} {"*"} {""} }
81
program strassen_matmul
83
--- a/src/libquadmath/ChangeLog.linaro
84
+++ b/src/libquadmath/ChangeLog.linaro
86
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
88
+ GCC Linaro 4.8-2013.09 released.
90
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
92
+ GCC Linaro 4.8-2013.08 released.
94
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
96
+ GCC Linaro 4.8-2013.07-1 released.
98
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
100
+ GCC Linaro 4.8-2013.07 released.
102
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
104
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
106
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
108
+ GCC Linaro 4.8-2013.05 released.
110
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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
116
CHECK_EQ(*current_++, ' ');
117
while (IsDecimal(*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_++, ' ');
124
while (current_ < next_line && *current_ == ' ')
126
--- a/src/libsanitizer/ChangeLog.linaro
127
+++ b/src/libsanitizer/ChangeLog.linaro
129
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
131
+ GCC Linaro 4.8-2013.09 released.
133
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
135
+ GCC Linaro 4.8-2013.08 released.
137
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
139
+ GCC Linaro 4.8-2013.07-1 released.
141
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
143
+ GCC Linaro 4.8-2013.07 released.
145
+2013-06-20 Christophe Lyon <christophe.lyon@linaro.org>
147
+ Backport from trunk r198683.
148
+ 2013-05-07 Christophe Lyon <christophe.lyon@linaro.org>
150
+ * configure.tgt: Add ARM pattern.
152
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
154
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
156
+2013-06-04 Christophe Lyon <christophe.lyon@linaro.org>
158
+ Backport from trunk r199606.
159
+ 2013-06-03 Christophe Lyon <christophe.lyon@linaro.org>
161
+ * sanitizer_common/sanitizer_linux.cc (MemoryMappingLayout::Next):
162
+ Cherry pick upstream r182922.
164
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
166
+ GCC Linaro 4.8-2013.05 released.
168
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
170
+ * GCC Linaro 4.8-2013.04 released.
171
--- a/src/libsanitizer/configure.tgt
172
+++ b/src/libsanitizer/configure.tgt
179
x86_64-*-darwin[1]* | i?86-*-darwin[1]*)
182
--- a/src/zlib/ChangeLog.linaro
183
+++ b/src/zlib/ChangeLog.linaro
185
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
187
+ GCC Linaro 4.8-2013.09 released.
189
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
191
+ GCC Linaro 4.8-2013.08 released.
193
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
195
+ GCC Linaro 4.8-2013.07-1 released.
197
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
199
+ GCC Linaro 4.8-2013.07 released.
201
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
203
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
205
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
207
+ GCC Linaro 4.8-2013.05 released.
209
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
211
+ * GCC Linaro 4.8-2013.04 released.
212
--- a/src/libstdc++-v3/ChangeLog.linaro
213
+++ b/src/libstdc++-v3/ChangeLog.linaro
215
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
217
+ GCC Linaro 4.8-2013.09 released.
219
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
221
+ GCC Linaro 4.8-2013.08 released.
223
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
225
+ GCC Linaro 4.8-2013.07-1 released.
227
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
229
+ GCC Linaro 4.8-2013.07 released.
231
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
233
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
235
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
237
+ GCC Linaro 4.8-2013.05 released.
239
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
241
+ * GCC Linaro 4.8-2013.04 released.
242
--- a/src/intl/ChangeLog.linaro
243
+++ b/src/intl/ChangeLog.linaro
245
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
247
+ GCC Linaro 4.8-2013.09 released.
249
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
251
+ GCC Linaro 4.8-2013.08 released.
253
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
255
+ GCC Linaro 4.8-2013.07-1 released.
257
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
259
+ GCC Linaro 4.8-2013.07 released.
261
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
263
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
265
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
267
+ GCC Linaro 4.8-2013.05 released.
269
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
271
+ * GCC Linaro 4.8-2013.04 released.
272
--- a/src/ChangeLog.linaro
273
+++ b/src/ChangeLog.linaro
275
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
277
+ GCC Linaro 4.8-2013.09 released.
279
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
281
+ GCC Linaro 4.8-2013.08 released.
283
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
285
+ GCC Linaro 4.8-2013.07-1 released.
287
+2013-07-09 Christophe Lyon <christophe.lyon@linaro.org>
290
+ * LINARO-VERSION: Bump version.
292
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
294
+ GCC Linaro 4.8-2013.07 released.
296
+2013-06-18 Rob Savoye <rob.savoye@linaro.org>
299
+ * LINARO-VERSION: Bump version.
301
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
303
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
305
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
307
+ GCC Linaro 4.8-2013.05 released.
309
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
311
+ * GCC Linaro 4.8-2013.04 released.
312
--- a/src/libmudflap/ChangeLog.linaro
313
+++ b/src/libmudflap/ChangeLog.linaro
315
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
317
+ GCC Linaro 4.8-2013.09 released.
319
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
321
+ GCC Linaro 4.8-2013.08 released.
323
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
325
+ GCC Linaro 4.8-2013.07-1 released.
327
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
329
+ GCC Linaro 4.8-2013.07 released.
331
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
333
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
335
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
337
+ GCC Linaro 4.8-2013.05 released.
339
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
341
+ * GCC Linaro 4.8-2013.04 released.
342
--- a/src/boehm-gc/ChangeLog.linaro
343
+++ b/src/boehm-gc/ChangeLog.linaro
345
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
347
+ GCC Linaro 4.8-2013.09 released.
349
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
351
+ GCC Linaro 4.8-2013.08 released.
353
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
355
+ GCC Linaro 4.8-2013.07-1 released.
357
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
359
+ GCC Linaro 4.8-2013.07 released.
361
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
363
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
365
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
367
+ GCC Linaro 4.8-2013.05 released.
369
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
371
+ Backport from trunk r197770.
373
+ 2013-03-16 Yvan Roux <yvan.roux@linaro.org>
375
+ * include/private/gcconfig.h (AARCH64): New macro (defined only if
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.
382
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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
390
/* Determine the machine type: */
391
+#if defined(__aarch64__)
393
+# if !defined(LINUX)
395
+# define mach_type_known
398
# if defined(__arm__) || defined(__thumb__)
400
# if !defined(LINUX) && !defined(NETBSD)
403
# define mach_type_known
405
+# if defined(LINUX) && defined(__aarch64__)
407
+# define mach_type_known
409
# if defined(LINUX) && defined(__arm__)
411
# define mach_type_known
413
/* running Amdahl UTS4 */
414
/* S390 ==> 390-like machine */
416
+ /* AARCH64 ==> ARM AArch64 */
417
/* ARM32 ==> Intel StrongARM */
418
/* IA64 ==> Intel IPF */
420
@@ -1833,6 +1845,32 @@
425
+# define CPP_WORDSZ 64
426
+# define MACH_TYPE "AARCH64"
427
+# define ALIGNMENT 8
429
+# define HBLKSIZE 4096
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))
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__)
451
# define CPP_WORDSZ 32
452
# define MACH_TYPE "ARM32"
453
--- a/src/include/ChangeLog.linaro
454
+++ b/src/include/ChangeLog.linaro
456
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
458
+ GCC Linaro 4.8-2013.09 released.
460
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
462
+ GCC Linaro 4.8-2013.08 released.
464
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
466
+ GCC Linaro 4.8-2013.07-1 released.
468
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
470
+ GCC Linaro 4.8-2013.07 released.
472
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
474
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
476
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
478
+ GCC Linaro 4.8-2013.05 released.
480
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
482
+ * GCC Linaro 4.8-2013.04 released.
483
--- a/src/libiberty/ChangeLog.linaro
484
+++ b/src/libiberty/ChangeLog.linaro
486
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
488
+ GCC Linaro 4.8-2013.09 released.
490
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
492
+ GCC Linaro 4.8-2013.08 released.
494
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
496
+ GCC Linaro 4.8-2013.07-1 released.
498
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
500
+ GCC Linaro 4.8-2013.07 released.
502
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
504
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
506
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
508
+ GCC Linaro 4.8-2013.05 released.
510
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
512
+ * GCC Linaro 4.8-2013.04 released.
513
--- a/src/lto-plugin/ChangeLog.linaro
514
+++ b/src/lto-plugin/ChangeLog.linaro
516
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
518
+ GCC Linaro 4.8-2013.09 released.
520
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
522
+ GCC Linaro 4.8-2013.08 released.
524
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
526
+ GCC Linaro 4.8-2013.07-1 released.
528
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
530
+ GCC Linaro 4.8-2013.07 released.
532
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
534
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
536
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
538
+ GCC Linaro 4.8-2013.05 released.
540
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
542
+ * GCC Linaro 4.8-2013.04 released.
543
--- a/src/contrib/regression/ChangeLog.linaro
544
+++ b/src/contrib/regression/ChangeLog.linaro
546
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
548
+ GCC Linaro 4.8-2013.09 released.
550
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
552
+ GCC Linaro 4.8-2013.08 released.
554
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
556
+ GCC Linaro 4.8-2013.07-1 released.
558
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
560
+ GCC Linaro 4.8-2013.07 released.
562
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
564
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
566
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
568
+ GCC Linaro 4.8-2013.05 released.
570
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
572
+ * GCC Linaro 4.8-2013.04 released.
573
--- a/src/contrib/config-list.mk
574
+++ b/src/contrib/config-list.mk
576
# nohup nice make -j25 -l36 -f ../gcc/contrib/config-list.mk > make.out 2>&1 &
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
588
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
590
+ GCC Linaro 4.8-2013.09 released.
592
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
594
+ GCC Linaro 4.8-2013.08 released.
596
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
598
+ GCC Linaro 4.8-2013.07-1 released.
600
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
602
+ GCC Linaro 4.8-2013.07 released.
604
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
606
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
608
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
610
+ GCC Linaro 4.8-2013.05 released.
612
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
614
+ Backport from trunk r198443.
615
+ 2013-04-22 Sofiane Naci <sofiane.naci@arm.com>
617
+ * config-list.mk (LIST): Add aarch64-elf and aarch64-linux-gnu.
619
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
621
+ * GCC Linaro 4.8-2013.04 released.
622
--- a/src/contrib/reghunt/ChangeLog.linaro
623
+++ b/src/contrib/reghunt/ChangeLog.linaro
625
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
627
+ GCC Linaro 4.8-2013.09 released.
629
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
631
+ GCC Linaro 4.8-2013.08 released.
633
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
635
+ GCC Linaro 4.8-2013.07-1 released.
637
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
639
+ GCC Linaro 4.8-2013.07 released.
641
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
643
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
645
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
647
+ GCC Linaro 4.8-2013.05 released.
649
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
651
+ * GCC Linaro 4.8-2013.04 released.
652
--- a/src/libatomic/ChangeLog.linaro
653
+++ b/src/libatomic/ChangeLog.linaro
655
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
657
+ GCC Linaro 4.8-2013.09 released.
659
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
661
+ GCC Linaro 4.8-2013.08 released.
663
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
665
+ GCC Linaro 4.8-2013.07-1 released.
667
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
669
+ GCC Linaro 4.8-2013.07 released.
671
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
673
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
675
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
677
+ GCC Linaro 4.8-2013.05 released.
679
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
681
+ * GCC Linaro 4.8-2013.04 released.
682
--- a/src/config/ChangeLog.linaro
683
+++ b/src/config/ChangeLog.linaro
685
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
687
+ GCC Linaro 4.8-2013.09 released.
689
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
691
+ GCC Linaro 4.8-2013.08 released.
693
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
695
+ GCC Linaro 4.8-2013.07-1 released.
697
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
699
+ GCC Linaro 4.8-2013.07 released.
701
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
703
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
705
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
707
+ GCC Linaro 4.8-2013.05 released.
709
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
711
+ * GCC Linaro 4.8-2013.04 released.
712
--- a/src/libbacktrace/ChangeLog.linaro
713
+++ b/src/libbacktrace/ChangeLog.linaro
715
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
717
+ GCC Linaro 4.8-2013.09 released.
719
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
721
+ GCC Linaro 4.8-2013.08 released.
723
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
725
+ GCC Linaro 4.8-2013.07-1 released.
727
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
729
+ GCC Linaro 4.8-2013.07 released.
731
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
733
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
735
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
737
+ GCC Linaro 4.8-2013.05 released.
739
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
741
+ * GCC Linaro 4.8-2013.04 released.
742
--- a/src/libjava/libltdl/ChangeLog.linaro
743
+++ b/src/libjava/libltdl/ChangeLog.linaro
745
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
747
+ GCC Linaro 4.8-2013.09 released.
749
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
751
+ GCC Linaro 4.8-2013.08 released.
753
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
755
+ GCC Linaro 4.8-2013.07-1 released.
757
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
759
+ GCC Linaro 4.8-2013.07 released.
761
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
763
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
765
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
767
+ GCC Linaro 4.8-2013.05 released.
769
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
771
+ * GCC Linaro 4.8-2013.04 released.
772
--- a/src/libjava/ChangeLog.linaro
773
+++ b/src/libjava/ChangeLog.linaro
775
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
777
+ GCC Linaro 4.8-2013.09 released.
779
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
781
+ GCC Linaro 4.8-2013.08 released.
783
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
785
+ GCC Linaro 4.8-2013.07-1 released.
787
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
789
+ GCC Linaro 4.8-2013.07 released.
791
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
793
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
795
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
797
+ GCC Linaro 4.8-2013.05 released.
799
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
801
+ * GCC Linaro 4.8-2013.04 released.
802
--- a/src/libjava/classpath/ChangeLog.linaro
803
+++ b/src/libjava/classpath/ChangeLog.linaro
805
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
807
+ GCC Linaro 4.8-2013.09 released.
809
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
811
+ GCC Linaro 4.8-2013.08 released.
813
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
815
+ GCC Linaro 4.8-2013.07-1 released.
817
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
819
+ GCC Linaro 4.8-2013.07 released.
821
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
823
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
825
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
827
+ GCC Linaro 4.8-2013.05 released.
829
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
831
+ * GCC Linaro 4.8-2013.04 released.
832
--- a/src/gnattools/ChangeLog.linaro
833
+++ b/src/gnattools/ChangeLog.linaro
835
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
837
+ GCC Linaro 4.8-2013.09 released.
839
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
841
+ GCC Linaro 4.8-2013.08 released.
843
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
845
+ GCC Linaro 4.8-2013.07-1 released.
847
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
849
+ GCC Linaro 4.8-2013.07 released.
851
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
853
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
855
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
857
+ GCC Linaro 4.8-2013.05 released.
859
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
861
+ * GCC Linaro 4.8-2013.04 released.
862
--- a/src/maintainer-scripts/ChangeLog.linaro
863
+++ b/src/maintainer-scripts/ChangeLog.linaro
865
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
867
+ GCC Linaro 4.8-2013.09 released.
869
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
871
+ GCC Linaro 4.8-2013.08 released.
873
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
875
+ GCC Linaro 4.8-2013.07-1 released.
877
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
879
+ GCC Linaro 4.8-2013.07 released.
881
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
883
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
885
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
887
+ GCC Linaro 4.8-2013.05 released.
889
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
891
+ * GCC Linaro 4.8-2013.04 released.
892
--- a/src/libgcc/ChangeLog.linaro
893
+++ b/src/libgcc/ChangeLog.linaro
895
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
897
+ GCC Linaro 4.8-2013.09 released.
899
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
901
+ GCC Linaro 4.8-2013.08 released.
903
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
905
+ GCC Linaro 4.8-2013.07-1 released.
907
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
909
+ GCC Linaro 4.8-2013.07 released.
911
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
913
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
915
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
917
+ GCC Linaro 4.8-2013.05 released.
919
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
921
+ Backport from trunk r198090.
922
+ 2013-04-19 Yufeng Zhang <yufeng.zhang@arm.com>
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
929
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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
935
<http://www.gnu.org/licenses/>. */
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
944
typedef int TItype __attribute__ ((mode (TI)));
945
--- a/src/libgcc/config/libbid/ChangeLog.linaro
946
+++ b/src/libgcc/config/libbid/ChangeLog.linaro
948
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
950
+ GCC Linaro 4.8-2013.09 released.
952
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
954
+ GCC Linaro 4.8-2013.08 released.
956
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
958
+ GCC Linaro 4.8-2013.07-1 released.
960
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
962
+ GCC Linaro 4.8-2013.07 released.
964
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
966
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
968
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
970
+ GCC Linaro 4.8-2013.05 released.
972
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
974
+ * GCC Linaro 4.8-2013.04 released.
975
--- a/src/libdecnumber/ChangeLog.linaro
976
+++ b/src/libdecnumber/ChangeLog.linaro
978
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
980
+ GCC Linaro 4.8-2013.09 released.
982
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
984
+ GCC Linaro 4.8-2013.08 released.
986
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
988
+ GCC Linaro 4.8-2013.07-1 released.
990
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
992
+ GCC Linaro 4.8-2013.07 released.
994
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
996
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
998
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1000
+ GCC Linaro 4.8-2013.05 released.
1002
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1004
+ * GCC Linaro 4.8-2013.04 released.
1005
--- a/src/gcc/LINARO-VERSION
1006
+++ b/src/gcc/LINARO-VERSION
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 @@
1015
+/* Generic hook that takes (gimple_stmt_iterator *) and returns
1018
+hook_bool_gsiptr_false (gimple_stmt_iterator *a ATTRIBUTE_UNUSED)
1023
/* Used for the TARGET_ASM_CAN_OUTPUT_MI_THUNK hook. */
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
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,
1036
--- a/src/gcc/c-family/ChangeLog.linaro
1037
+++ b/src/gcc/c-family/ChangeLog.linaro
1039
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1041
+ GCC Linaro 4.8-2013.09 released.
1043
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
1045
+ GCC Linaro 4.8-2013.08 released.
1047
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1049
+ GCC Linaro 4.8-2013.07-1 released.
1051
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
1053
+ GCC Linaro 4.8-2013.07 released.
1055
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
1057
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
1059
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1061
+ GCC Linaro 4.8-2013.05 released.
1063
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1065
+ * GCC Linaro 4.8-2013.04 released.
1066
--- a/src/gcc/java/ChangeLog.linaro
1067
+++ b/src/gcc/java/ChangeLog.linaro
1069
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1071
+ GCC Linaro 4.8-2013.09 released.
1073
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
1075
+ GCC Linaro 4.8-2013.08 released.
1077
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1079
+ GCC Linaro 4.8-2013.07-1 released.
1081
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
1083
+ GCC Linaro 4.8-2013.07 released.
1085
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
1087
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
1089
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1091
+ GCC Linaro 4.8-2013.05 released.
1093
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1095
+ * GCC Linaro 4.8-2013.04 released.
1096
--- a/src/gcc/c/ChangeLog.linaro
1097
+++ b/src/gcc/c/ChangeLog.linaro
1099
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1101
+ GCC Linaro 4.8-2013.09 released.
1103
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
1105
+ GCC Linaro 4.8-2013.08 released.
1107
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1109
+ GCC Linaro 4.8-2013.07-1 released.
1111
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
1113
+ GCC Linaro 4.8-2013.07 released.
1115
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
1117
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
1119
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1121
+ GCC Linaro 4.8-2013.05 released.
1123
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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 @@
1130
tree, (unsigned int /*location_t*/ loc, tree fndecl, void *arglist), NULL)
1132
-/* Fold a target-specific builtin. */
1133
+/* Fold a target-specific builtin to a tree valid for both GIMPLE
1138
tree, (tree fndecl, int n_args, tree *argp, bool ignore),
1139
hook_tree_tree_int_treep_bool_null)
1141
+/* Fold a target-specific builtin to a valid GIMPLE tree. */
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)
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))
1160
+ /* Check the code to be executed for COND_EXEC. */
1161
+ if (GET_CODE (pat) == COND_EXEC)
1162
+ pat = COND_EXEC_CODE (pat);
1164
if (GET_CODE (pat) == SET && set_noop_p (pat))
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) " ;;
1183
- PKGVERSION="(GCC) "
1184
+ PKGVERSION="(Linaro GCC `cat $srcdir/LINARO-VERSION`) "
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.
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 \
1200
--- a/src/gcc/gensupport.c
1201
+++ b/src/gcc/gensupport.c
1202
@@ -1717,6 +1717,21 @@
1203
XVECEXP (insn, 1, 0) = pattern;
1206
+ if (XVEC (ce_elem->data, 3) != NULL)
1208
+ rtvec attributes = rtvec_alloc (XVECLEN (insn, 4)
1209
+ + XVECLEN (ce_elem->data, 3));
1212
+ for (i = 0; i < XVECLEN (insn, 4); i++)
1213
+ RTVEC_ELT (attributes, i) = XVECEXP (insn, 4, i);
1215
+ for (j = 0; j < XVECLEN (ce_elem->data, 3); j++, i++)
1216
+ RTVEC_ELT (attributes, i) = XVECEXP (ce_elem->data, 3, j);
1218
+ XVEC (insn, 4) = attributes;
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 @@
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)))
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)))
1243
--- a/src/gcc/objc/ChangeLog.linaro
1244
+++ b/src/gcc/objc/ChangeLog.linaro
1246
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1248
+ GCC Linaro 4.8-2013.09 released.
1250
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
1252
+ GCC Linaro 4.8-2013.08 released.
1254
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1256
+ GCC Linaro 4.8-2013.07-1 released.
1258
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
1260
+ GCC Linaro 4.8-2013.07 released.
1262
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
1264
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
1266
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1268
+ GCC Linaro 4.8-2013.05 released.
1270
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1272
+ * GCC Linaro 4.8-2013.04 released.
1273
--- a/src/gcc/ChangeLog.linaro
1274
+++ b/src/gcc/ChangeLog.linaro
1276
+2013-10-09 Christophe Lyon <christophe.lyon@linaro.org>
1278
+ Backport from trunk r198526,198527,200020,200595.
1279
+ 2013-05-02 Ian Bolton <ian.bolton@arm.com>
1281
+ * config/aarch64/aarch64.md (*and_one_cmpl<mode>3_compare0):
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.
1287
+ 2013-05-02 Ian Bolton <ian.bolton@arm.com>
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.
1293
+ 2013-06-12 Sofiane Naci <sofiane.naci@arm.com>
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.
1302
+ 2013-07-02 Ian Bolton <ian.bolton@arm.com>
1304
+ * config/aarch64/aarch64.md (*extr_insv_reg<mode>): New pattern.
1306
+2013-10-09 Christophe Lyon <christophe.lyon@linaro.org>
1308
+ Backport from trunk r201879.
1309
+ 2013-08-20 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
1311
+ * config/arm/linux-elf.h (MULTILIB_DEFAULTS): Remove definition.
1312
+ * config/arm/t-linux-eabi (MULTILIB_OPTIONS): Document association
1313
+ with MULTLIB_DEFAULTS.
1315
+2013-10-09 Christophe Lyon <christophe.lyon@linaro.org>
1317
+ Backport from trunk r201871.
1318
+ 2013-08-20 Pavel Chupin <pavel.v.chupin@intel.com>
1320
+ Fix LIB_SPEC for systems without libpthread.
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
1325
+ * config/i386/linux-common.h: Likewise.
1326
+ * config/mips/linux-common.h: Likewise.
1328
+2013-10-08 Christophe Lyon <christophe.lyon@linaro.org>
1330
+ Backport from trunk r202702.
1331
+ 2013-09-18 Richard Earnshaw <rearnsha@arm.com>
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.
1338
+2013-10-04 Venkataramanan.Kumar <venkataramanan.kumar@linaro.org>
1340
+ Backport from trunk r203028.
1341
+ 2013-09-30 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
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.
1349
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1351
+ Backport from trunk r201923,201927.
1352
+ 2013-08-22 Julian Brown <julian@codesourcery.com>
1354
+ * configure.ac: Add aarch64 to list of arches which use "nop" in
1356
+ * configure: Regenerate.
1358
+ 2013-08-22 Paolo Carlini <paolo.carlini@oracle.com>
1360
+ * configure.ac: Add backslashes missing from the last change.
1361
+ * configure: Regenerate.
1363
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1365
+ Backport from trunk r202023,202108.
1366
+ 2013-08-27 Tejas Belagod <tejas.belagod@arm.com>
1368
+ * config/aarch64/arm_neon.h: Replace all inline asm implementations
1369
+ of vget_low_* with implementations in terms of other intrinsics.
1371
+ 2013-08-30 Tejas Belagod <tejas.belagod@arm.com>
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.
1377
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1379
+ Backport from trunk r201260,202400.
1380
+ 2013-07-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1381
+ Richard Earnshaw <richard.earnshaw@arm.com>
1383
+ * combine.c (simplify_comparison): Re-canonicalize operands
1384
+ where appropriate.
1385
+ * config/arm/arm.md (movcond_addsi): New splitter.
1387
+ 2013-09-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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
1394
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1396
+ Backport from trunk r202164.
1397
+ 2013-09-02 Bin Cheng <bin.cheng@arm.com>
1399
+ * tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
1400
+ Find auto-increment use both before and after candidate.
1402
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1404
+ Backport from trunk r202279.
1405
+ 2013-09-05 Richard Earnshaw <rearnsha@arm.com>
1407
+ * arm.c (thumb2_emit_strd_push): Rewrite to use pre-decrement on
1409
+ * thumb2.md (thumb2_storewb_parisi): New pattern.
1411
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
1413
+ Backport from trunk r202275.
1414
+ 2013-09-05 Yufeng Zhang <yufeng.zhang@arm.com>
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.
1423
+2013-10-01 Christophe Lyon <christophe.lyon@linaro.org>
1425
+ Backport from trunk r201250.
1426
+ 2013-07-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1428
+ * config/arm/arm.md (arm_addsi3, addsi3_carryin_<optab>,
1429
+ addsi3_carryin_alt2_<optab>): Correct output template.
1431
+2013-10-01 Kugan Vivekanandarajah <kuganv@linaro.org>
1433
+ Backport from trunk r203059,203116.
1434
+ 2013-10-01 Kugan Vivekanandarajah <kuganv@linaro.org>
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.
1446
+2013-09-11 Christophe Lyon <christophe.lyon@linaro.org>
1448
+ * LINARO-VERSION: Bump version.
1450
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1452
+ GCC Linaro 4.8-2013.09 released.
1454
+2013-09-10 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
1456
+ Backport from trunk r200197, 201411.
1457
+ 2013-06-19 Richard Earnshaw <rearnsha@arm.com>
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.
1463
+ 2013-08-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
1470
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
1472
+ Backport from trunk r200593,201024,201025,201122,201124,201126.
1473
+ 2013-07-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1475
+ * config/arm/arm.md (arm_andsi3_insn): Add alternatives for 16-bit
1477
+ (iorsi3_insn): Likewise.
1478
+ (arm_xorsi3): Likewise.
1480
+ 2013-07-18 Sofiane Naci <sofiane.naci@arm.com>
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.
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
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
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
1616
+ (cortex_a53_alu_shift): Likewise.
1617
+ * config/arm/cortex-a7.md (cortex_a7_alu_imm): Update for attribute
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.
1655
+ 2013-07-18 Sofiane Naci <sofiane.naci@arm.com>
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.
1670
+ 2013-07-22 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1672
+ * config/arm/predicates.md (shiftable_operator_strict_it):
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.
1701
+ 2013-07-22 Sofiane Naci <sofiane.naci@arm.com>
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.
1797
+ 2013-07-22 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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
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.
1822
+2013-09-09 Kugan Vivekanandarajah <kuganv@linaro.org>
1824
+ Backport from trunk r201412.
1825
+ 2013-08-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1827
+ * config/arm/arm.md (minmax_arithsi_non_canon): Emit canonical RTL form
1828
+ when subtracting a constant.
1830
+2013-09-05 Yvan Roux <yvan.roux@linaro.org>
1832
+ Backport from trunk r201249.
1833
+ 2013-07-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
1835
+ * config/arm/arm-fixed.md (ssmulsa3, usmulusa3):
1836
+ Adjust for arm_restrict_it.
1837
+ Remove trailing whitespace.
1839
+2013-09-05 Yvan Roux <yvan.roux@linaro.org>
1841
+ Backport from trunk r201342.
1842
+ 2013-07-30 Richard Earnshaw <rearnsha@arm.com>
1844
+ * config.gcc (arm): Require 64-bit host-wide-int for all ARM target
1847
+2013-09-05 Christophe Lyon <christophe.lyon@linaro.org>
1849
+ Backport from trunk r199527,199792,199814.
1850
+ 2013-05-31 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
1862
+ 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
1868
+ 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
1879
+2013-09-05 Christophe Lyon <christophe.lyon@linaro.org>
1881
+ Backport from trunk r201599.
1882
+ 2013-08-08 Richard Earnshaw <rearnsha@arm.com>
1885
+ * arm/neon.md (neon_vld1_dupdi): New expand pattern.
1886
+ (neon_vld1_dup<mode> VD iterator): Iterate over VD not VDX.
1888
+2013-09-05 Christophe Lyon <christophe.lyon@linaro.org>
1890
+ Backport from trunk r201589.
1891
+ 2013-08-08 Bernd Edlinger <bernd.edlinger@hotmail.de>
1894
+ * config/arm/arm.h (MALLOC_ABI_ALIGNMENT): Define.
1896
+2013-09-03 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
1898
+ Backport from trunk
1900
+ 2013-08-09 James Greenhalgh <james.greenhalgh@arm.com>
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.
1923
+ 2013-08-12 James Greenhalgh <james.greenhalgh@arm.com>
1925
+ * config/aarch64/arm_none.h
1926
+ (vdup<bhsd>_lane_<su><8,16,32,64>): Fix macro call.
1928
+2013-08-26 Kugan Vivekanandarajah <kuganv@linaro.org>
1930
+ Backport from trunk r201341.
1931
+ 2013-07-30 Richard Earnshaw <rearnsha@arm.com>
1933
+ * arm.md (mulhi3): New expand pattern.
1935
+2013-08-16 Christophe Lyon <christophe.lyon@linaro.org>
1937
+ * LINARO-VERSION: Bump version.
1939
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
1941
+ GCC Linaro 4.8-2013.08 released.
1943
+2013-08-08 Christophe Lyon <christophe.lyon@linaro.org>
1945
+ Backport from trunk
1946
+ r198489,200167,200199,200510,200513,200515,200576.
1947
+ 2013-05-01 Greta Yorsh <Greta.Yorsh@arm.com>
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.
1957
+ 2013-06-18 Sofiane Naci <sofiane.naci@arm.com>
1959
+ * config/arm/arm.md (attribute "insn"): Move multiplication and division
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.
2083
+ 2013-06-19 Sofiane Naci <sofiane.naci@arm.com>
2085
+ * config/arm/vfp.md: Move VFP instruction classification documentation
2087
+ * config/arm/arm.md: ... here. Update instruction classification
2090
+ 2013-06-28 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
2113
+ 2013-06-28 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2115
+ * config/arm/arm.md (arm_mulsi3_v6): Add alternative for 16-bit
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.
2171
+ 2013-06-28 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2173
+ * config/arm/constraints.md (Ts): New constraint.
2174
+ * config/arm/arm.md (arm_movqi_insn): Add alternatives for
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.
2192
+ 2013-07-01 Sofiane Naci <sofiane.naci@arm.com>
2194
+ * arm.md (attribute "wtype"): Delete. Move attribute values from here
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.
2386
+2013-08-07 Christophe Lyon <christophe.lyon@linaro.org>
2388
+ Backport from trunk r201237.
2389
+ 2013-07-25 Terry Guo <terry.guo@arm.com>
2391
+ * config/arm/arm.c (thumb1_size_rtx_costs): Assign proper cost for
2392
+ shift_add/shift_sub0/shift_sub1 RTXs.
2394
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
2396
+ Backport from trunk r200596,201067,201083.
2397
+ 2013-07-02 Ian Bolton <ian.bolton@arm.com>
2399
+ * config/aarch64/aarch64-simd.md (absdi2): Support abs for
2402
+ 2013-07-19 Ian Bolton <ian.bolton@arm.com>
2404
+ * config/aarch64/arm_neon.h (vabs_s64): New function
2406
+ 2013-07-20 James Greenhalgh <james.greenhalgh@arm.com>
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.
2416
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
2418
+ Backport from trunk r198735,198831,199959.
2419
+ 2013-05-09 Sofiane Naci <sofiane.naci@arm.com>
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
2434
+ (aarch64_print_operand): Update.
2436
+ 2013-05-13 Sofiane Naci <sofiane.naci@arm.com>
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
2449
+ 2013-06-11 Sofiane Naci <sofiane.naci@arm.com>
2451
+ * config/aarch64/aarch64-simd.md (move_lo_quad_<mode>): Update.
2453
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
2455
+ Backport from trunk r199438,199439,201326.
2457
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2466
+ 2013-05-30 Bernd Schmidt <bernds@codesourcery.com>
2467
+ Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2475
+ 2013-07-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2482
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
2484
+ Backport from trunk r198928,198973,199203,201240,201241,201307.
2485
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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
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
2500
+ 2013-05-16 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
2503
+ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
2506
+ 2013-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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.
2514
+ 2013-07-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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
2523
+ * config/arm/constraints.md ("Ss"): Rename to US.
2525
+ 2013-07-25 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
2527
+ * config/arm/arm.md (*sibcall_insn): Remove unnecessary space.
2529
+ 2013-07-29 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
2530
+ Fix incorrect changelog entry.
2537
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2539
+ Backport from trunk r200922.
2540
+ 2013-07-12 Tejas Belagod <tejas.belagod@arm.com>
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
2547
+ (aarch64_output_simd_mov_immediate): Print the correct shift specifier.
2549
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2551
+ Backport from trunk r200670.
2552
+ 2013-07-04 Tejas Belagod <tejas.belagod@arm.com>
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.
2563
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2565
+ Backport from trunk r200637.
2566
+ 2013-07-03 Yufeng Zhang <yufeng.zhang@arm.com>
2568
+ * config/aarch64/aarch64.h (enum arm_abi_type): Remove.
2569
+ (ARM_ABI_AAPCS64): Ditto.
2571
+ (ARM_DEFAULT_ABI): Ditto.
2573
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2575
+ Backport from trunk r200532, r200565.
2576
+ 2013-06-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
2578
+ * config/aarch64/aarch64.c (aarch64_cannot_force_const_mem): Adjust
2581
+ 2013-06-29 Yufeng Zhang <yufeng.zhang@arm.com>
2583
+ * config/aarch64/aarch64.c: Remove junk from the beginning of the
2586
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2588
+ Backport from trunk r200531.
2589
+ 2013-06-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
2591
+ * config/aarch64/aarch64-protos.h (aarch64_symbol_type):
2592
+ Update comment w.r.t SYMBOL_TINY_ABSOLUTE.
2594
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2596
+ Backport from trunk r200519.
2597
+ 2013-06-28 Marcus Shawcroft <marcus.shawcroft@arm.com>
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.
2608
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2610
+ Backport from trunk r200466, r200467.
2611
+ 2013-06-27 Yufeng Zhang <yufeng.zhang@arm.com>
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.
2619
+ 2013-06-27 Yufeng Zhang <yufeng.zhang@arm.com>
2621
+ * config/aarch64/aarch64.c (aarch64_add_offset): Change to pass
2622
+ 'mode' to aarch64_plus_immediate and gen_rtx_PLUS.
2624
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
2626
+ Backport from trunk r200419.
2627
+ 2013-06-26 Greta Yorsh <Greta.Yorsh@arm.com>
2629
+ * config/arm/arm.h (MAX_CONDITIONAL_EXECUTE): Define macro.
2630
+ * config/arm/arm-protos.h (arm_max_conditional_execute): New
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.
2638
+2013-07-24 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
2640
+ * LINARO-VERSION: Bump version.
2642
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
2644
+ GCC Linaro 4.8-2013.07-1 released.
2646
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
2648
+ Backport from trunk r201005.
2649
+ 2013-07-17 Yvan Roux <yvan.roux@linaro.org>
2652
+ * config/arm/arm.c (gen_movmem_ldrd_strd): Fix unaligned load/store
2655
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
2657
+ GCC Linaro 4.8-2013.07 released.
2659
+2013-07-03 Christophe Lyon <christophe.lyon@linaro.org>
2661
+ Revert backport from trunk r198928,198973,199203.
2662
+ 2013-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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.
2670
+ 2013-05-16 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
2673
+ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
2676
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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
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
2691
+2013-07-03 Christophe Lyon <christophe.lyon@linaro.org>
2693
+ Revert backport from mainline (r199438, r199439)
2694
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2703
+ 2013-05-30 Bernd Schmidt <bernds@codesourcery.com>
2704
+ Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2715
+2013-07-03 Christophe Lyon <christophe.lyon@linaro.org>
2717
+ Backport from trunk r199640, 199705, 199733, 199734, 199739.
2718
+ 2013-06-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2720
+ * rtl.def: Add extra fourth optional field to define_cond_exec.
2721
+ * gensupport.c (process_one_cond_exec): Process attributes from
2723
+ * doc/md.texi: Document fourth field in define_cond_exec.
2725
+ 2013-06-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
2733
+ 2013-06-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
2748
+ 2013-06-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2750
+ * config/arm/arm-ldmstm.ml: Set "predicable_short_it" to "no"
2751
+ where appropriate.
2752
+ * config/arm/ldmstm.md: Regenerate.
2754
+ 2013-06-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
2760
+2013-07-02 Rob Savoye <rob.savoye@linaro.org>
2762
+ Backport from trunk 200096
2764
+ 2013-06-14 Vidya Praveen <vidyapraveen@arm.com>
2766
+ * config/aarch64/aarch64-simd.md (aarch64_<su>mlal_lo<mode>):
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.
2772
+2013-07-02 Rob Savoye <rob.savoye@linaro.org>
2774
+ Backport from trunk 200062
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.
2780
+2013-07-02 Rob Savoye <rob.savoye@linaro.org>
2781
+ Backport from trunk 199810
2783
+ 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2785
+ * config/arm/arm.md (anddi3_insn): Remove duplicate alternatives.
2786
+ Clean up alternatives.
2788
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
2790
+ Backport from trunk 200152
2791
+ 2013-06-17 Sofiane Naci <sofiane.naci@arm.com>
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.
2799
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
2801
+ Backport from trunk 200061
2802
+ 2013-06-13 Bin Cheng <bin.cheng@arm.com>
2804
+ * rtlanal.c (noop_move_p): Check the code to be executed for
2807
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
2809
+ Backport from trunk 199694
2810
+ 2013-06-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
2818
+2013-06-20 Christophe Lyon <christophe.lyon@linaro.org>
2820
+ Backport from trunk r198683.
2821
+ 2013-05-07 Christophe Lyon <christophe.lyon@linaro.org>
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.
2828
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
2830
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
2832
+2013-06-06 Zhenqiang Chen <zhenqiang.chen@linaro.org>
2834
+ Backport from mainline (r199438, r199439)
2835
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2844
+ 2013-05-30 Bernd Schmidt <bernds@codesourcery.com>
2845
+ Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
2856
+2013-06-06 Kugan Vivekanandarajah <kuganv@linaro.org>
2858
+ Backport from mainline r198879:
2860
+ 2013-05-14 Chung-Lin Tang <cltang@codesourcery.com>
2862
+ * config/arm/arm.h (EPILOGUE_USES): Only return true
2863
+ for LR_REGNUM after epilogue_completed.
2865
+2013-06-05 Christophe Lyon <christophe.lyon@linaro.org>
2867
+ Backport from trunk r199652,199653,199656,199657,199658.
2869
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
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):
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.
2879
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
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>):
2893
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
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
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):
2906
+ * config/aarch64/constraints.md (Dn): Update arguments.
2908
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
2910
+ * config/aarch64/aarch64.c (aarch64_simd_valid_immediate): No
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):
2918
+ * config/aarch64/constraints.md (Dn): Update call.
2920
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
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.
2928
+2013-06-04 Christophe Lyon <christophe.lyon@linaro.org>
2930
+ Backport from trunk r199261.
2931
+ 2013-05-23 Christian Bruel <christian.bruel@st.com>
2934
+ * config/arm/arm.c (arm_dwarf_register_span): Do not use dbx number.
2936
+2013-06-03 Christophe Lyon <christophe.lyon@linaro.org>
2938
+ Backport from trunk
2939
+ r198890,199254,199259,199260,199293,199407,199408,199454,199544,199545.
2941
+ 2013-05-31 Marcus Shawcroft <marcus.shawcroft@arm.com>
2943
+ * config/aarch64/aarch64.c (aarch64_load_symref_appropriately):
2944
+ Remove un-necessary braces.
2946
+ 2013-05-31 Marcus Shawcroft <marcus.shawcroft@arm.com>
2948
+ * config/aarch64/aarch64.c (aarch64_classify_symbol):
2949
+ Use SYMBOL_TINY_ABSOLUTE for AARCH64_CMODEL_TINY_PIC.
2951
+ 2013-05-30 Ian Bolton <ian.bolton@arm.com>
2953
+ * config/aarch64/aarch64.md (insv<mode>): New define_expand.
2954
+ (*insv_reg<mode>): New define_insn.
2956
+ 2012-05-29 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
2957
+ Marcus Shawcroft <marcus.shawcroft@arm.com>
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.
2969
+ 2013-05-29 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
2970
+ Marcus Shawcroft <marcus.shawcroft@arm.com>
2972
+ * config/aarch64/aarch64.c (aarch64_classify_symbol): Remove comment.
2973
+ Refactor if/switch. Replace gcc_assert with if.
2975
+ 2013-05-24 Ian Bolton <ian.bolton@arm.com>
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.
2982
+ 2013-05-23 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
2983
+ Marcus Shawcroft <marcus.shawcroft@arm.com>
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.
2989
+ 2013-05-23 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
2990
+ Marcus Shawcroft <marcus.shawcroft@arm.com>
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.
2997
+ 2013-05-23 Vidya Praveen <vidyapraveen@arm.com>
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.
3005
+ 2013-05-14 James Greenhalgh <james.greenhalgh@arm.com>
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.
3017
+2013-05-29 Christophe Lyon <christophe.lyon@linaro.org>
3019
+ Backport from trunk r198928,198973,199203.
3020
+ 2013-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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.
3028
+ 2013-05-16 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
3031
+ * config/arm/arm.c (arm_function_ok_for_sibcall): Add check
3034
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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
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
3049
+2013-05-28 Christophe Lyon <christophe.lyon@linaro.org>
3051
+ Backport from trunk r198680.
3052
+ 2013-05-07 Sofiane Naci <sofiane.naci@arm.com>
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.
3065
+2013-05-28 Christophe Lyon <christophe.lyon@linaro.org>
3067
+ Backport from trunk r198497-198500.
3068
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
3097
+ (sur): Add UNSPEC_SADDV, UNSPEC_UADDV.
3099
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
3101
+ * config/aarch64/arm_neon.h
3102
+ (v<max,min><nm><q><v>_<sfu><8, 16, 32, 64>): Rewrite using builtins.
3104
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
3106
+ * config/aarch64/aarch64-builtins
3107
+ (aarch64_gimple_fold_builtin): Fold reduc_<su><maxmin>_ builtins.
3109
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
3120
+ (smax): Update for V2SF, V4SF and V2DF modes.
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.
3137
+ (su): Add mappings for smax, smin, umax, umin.
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.
3148
+2013-05-28 Christophe Lyon <christophe.lyon@linaro.org>
3150
+ Backport from trunk r199241.
3151
+ 2013-05-23 James Greenhalgh <james.greenhalgh@arm.com>
3153
+ * config/aarch64/aarch64-simd.md
3154
+ (aarch64_cm<optab>di): Add clobber of CC_REGNUM to unsplit pattern.
3156
+2013-05-23 Christophe Lyon <christophe.lyon@linaro.org>
3158
+ Backport from trunk r198970.
3159
+ 2013-05-16 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3167
+2013-05-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3169
+ * LINARO-VERSION: Bump version number.
3171
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3173
+ GCC Linaro 4.8-2013.05 released.
3175
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3177
+ Backport from trunk r198677.
3178
+ 2013-05-07 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3180
+ * config/aarch64/aarch64.md
3181
+ (cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>): Restrict the
3182
+ shift value between 0-4.
3184
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3186
+ Backport from trunk r198574-198575.
3187
+ 2013-05-03 Vidya Praveen <vidyapraveen@arm.com>
3189
+ * config/aarch64/aarch64-simd.md (simd_fabd): Correct the description.
3191
+ 2013-05-03 Vidya Praveen <vidyapraveen@arm.com>
3193
+ * config/aarch64/aarch64-simd.md (*fabd_scalar<mode>3): Support
3194
+ scalar form of FABD instruction.
3196
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3198
+ Backport from trunk r198490-198496
3199
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
3206
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
3208
+ * config/aarch64/aarch64-simd.md (*aarch64_fac<optab><mode>): New.
3209
+ * config/aarch64/iterators.md (FAC_COMPARISONS): New.
3211
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
3219
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
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.
3233
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
3235
+ * config/aarch64/aarch64-simd-builtins.def (cmhs): Rename to...
3237
+ (cmhi): Rename to...
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
3247
+ (unspec): Remove UNSPEC_CM<EQ, LE, LT, GE, GT, HS, HI, TST>.
3248
+ (COMPARISONS): New.
3249
+ (UCOMPARISONS): Likewise.
3250
+ (optab): Add missing comparisons.
3252
+ (cmp_1): Likewise.
3253
+ (cmp_2): Likewise.
3256
+ (VCMP_S): Likewise.
3257
+ (VCMP_U): Likewise.
3258
+ (V_cmp_result): Add DF, SF modes.
3259
+ (v_cmp_result): Likewise.
3261
+ (vmtype): Likewise.
3262
+ * config/aarch64/predicates.md (aarch64_reg_or_fp_zero): New.
3264
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3266
+ Backport from trunk r198191.
3267
+ 2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
3269
+ * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add simd attribute.
3271
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@lianro.org>
3273
+ Backport from trunk r197838.
3274
+ 2013-04-11 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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
3281
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3283
+ Backport from trunk r198019.
3284
+ 2013-04-16 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3286
+ * config/aarch64/aarch64.md (*adds_mul_imm_<mode>): New pattern.
3287
+ (*subs_mul_imm_<mode>): New pattern.
3289
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3291
+ Backport from trunk r198424-198425.
3292
+ 2013-04-29 Ian Bolton <ian.bolton@arm.com>
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.
3298
+ 2013-04-29 Ian Bolton <ian.bolton@arm.com>
3300
+ * common/config/aarch64/aarch64-common.c: Enable REE pass at O2
3301
+ or higher by default.
3303
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3305
+ Backport from trunk r198412.
3306
+ 2013-04-29 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
3308
+ * config/arm/arm.md (store_minmaxsi): Use only when
3309
+ optimize_insn_for_size_p.
3311
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3313
+ Backport from trunk 198394,198396-198400,198402-198404.
3314
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
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.
3326
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
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.
3336
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
3338
+ * config/aarch64/aarch64-builtins.c
3339
+ (aarch64_builtin_vectorized_function): Vectorize over ifloorf,
3340
+ iceilf, lround, iroundf.
3342
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
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.
3356
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
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.
3369
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
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...
3378
+ (frintm): Rename to...
3380
+ (frinti): Rename to...
3381
+ (nearbyint): ...this.
3382
+ (frintx): Rename to...
3384
+ (frinta): Rename to...
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.
3394
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3396
+ Backport from trunk r198302-198306,198316.
3397
+ 2013-04-25 James Greenhalgh <james.greenhalgh@arm.com>
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.
3404
+ 2013-04-25 James Greenhalgh <jame.greenhalgh@arm.com>
3406
+ * config/aarch64/aarch64-simd.md (neg<mode>2): Use VDQ iterator.
3408
+ 2013-04-25 James Greenhalgh <james.greenhalgh@arm.com>
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.
3418
+ 2013-04-25 James Greenhalgh <james.greenhalgh@arm.com>
3419
+ Tejas Belagod <tejas.belagod@arm.com>
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.
3429
+ 2013-04-25 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3431
+ * config/aarch64/aarch64.md
3432
+ (*cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>): New pattern.
3434
+ 2013-04-25 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3436
+ * config/aarch64/aarch64.md (*ngc<mode>): New pattern.
3437
+ (*ngcsi_uxtw): New pattern.
3439
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3441
+ Backport from trunk 198298.
3442
+ 2013-04-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
3443
+ Julian Brown <julian@codesourcery.com>
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
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
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.
3482
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3484
+ Backport from trunk r198136-198137,198142,198176.
3485
+ 2013-04-23 Andreas Schwab <schwab@linux-m68k.org>
3487
+ * coretypes.h (gimple_stmt_iterator): Add struct to make
3488
+ compatible with C.
3490
+ 2013-04-22 James Greenhalgh <james.greenhalgh@arm.com>
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.
3506
+ 2013-04-22 James Greenhalgh <james.greenhalgh@arm.com>
3508
+ * config/aarch64/aarch64-builtins.c
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.
3523
+ 2013-04-22 James Greenhalgh <james.greenhalgh@arm.com>
3525
+ * config/aarch64/aarch64-builtins.c
3526
+ (aarch64_simd_builtin_type_mode): Handle SF types.
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.
3546
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3548
+ Backport from trunk r198030.
3549
+ 2013-04-17 Greta Yorsh <Greta.Yorsh at arm.com>
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.
3556
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3558
+ Backport from trunk r198020.
3559
+ 2013-04-16 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3561
+ * config/aarch64/aarch64.md (*adds_<optab><mode>_multp2):
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.
3567
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3569
+ Backport from trunk r198004,198029.
3570
+ 2013-04-17 Greta Yorsh <Greta.Yorsh at arm.com>
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.
3576
+ 2013-04-16 Greta Yorsh <Greta.Yorsh at arm.com>
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.
3588
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3590
+ Backport from trunk r197965.
3591
+ 2013-04-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
3603
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3605
+ Backport from trunk r197925.
3606
+ 2013-04-12 Greta Yorsh <Greta.Yorsh@arm.com>
3608
+ * config/arm/arm.md (mov_scc,mov_negscc,mov_notscc): Convert
3609
+ define_insn into define_insn_and_split and emit movsicc patterns.
3611
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3613
+ Backport from trunk r197807.
3614
+ 2013-04-11 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
3616
+ * config/aarch64/aarch64.h (REVERSIBLE_CC_MODE): Define.
3618
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3620
+ Backport from trunk r197642.
3621
+ 2013-04-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
3623
+ * config/arm/arm.md (minmax_arithsi_non_canon): New pattern.
3625
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3627
+ Backport from trunk r197530,197921.
3628
+ 2013-04-12 Greta Yorsh <Greta.Yorsh@arm.com>
3630
+ * config/arm/arm.c (gen_operands_ldrd_strd): Initialize "base".
3632
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3647
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3649
+ Backport of trunk r197518-197522,197526-197528.
3650
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3656
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3665
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
3667
+ * config/arm/arm.md (negdi_extendsidi): New pattern.
3668
+ (negdi_zero_extendsidi): Likewise.
3670
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3677
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3684
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
3691
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
3693
+ * config/arm/arm.md (incscc,arm_incscc,decscc,arm_decscc): Delete.
3695
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
3697
+ * config/arm/arm.md (addsi3_carryin_<optab>): Set attribute predicable.
3698
+ (addsi3_carryin_alt2_<optab>,addsi3_carryin_shift_<optab>): Likewise.
3700
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3702
+ Backport of trunk r197517.
3703
+ 2013-04-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
3705
+ * config/arm/arm.c (arm_expand_builtin): Change fcode
3706
+ type to unsigned int.
3708
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3710
+ Backport of trunk r197513.
3711
+ 2013-04-05 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
3713
+ * doc/invoke.texi (ARM Options): Document cortex-a53 support.
3715
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3717
+ Backport of trunk r197489-197491.
3718
+ 2013-04-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
3726
+ 2013-04-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
3736
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3738
+ Backport of trunk 196795-196797,196957
3739
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
3741
+ * config/aarch64/aarch64.md (*sub<mode>3_carryin): New pattern.
3742
+ (*subsi3_carryin_uxtw): Likewise.
3744
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
3746
+ * config/aarch64/aarch64.md (*ror<mode>3_insn): New pattern.
3747
+ (*rorsi3_insn_uxtw): Likewise.
3749
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
3751
+ * config/aarch64/aarch64.md (*extr<mode>5_insn): New pattern.
3752
+ (*extrsi5_insn_uxtw): Likewise.
3754
+2013-04-10 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3756
+ * LINARO-VERSION: Bump version number.
3758
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3760
+ * GCC Linaro 4.8-2013.04 released.
3762
+ * LINARO-VERSION: New file.
3763
+ * configure.ac: Add Linaro version string.
3764
+ * configure: Regenerate.
3766
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3768
+ Backport of trunk r197346.
3769
+ 2013-04-02 Ian Caulfield <ian.caulfield@arm.com>
3770
+ Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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.
3782
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3784
+ Backport of trunk r197342.
3785
+ 2013-04-02 Sofiane Naci <sofiane.naci@arm.com>
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.
3791
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3793
+ Backport of trunk r197341.
3794
+ 2013-04-02 Sofiane Naci <sofiane.naci@arm.com>
3796
+ * config/aarch64/aarch64.md (*mov<mode>_aarch64): Add alternatives for
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.
3805
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3807
+ Backport from trunk r197207.
3808
+ 2013-03-28 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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.
3815
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3817
+ Backport from trunk r197153.
3818
+ 2013-03-27 Terry Guo <terry.guo@arm.com>
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.
3825
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3827
+ Backport from trunk r197052.
3828
+ 2013-03-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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
3835
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3837
+ Backport from trunk r197046.
3838
+ 2013-03-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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
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.
3860
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3862
+ Backport from trunk r196876.
3863
+ 2013-03-21 Christophe Lyon <christophe.lyon@linaro.org>
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
3879
+ (arch_enabled): Handle new arch types. Remove support for onlya8
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
3887
+ * doc/invoke.texi (-mneon-for-64bits): Document.
3889
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3891
+ Backport from trunk r196858.
3892
+ 2013-03-21 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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.
3899
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
3901
+ Backport from trunk r196856.
3902
+ 2013-03-21 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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
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 } */
3918
+foo (float *output, float *input)
3921
+ /* Vectorizable. */
3922
+ for (i = 0; i < N; i++)
3923
+ output[i] = __builtin_floorf (input[i]);
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
3931
+/* Test the `vcvtf32_f16' ARM Neon intrinsic. */
3932
+/* This file was autogenerated by neon-testgen. */
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 } */
3939
+#include "arm_neon.h"
3941
+void test_vcvtf32_f16 (void)
3943
+ float32x4_t out_float32x4_t;
3944
+ float16x4_t arg0_float16x4_t;
3946
+ out_float32x4_t = vcvt_f32_f16 (arg0_float16x4_t);
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
3954
+/* Test the `vcvtf16_f32' ARM Neon intrinsic. */
3955
+/* This file was autogenerated by neon-testgen. */
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 } */
3962
+#include "arm_neon.h"
3964
+void test_vcvtf16_f32 (void)
3966
+ float16x4_t out_float16x4_t;
3967
+ float32x4_t arg0_float32x4_t;
3969
+ out_float16x4_t = vcvt_f16_f32 (arg0_float32x4_t);
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
3977
+/* { dg-do compile } */
3978
+/* { dg-options "-O1" } */
3981
+muld (unsigned long long X, unsigned long long Y)
3983
+ unsigned long long mask = 0xffffffffull;
3984
+ return (X & mask) * (Y & mask);
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
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)
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
4005
+/* { dg-do compile } */
4006
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4007
+/* { dg-options "-O2" } */
4008
+/* { dg-add-options arm_v8_vfp } */
4011
+foo (double x, double y)
4013
+ volatile int i = 0;
4014
+ return i > 0 ? x : y;
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
4021
+/* { dg-do compile } */
4022
+/* { dg-options "-O1" } */
4024
+unsigned long long or64 (unsigned long long input)
4026
+ return input | 0x200000004ULL;
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
4033
+/* { dg-do compile } */
4034
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4035
+/* { dg-options "-O2" } */
4036
+/* { dg-add-options arm_arch_v8a } */
4038
+#include "../aarch64/atomic-op-relaxed.x"
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
4046
+/* { dg-do compile } */
4047
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4048
+/* { dg-options "-O2" } */
4049
+/* { dg-add-options arm_v8_vfp } */
4052
+foo (float x, float y)
4054
+ volatile int i = 0;
4055
+ return i >= 0 ? x : y;
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
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)
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
4074
+/* { dg-do compile } */
4075
+/* { dg-require-effective-target arm32 } */
4076
+/* { dg-options "-O2" } */
4078
+signed long long extendsidi_negsi (signed int x)
4086
+ mov r1, r0, asr #31
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
4094
+/* { dg-do compile } */
4095
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4096
+/* { dg-options "-O2" } */
4097
+/* { dg-add-options arm_arch_v8a } */
4099
+#include "../aarch64/atomic-comp-swap-release-acquire.x"
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
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" } } */
4111
+int (*indirect_func)();
4113
+int indirect_call()
4115
+ return indirect_func();
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
4120
+/* { dg-do compile } */
4121
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4122
+/* { dg-options "-O2" } */
4123
+/* { dg-add-options arm_arch_v8a } */
4125
+#include "../aarch64/atomic-op-seq_cst.x"
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
4133
+/* { dg-do compile } */
4134
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4135
+/* { dg-options "-O2" } */
4136
+/* { dg-add-options arm_v8_vfp } */
4139
+foo (double x, double y)
4141
+ volatile int i = 0;
4142
+ return i >= 0 ? x : y;
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
4149
+/* { dg-do compile } */
4150
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4151
+/* { dg-options "-O2" } */
4152
+/* { dg-add-options arm_arch_v8a } */
4154
+#include "../aarch64/atomic-op-consume.x"
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
4162
+/* { dg-do compile } */
4163
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4164
+/* { dg-options "-O2" } */
4165
+/* { dg-add-options arm_arch_v8a } */
4167
+#include "../aarch64/atomic-op-char.x"
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
4175
+/* { dg-do compile } */
4176
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4177
+/* { dg-options "-O2" } */
4178
+/* { dg-add-options arm_v8_vfp } */
4181
+foo (float x, float y)
4183
+ volatile int i = 0;
4184
+ return i != 0 ? x : y;
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
4191
+/* { dg-do compile } */
4192
+/* { dg-require-effective-target arm32 } */
4193
+/* { dg-options "-O2" } */
4195
+signed long long zero_extendsidi_negsi (unsigned int x)
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
4210
+/* { dg-do compile } */
4211
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4212
+/* { dg-options "-O2" } */
4213
+/* { dg-add-options arm_v8_vfp } */
4216
+foo (float x, float y)
4218
+ return !__builtin_isunordered (x, y) ? x : y;
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
4225
+/* { dg-do compile } */
4226
+/* { dg-options "-O2" } */
4228
+#define MAX(a, b) (a > b ? a : b)
4230
+foo (int a, int b, int c)
4232
+ return c - MAX (a, b);
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
4239
+/* { dg-do compile } */
4240
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4241
+/* { dg-options "-O2" } */
4242
+/* { dg-add-options arm_arch_v8a } */
4244
+#include "../aarch64/atomic-op-release.x"
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
4252
+/* { dg-do compile } */
4253
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4254
+/* { dg-options "-O2" } */
4255
+/* { dg-add-options arm_v8_vfp } */
4258
+foo (float x, float y)
4260
+ return __builtin_isunordered (x, y) ? x : y;
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
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 } */
4275
+foo (float *output, float *input)
4278
+ /* Vectorizable. */
4279
+ for (i = 0; i < N; i++)
4280
+ output[i] = __builtin_roundf (input[i]);
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
4288
+/* Check that Neon is *not* used by default to handle 64-bits scalar
4291
+/* { dg-do compile } */
4292
+/* { dg-require-effective-target arm_neon_ok } */
4293
+/* { dg-options "-O2" } */
4294
+/* { dg-add-options arm_neon } */
4296
+typedef long long i64;
4297
+typedef unsigned long long u64;
4298
+typedef unsigned int u32;
4301
+/* Unary operators */
4302
+#define UNARY_OP(name, op) \
4303
+ void unary_##name(u64 *a, u64 *b) { *a = op (*b + 0x1234567812345678ULL) ; }
4305
+/* Binary operators */
4306
+#define BINARY_OP(name, op) \
4307
+ void binary_##name(u64 *a, u64 *b, u64 *c) { *a = *b op *c ; }
4309
+/* Unsigned shift */
4310
+#define SHIFT_U(name, op, amount) \
4311
+ void ushift_##name(u64 *a, u64 *b, int c) { *a = *b op amount; }
4314
+#define SHIFT_S(name, op, amount) \
4315
+ void sshift_##name(i64 *a, i64 *b, int c) { *a = *b op amount; }
4325
+SHIFT_U(right1, >>, 1)
4326
+SHIFT_U(right2, >>, 2)
4327
+SHIFT_U(right5, >>, 5)
4328
+SHIFT_U(rightn, >>, c)
4330
+SHIFT_S(right1, >>, 1)
4331
+SHIFT_S(right2, >>, 2)
4332
+SHIFT_S(right5, >>, 5)
4333
+SHIFT_S(rightn, >>, c)
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
4349
+char dest[16] = { 0 };
4351
void aligned_dest (char *src)
4354
/* Expect a multi-word store for the main part of the copy, but subword
4355
loads/stores for the remainder. */
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
4368
+/* { dg-do compile } */
4369
+/* { dg-options "-O1" } */
4371
+unsigned long long xor64 (unsigned long long input)
4373
+ return input ^ 0x200000004ULL;
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
4380
+/* { dg-do compile } */
4381
+/* { dg-require-effective-target arm32 } */
4382
+/* { dg-options "-O2" } */
4384
+signed long long negdi_zero_extendsidi (unsigned int x)
4386
+ return -((signed long long) x);
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
4400
+/* { dg-do compile } */
4401
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4402
+/* { dg-options "-O2" } */
4403
+/* { dg-add-options arm_arch_v8a } */
4405
+#include "../aarch64/atomic-op-acq_rel.x"
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
4413
+/* { dg-do compile } */
4414
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4415
+/* { dg-options "-O2" } */
4416
+/* { dg-add-options arm_v8_vfp } */
4419
+foo (float x, float y)
4421
+ volatile int i = 0;
4422
+ return i < 0 ? x : y;
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
4429
+/* { dg-do compile } */
4430
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4431
+/* { dg-options "-O2" } */
4432
+/* { dg-add-options arm_v8_vfp } */
4435
+foo (double x, double y)
4437
+ volatile int i = 0;
4438
+ return i != 0 ? x : y;
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
4445
+/* { dg-do compile } */
4446
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4447
+/* { dg-options "-O2" } */
4448
+/* { dg-add-options arm_v8_vfp } */
4451
+foo (double x, double y)
4453
+ return !__builtin_isunordered (x, y) ? x : y;
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
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 } */
4468
+foo (float *output, float *input)
4471
+ /* Vectorizable. */
4472
+ for (i = 0; i < N; i++)
4473
+ output[i] = __builtin_truncf (input[i]);
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
4481
+/* { dg-do compile } */
4482
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4483
+/* { dg-options "-O2" } */
4484
+/* { dg-add-options arm_v8_vfp } */
4487
+foo (float x, float y)
4489
+ volatile int i = 0;
4490
+ return i == 0 ? x : y;
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
4497
+/* { dg-do compile } */
4498
+/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
4499
+/* { dg-skip-if "" { arm_thumb1 } } */
4501
+extern char *__ctype_ptr__;
4503
+unsigned char * foo(unsigned char *ReadPtr)
4508
+ while (!(((__ctype_ptr__+sizeof(""[*ReadPtr]))[(int)(*ReadPtr)])&04) == (!(0)))
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
4519
+/* { dg-do compile } */
4520
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4521
+/* { dg-options "-O2" } */
4522
+/* { dg-add-options arm_v8_vfp } */
4525
+foo (double x, double y)
4527
+ return __builtin_isunordered (x, y) ? x : y;
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
4538
+char src[16] = {0};
4540
void aligned_src (char *dest)
4543
/* Expect a multi-word load for the main part of the copy, but subword
4544
loads/stores for the remainder. */
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
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" } } */
4570
--- a/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c
4571
+++ b/src/gcc/testsuite/gcc.target/arm/anddi3-opt2.c
4573
+/* { dg-do compile } */
4574
+/* { dg-options "-O1" } */
4576
+long long muld(long long X, long long Y)
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
4585
+/* { dg-do compile } */
4586
+/* { dg-require-effective-target arm32 } */
4587
+/* { dg-options "-O2" } */
4589
+signed long long negdi_extendsidi (signed int x)
4591
+ return -((signed long long) x);
4596
+ mov r1, r0, asr #31
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
4604
+/* { dg-do compile } */
4605
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4606
+/* { dg-options "-O2" } */
4607
+/* { dg-add-options arm_v8_vfp } */
4610
+foo (double x, double y)
4612
+ volatile int i = 0;
4613
+ return i < 0 ? x : y;
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
4625
+char src[16] = { 0 };
4626
+char dest[16] = { 0 };
4628
void aligned_both (void)
4632
/* We know both src and dest to be aligned: expect multiword loads/stores. */
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
4645
+/* { dg-do compile } */
4646
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4647
+/* { dg-options "-O2" } */
4648
+/* { dg-add-options arm_v8_vfp } */
4651
+foo (double x, double y)
4653
+ volatile int i = 0;
4654
+ return i == 0 ? x : y;
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
4661
+/* { dg-do compile } */
4662
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4663
+/* { dg-options "-O2" } */
4664
+/* { dg-add-options arm_arch_v8a } */
4666
+#include "../aarch64/atomic-op-acquire.x"
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
4674
+/* { dg-do compile } */
4675
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4676
+/* { dg-options "-O2" } */
4677
+/* { dg-add-options arm_v8_vfp } */
4680
+foo (float x, float y)
4682
+ volatile int i = 0;
4683
+ return i <= 0 ? x : y;
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
4690
+/* { dg-do compile } */
4691
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4692
+/* { dg-options "-O2" } */
4693
+/* { dg-add-options arm_arch_v8a } */
4695
+#include "../aarch64/atomic-op-int.x"
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
4703
+/* { dg-do compile } */
4704
+/* { dg-require-effective-target arm_arch_v8a_ok } */
4705
+/* { dg-options "-O2" } */
4706
+/* { dg-add-options arm_arch_v8a } */
4708
+#include "../aarch64/atomic-op-short.x"
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
4716
/* { dg-options "-O2 -march=armv5te" } */
4717
/* { dg-final { scan-assembler "blx" } } */
4719
-int (*indirect_func)();
4720
+int (*indirect_func)(int x);
4724
- return indirect_func();
4725
+ return indirect_func(20) + indirect_func (40);
4727
--- a/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c
4728
+++ b/src/gcc/testsuite/gcc.target/arm/vect-rounding-ceilf.c
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 } */
4738
+foo (float *output, float *input)
4741
+ /* Vectorizable. */
4742
+ for (i = 0; i < N; i++)
4743
+ output[i] = __builtin_ceilf (input[i]);
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
4751
+/* { dg-do compile } */
4752
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4753
+/* { dg-options "-O2" } */
4754
+/* { dg-add-options arm_v8_vfp } */
4757
+foo (double x, double y)
4759
+ volatile int i = 0;
4760
+ return i <= 0 ? x : y;
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
4767
+/* { dg-do compile } */
4768
+/* { dg-require-effective-target arm_v8_vfp_ok } */
4769
+/* { dg-options "-O2" } */
4770
+/* { dg-add-options arm_v8_vfp } */
4773
+foo (float x, float y)
4775
+ volatile int i = 0;
4776
+ return i > 0 ? x : y;
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
4784
+/* PR target/58578 */
4785
+/* { dg-do run } */
4786
+/* { dg-options "-O1" } */
4788
+#include <stdlib.h>
4796
+typedef __my_st_t *__my_st_ptr;
4799
+_test_fn (__my_st_ptr y, const __my_st_ptr xt)
4802
+ if (xt->_exp != -2147483647L)
4804
+ (y->_flag = xt->_flag);
4808
+ __my_st_ptr _y = y;
4809
+ long _err1 = -2 * xt->_exp;
4813
+ unsigned long _err = (unsigned long) _err1 + _err2;
4814
+ if (__builtin_expect(!!(_err > _y->_prec + 1), 0))
4831
+ if (_test_fn (&x, &y))
4837
--- a/src/gcc/testsuite/gcc.target/arm/pr57637.c
4838
+++ b/src/gcc/testsuite/gcc.target/arm/pr57637.c
4840
+/* { dg-do run } */
4841
+/* { dg-options "-O2 -fno-inline" } */
4843
+typedef struct _GtkCssStyleProperty GtkCssStyleProperty;
4845
+struct _GtkCssStyleProperty
4847
+ int *initial_value;
4849
+ unsigned int inherit :1;
4850
+ unsigned int animated :1;
4851
+ unsigned int affects_size :1;
4852
+ unsigned int affects_font :1;
4854
+ int * parse_value;
4855
+ int * query_value;
4856
+ int * assign_value;
4860
+g_assertion_message_expr (const char *domain,
4864
+ const char *expr) __attribute__((__noreturn__));
4867
+g_assertion_message_expr (const char *domain,
4873
+ __builtin_abort ();
4876
+get_id (GtkCssStyleProperty *property)
4881
+_gtk_css_style_property_get_type ()
4886
+GtkCssStyleProperty *
4887
+g_object_new (int object_type,
4888
+ const char *first_property_name,
4891
+ return (GtkCssStyleProperty *) __builtin_malloc (sizeof (GtkCssStyleProperty));
4895
+ INHERIT = (1 << 0),
4896
+ ANIMATED = (1 << 1),
4897
+ RESIZE = (1 << 2),
4899
+} GtkStylePropertyFlags;
4903
+gtk_css_style_property_register (const char * name,
4909
+ int *assign_value,
4910
+ int *initial_value)
4912
+ GtkCssStyleProperty *node;
4916
+ if (__builtin_expect (__extension__ (
4918
+ int _g_boolean_var_;
4919
+ if (initial_value != ((void *)0))
4920
+ _g_boolean_var_ = 1;
4922
+ _g_boolean_var_ = 0;
4928
+ g_assertion_message_expr ("Gtk",
4929
+ "gtkcssstylepropertyimpl.c",
4931
+ ((const char*) (__PRETTY_FUNCTION__)),
4932
+ "initial_value != NULL");
4937
+ if (__builtin_expect (__extension__ (
4939
+ int _g_boolean_var_;
4940
+ if (parse_value != ((void *)0))
4941
+ _g_boolean_var_ = 1;
4943
+ _g_boolean_var_ = 0;
4949
+ g_assertion_message_expr ("Gtk",
4950
+ "gtkcssstylepropertyimpl.c",
4952
+ ((const char*) (__PRETTY_FUNCTION__)),
4953
+ "parse_value != NULL");
4958
+ if (__builtin_expect (__extension__ (
4960
+ int _g_boolean_var_;
4961
+ if (value_type == ((int) ((1) << (2)))
4962
+ || query_value != ((void *)0))
4963
+ _g_boolean_var_ = 1;
4965
+ _g_boolean_var_ = 0;
4971
+ g_assertion_message_expr ("Gtk",
4972
+ "gtkcssstylepropertyimpl.c",
4973
+ 87, ((const char*) (__PRETTY_FUNCTION__)),
4974
+ "value_type == NONE || query_value != NULL");
4977
+ /* FLAGS is changed in a cond_exec instruction with pr57637. */
4983
+ if (__builtin_expect (__extension__ (
4985
+ int _g_boolean_var_;
4986
+ if (value_type == ((1) << (2))
4987
+ || assign_value != ((void *)0))
4988
+ _g_boolean_var_ = 1;
4990
+ _g_boolean_var_ = 0;
4996
+ g_assertion_message_expr ("Gtk",
4997
+ "gtkcssstylepropertyimpl.c",
4998
+ 88, ((const char*) (__PRETTY_FUNCTION__)),
4999
+ "value_type == NONE || assign_value != NULL");
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,
5012
+ node->parse_value = parse_value;
5013
+ node->query_value = query_value;
5014
+ node->assign_value = assign_value;
5018
+ if (__builtin_expect (__extension__ (
5020
+ int _g_boolean_var_;
5021
+ if (get_id (node) == expected_id)
5022
+ _g_boolean_var_ = 1;
5024
+ _g_boolean_var_ = 0;
5030
+ g_assertion_message_expr ("Gtk",
5031
+ "gtkcssstylepropertyimpl.c",
5033
+ ((const char*) (__PRETTY_FUNCTION__)),
5034
+ "get_id (node) == expected_id");
5040
+ gtk_css_style_property_register ("test", 1, 4, 15, &t, &t, &t, &t);
5043
+ __builtin_abort ();
5046
--- a/src/gcc/testsuite/gcc.target/aarch64/insv_2.c
5047
+++ b/src/gcc/testsuite/gcc.target/aarch64/insv_2.c
5049
+/* { dg-do run { target aarch64*-*-* } } */
5050
+/* { dg-options "-O2 --save-temps -fno-inline" } */
5051
+/* { dg-require-effective-target aarch64_big_endian } */
5053
+extern void abort (void);
5055
+typedef struct bitfield
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;
5067
+ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 56, 8" } } */
5075
+ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 43, 5" } } */
5083
+ /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 16" } } */
5091
+ /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 272678883688448" } } */
5099
+ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -272678883688449" } } */
5106
+main (int argc, char** argv)
5108
+ static bitfield a;
5109
+ bitfield b = bfi1 (a);
5110
+ bitfield c = bfi2 (b);
5111
+ bitfield d = movk (c);
5119
+ if (d.sixteen != 7531)
5123
+ if (d.five != 0x1f)
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
5137
+/* { dg-do run } */
5138
+/* { dg-options "-O3 --save-temps" } */
5140
+#include <arm_neon.h>
5142
+#include <stdlib.h>
5145
+test_frecps_float32_t (void)
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);
5155
+ return fabs (step - reciprocal) < 0.001;
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\]+" } } */
5162
+test_frecps_float32x2_t (void)
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);
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);
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;
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" } } */
5189
+test_frecps_float32x4_t (void)
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);
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);
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;
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" } } */
5220
+test_frecps_float64_t (void)
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);
5230
+ return fabs (step - reciprocal) < 0.001;
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\]+" } } */
5237
+test_frecps_float64x2_t (void)
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);
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);
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;
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" } } */
5264
+main (int argc, char **argv)
5266
+ if (!test_frecps_float32_t ())
5268
+ if (!test_frecps_float32x2_t ())
5270
+ if (!test_frecps_float32x4_t ())
5272
+ if (!test_frecps_float64_t ())
5274
+ if (!test_frecps_float64x2_t ())
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
5284
+/* { dg-do run } */
5285
+/* { dg-options "-O2 --save-temps -fno-inline" } */
5287
+extern void abort (void);
5290
+ands_si_test1 (int a, int b, int c)
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 } } */
5303
+ands_si_test2 (int a, int b, int c)
5305
+ int d = a & 0x99999999;
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" } } */
5316
+ands_si_test3 (int a, int b, int c)
5318
+ int d = a & (b << 3);
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" } } */
5328
+typedef long long s64;
5331
+ands_di_test1 (s64 a, s64 b, s64 c)
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 } } */
5344
+ands_di_test2 (s64 a, s64 b, s64 c)
5346
+ s64 d = a & 0xaaaaaaaaaaaaaaaall;
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" } } */
5357
+ands_di_test3 (s64 a, s64 b, s64 c)
5359
+ s64 d = a & (b << 3);
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" } } */
5375
+ x = ands_si_test1 (29, 4, 5);
5379
+ x = ands_si_test1 (5, 2, 20);
5383
+ x = ands_si_test2 (29, 4, 5);
5387
+ x = ands_si_test2 (1024, 2, 20);
5391
+ x = ands_si_test3 (35, 4, 5);
5395
+ x = ands_si_test3 (5, 2, 20);
5399
+ y = ands_di_test1 (0x130000029ll,
5403
+ if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll))
5406
+ y = ands_di_test1 (0x5000500050005ll,
5407
+ 0x2111211121112ll,
5408
+ 0x0000000002020ll);
5409
+ if (y != 0x5000500052025ll)
5412
+ y = ands_di_test2 (0x130000029ll,
5415
+ if (y != ((0x130000029ll & 0xaaaaaaaaaaaaaaaall) + 0x320000004ll + 0x505050505ll))
5418
+ y = ands_di_test2 (0x540004100ll,
5421
+ if (y != (0x540004100ll + 0x805050205ll))
5424
+ y = ands_di_test3 (0x130000029ll,
5427
+ if (y != ((0x130000029ll & (0x064000008ll << 3))
5428
+ + 0x064000008ll + 0x505050505ll))
5431
+ y = ands_di_test3 (0x130002900ll,
5434
+ if (y != (0x130002900ll + 0x505050505ll))
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
5444
+/* { dg-do run } */
5445
+/* { dg-options "-O3 --save-temps" } */
5447
+#include <arm_neon.h>
5449
+extern void abort (void);
5450
+extern float fabsf (float);
5451
+extern double fabs (double);
5453
+#define NUM_TESTS 8
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};
5460
+#define TEST(TEST, CMP, SUFFIX, WIDTH, F) \
5462
+test_fca##TEST##SUFFIX##_float##WIDTH##_t (void) \
5466
+ uint##WIDTH##_t output[NUM_TESTS]; \
5468
+ for (i = 0; i < NUM_TESTS; i++) \
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; \
5477
+ for (i = 0; i < NUM_TESTS; i++) \
5479
+ output[i] = vca##TEST##SUFFIX##_f##WIDTH (input_##SUFFIX##1[i], \
5480
+ input_##SUFFIX##2[i]) \
5482
+ /* Inhibit autovectorization of our scalar test loop. */ \
5483
+ asm volatile ("" : : : "memory"); \
5486
+ for (i = 0; i < NUM_TESTS; i++) \
5487
+ ret |= output[i]; \
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\]+" } } */
5502
+main (int argc, char **argv)
5504
+ if (test_fcages_float32_t ())
5506
+ if (test_fcaged_float64_t ())
5508
+ if (test_fcagts_float32_t ())
5510
+ if (test_fcagtd_float64_t ())
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
5522
+atomic_fetch_add_ACQ_REL (int a)
5524
+ return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL);
5528
+atomic_fetch_sub_ACQ_REL (int a)
5530
+ return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL);
5534
+atomic_fetch_and_ACQ_REL (int a)
5536
+ return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL);
5540
+atomic_fetch_nand_ACQ_REL (int a)
5542
+ return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL);
5546
+atomic_fetch_xor_ACQ_REL (int a)
5548
+ return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL);
5552
+atomic_fetch_or_ACQ_REL (int a)
5554
+ return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL);
5556
--- a/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c
5557
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c
5559
+/* { dg-do run } */
5560
+/* { dg-options "-O3 -fno-inline -save-temps -fno-vect-cost-model" } */
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;
5579
+extern void abort ();
5582
+test_addS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c)
5585
+ for (i = 0; i < 4; i++)
5586
+ a[i] += (S64_t) b[i] * (S64_t) c[i];
5589
+/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.2d" } } */
5590
+/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.2d" } } */
5593
+test_addS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c)
5596
+ for (i = 0; i < 8; i++)
5597
+ a[i] += (S32_t) b[i] * (S32_t) c[i];
5600
+/* { dg-final { scan-assembler "smlal\tv\[0-9\]+\.4s" } } */
5601
+/* { dg-final { scan-assembler "smlal2\tv\[0-9\]+\.4s" } } */
5604
+test_addS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c)
5607
+ for (i = 0; i < 16; i++)
5608
+ a[i] += (S16_t) b[i] * (S16_t) c[i];
5612
+test_addS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c)
5615
+ for (i = 0; i < 16; i++)
5616
+ a[i] += (S16_t) -b[i] * (S16_t) -c[i];
5620
+test_addS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c)
5623
+ for (i = 0; i < 16; i++)
5624
+ a[i] -= (S16_t) b[i] * (S16_t) -c[i];
5628
+test_addS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c)
5631
+ for (i = 0; i < 16; i++)
5632
+ a[i] -= (S16_t) -b[i] * (S16_t) c[i];
5635
+/* { dg-final { scan-assembler-times "smlal\tv\[0-9\]+\.8h" 4 } } */
5636
+/* { dg-final { scan-assembler-times "smlal2\tv\[0-9\]+\.8h" 4 } } */
5639
+test_subS64_tS32_t4 (pS64_t a, pS32_t b, pS32_t c)
5642
+ for (i = 0; i < 4; i++)
5643
+ a[i] -= (S64_t) b[i] * (S64_t) c[i];
5646
+/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.2d" } } */
5647
+/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.2d" } } */
5650
+test_subS32_tS16_t8 (pS32_t a, pS16_t b, pS16_t c)
5653
+ for (i = 0; i < 8; i++)
5654
+ a[i] -= (S32_t) b[i] * (S32_t) c[i];
5657
+/* { dg-final { scan-assembler "smlsl\tv\[0-9\]+\.4s" } } */
5658
+/* { dg-final { scan-assembler "smlsl2\tv\[0-9\]+\.4s" } } */
5661
+test_subS16_tS8_t16 (pS16_t a, pS8_t b, pS8_t c)
5664
+ for (i = 0; i < 16; i++)
5665
+ a[i] -= (S16_t) b[i] * (S16_t) c[i];
5669
+test_subS16_tS8_t16_neg0 (pS16_t a, pS8_t b, pS8_t c)
5672
+ for (i = 0; i < 16; i++)
5673
+ a[i] += (S16_t) -b[i] * (S16_t) c[i];
5677
+test_subS16_tS8_t16_neg1 (pS16_t a, pS8_t b, pS8_t c)
5680
+ for (i = 0; i < 16; i++)
5681
+ a[i] += (S16_t) b[i] * (S16_t) -c[i];
5685
+test_subS16_tS8_t16_neg2 (pS16_t a, pS8_t b, pS8_t c)
5688
+ for (i = 0; i < 16; i++)
5689
+ a[i] += -((S16_t) b[i] * (S16_t) c[i]);
5693
+test_subS16_tS8_t16_neg3 (pS16_t a, pS8_t b, pS8_t c)
5696
+ for (i = 0; i < 16; i++)
5697
+ a[i] -= (S16_t) -b[i] * (S16_t) -c[i];
5700
+/* { dg-final { scan-assembler-times "smlsl\tv\[0-9\]+\.8h" 5 } } */
5701
+/* { dg-final { scan-assembler-times "smlsl2\tv\[0-9\]+\.8h" 5 } } */
5704
+test_addU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c)
5707
+ for (i = 0; i < 4; i++)
5708
+ a[i] += (U64_t) b[i] * (U64_t) c[i];
5711
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.2d" } } */
5712
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.2d" } } */
5715
+test_addU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c)
5718
+ for (i = 0; i < 8; i++)
5719
+ a[i] += (U32_t) b[i] * (U32_t) c[i];
5722
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.4s" } } */
5723
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.4s" } } */
5726
+test_addU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c)
5729
+ for (i = 0; i < 16; i++)
5730
+ a[i] += (U16_t) b[i] * (U16_t) c[i];
5733
+/* { dg-final { scan-assembler "umlal\tv\[0-9\]+\.8h" } } */
5734
+/* { dg-final { scan-assembler "umlal2\tv\[0-9\]+\.8h" } } */
5737
+test_subU64_tU32_t4 (pU64_t a, pU32_t b, pU32_t c)
5740
+ for (i = 0; i < 4; i++)
5741
+ a[i] -= (U64_t) b[i] * (U64_t) c[i];
5744
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.2d" } } */
5745
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.2d" } } */
5748
+test_subU32_tU16_t8 (pU32_t a, pU16_t b, pU16_t c)
5751
+ for (i = 0; i < 8; i++)
5752
+ a[i] -= (U32_t) b[i] * (U32_t) c[i];
5755
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.4s" } } */
5756
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.4s" } } */
5759
+test_subU16_tU8_t16 (pU16_t a, pU8_t b, pU8_t c)
5762
+ for (i = 0; i < 16; i++)
5763
+ a[i] -= (U16_t) b[i] * (U16_t) c[i];
5766
+/* { dg-final { scan-assembler "umlsl\tv\[0-9\]+\.8h" } } */
5767
+/* { dg-final { scan-assembler "umlsl2\tv\[0-9\]+\.8h" } } */
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 };
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 };
5779
+U64_t add_rU64[4] = { 0x6, 0x7, 0x2fffffffc, 0x2fffffffd };
5781
+U32_t add_rU32[8] =
5783
+ 0x6, 0x7, 0x2fffc, 0x2fffd,
5784
+ 0xa, 0xb, 0x30000, 0x30001
5787
+U16_t add_rU16[16] =
5789
+ 0x6, 0x7, 0x2fc, 0x2fd, 0xa, 0xb, 0x300, 0x301,
5790
+ 0xe, 0xf, 0x304, 0x305, 0x12, 0x13, 0x308, 0x309
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 };
5797
+S8_t neg_r[16] = { -6, -5, 8, 9, -2, -1, 12, 13, 2, 3, 16, 17, 6, 7, 20, 21 };
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 };
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 };
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 };
5812
+#define CHECK(T,N,AS,US) \
5815
+ for (i = 0; i < N; i++) \
5816
+ if (S##T##_ta[i] != AS##_r##US##T[i]) \
5821
+#define SCHECK(T,N,AS) CHECK(T,N,AS,S)
5822
+#define UCHECK(T,N,AS) CHECK(T,N,AS,U)
5824
+#define NCHECK(RES) \
5827
+ for (i = 0; i < 16; i++) \
5828
+ if (S16_ta[i] != RES[i]) \
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);
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);
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);
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
5887
+/* { dg-options "-O2 --save-temps" } */
5888
+/* { dg-do run } */
5890
+extern void abort (void);
5893
+test_si (int a, int b)
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);
5900
+test_di (long long a, long long b)
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);
5911
+ v = test_si (0x00000004, 0x30000000);
5912
+ if (v != 0x00000086)
5914
+ w = test_di (0x0001040040040004ll, 0x0070050066666666ll);
5915
+ if (w != 0x2002002000200380ll)
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
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
5934
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
5936
#define FTYPE double
5941
#include "vect-fcm.x"
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
5951
+/* { dg-do run } */
5952
+/* { dg-options "-O2 --save-temps -fno-inline" } */
5954
+extern void abort (void);
5955
+typedef long long s64;
5958
+adds_ext (s64 a, int b, int c)
5969
+adds_shift_ext (s64 a, int b, int c)
5971
+ s64 d = (a + ((s64)b << 3));
5984
+ x = adds_ext (0x13000002ll, 41, 15);
5985
+ if (x != 318767203)
5988
+ x = adds_ext (0x50505050ll, 29, 4);
5989
+ if (x != 1347440782)
5992
+ x = adds_ext (0x12121212121ll, 2, 14);
5993
+ if (x != 555819315)
5996
+ x = adds_shift_ext (0x123456789ll, 4, 12);
5997
+ if (x != 591751097)
6000
+ x = adds_shift_ext (0x02020202ll, 9, 8);
6001
+ if (x != 33686107)
6004
+ x = adds_shift_ext (0x987987987987ll, 23, 41);
6005
+ if (x != -2020050305)
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
6015
+/* { dg-do run } */
6016
+/* { dg-options "-O2 --save-temps -fno-inline" } */
6018
+extern void abort (void);
6021
+subs_si_test1 (int a, int b, int c)
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\]+" } } */
6034
+subs_si_test2 (int a, int b, int c)
6036
+ int d = a - 0xfff;
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" } } */
6047
+subs_si_test3 (int a, int b, int c)
6049
+ int d = a - (b << 3);
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" } } */
6059
+typedef long long s64;
6062
+subs_di_test1 (s64 a, s64 b, s64 c)
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\]+" } } */
6075
+subs_di_test2 (s64 a, s64 b, s64 c)
6077
+ s64 d = a - 0x1000ll;
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" } } */
6088
+subs_di_test3 (s64 a, s64 b, s64 c)
6090
+ s64 d = a - (b << 3);
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" } } */
6105
+ x = subs_si_test1 (29, 4, 5);
6109
+ x = subs_si_test1 (5, 2, 20);
6113
+ x = subs_si_test2 (29, 4, 5);
6117
+ x = subs_si_test2 (1024, 2, 20);
6121
+ x = subs_si_test3 (35, 4, 5);
6125
+ x = subs_si_test3 (5, 2, 20);
6129
+ y = subs_di_test1 (0x130000029ll,
6133
+ if (y != 0x63505052e)
6136
+ y = subs_di_test1 (0x5000500050005ll,
6137
+ 0x2111211121112ll,
6138
+ 0x0000000002020ll);
6139
+ if (y != 0x5000500052025)
6142
+ y = subs_di_test2 (0x130000029ll,
6145
+ if (y != 0x95504f532)
6148
+ y = subs_di_test2 (0x540004100ll,
6151
+ if (y != 0x1065053309)
6154
+ y = subs_di_test3 (0x130000029ll,
6157
+ if (y != 0x63505052e)
6160
+ y = subs_di_test3 (0x130002900ll,
6163
+ if (y != 0x635052e05)
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
6173
+/* { dg-do run } */
6174
+/* { dg-options "-O2 --save-temps -fno-inline" } */
6176
+extern void abort (void);
6179
+bics_si_test1 (int a, int b, int c)
6183
+ /* { dg-final { scan-assembler-times "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
6191
+bics_si_test2 (int a, int b, int c)
6193
+ int d = a & ~(b << 3);
6195
+ /* { dg-final { scan-assembler "bics\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
6202
+typedef long long s64;
6205
+bics_di_test1 (s64 a, s64 b, s64 c)
6209
+ /* { dg-final { scan-assembler-times "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
6217
+bics_di_test2 (s64 a, s64 b, s64 c)
6219
+ s64 d = a & ~(b << 3);
6221
+ /* { dg-final { scan-assembler "bics\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
6234
+ x = bics_si_test1 (29, ~4, 5);
6235
+ if (x != ((29 & 4) + ~4 + 5))
6238
+ x = bics_si_test1 (5, ~2, 20);
6242
+ x = bics_si_test2 (35, ~4, 5);
6243
+ if (x != ((35 & ~(~4 << 3)) + ~4 + 5))
6246
+ x = bics_si_test2 (96, ~2, 20);
6250
+ y = bics_di_test1 (0x130000029ll,
6254
+ if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll))
6257
+ y = bics_di_test1 (0x5000500050005ll,
6258
+ ~0x2111211121112ll,
6259
+ 0x0000000002020ll);
6260
+ if (y != 0x5000500052025ll)
6263
+ y = bics_di_test2 (0x130000029ll,
6266
+ if (y != ((0x130000029ll & ~(~0x064000008ll << 3))
6267
+ + ~0x064000008ll + 0x505050505ll))
6270
+ y = bics_di_test2 (0x130002900ll,
6273
+ if (y != (0x130002900ll + 0x505050505ll))
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
6283
+/* { dg-do run } */
6284
+/* { dg-options "-O3 --save-temps -ffast-math" } */
6286
+#include <arm_neon.h>
6288
+extern void abort (void);
6290
+#define NUM_TESTS 16
6291
+#define DELTA 0.000001
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};
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};
6307
+#define EQUAL(a, b) (a == b)
6309
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES) \
6311
+test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void) \
6314
+ int moves = (NUM_TESTS - LANES) + 1; \
6315
+ TYPE##_t out_l[NUM_TESTS]; \
6316
+ TYPE##_t out_v[NUM_TESTS]; \
6318
+ /* Calculate linearly. */ \
6319
+ for (i = 0; i < moves; i++) \
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]; \
6327
+ /* Calculate using vector reduction intrinsics. */ \
6328
+ for (i = 0; i < moves; i++) \
6330
+ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \
6331
+ out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1); \
6335
+ for (i = 0; i < moves; i++) \
6337
+ if (!EQUAL (out_v[i], out_l[i])) \
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)
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" } } */
6381
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES) \
6383
+ if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ()) \
6388
+main (int argc, char **argv)
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)
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
6403
+/* { dg-do run } */
6404
+/* { dg-options "-O3 --save-temps" } */
6406
+#include <arm_neon.h>
6408
+#include <stdlib.h>
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};
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};
6420
+test_frecpx_float32_t (void)
6424
+ for (i = 0; i < 8; i++)
6425
+ ret &= fabs (vrecpxs_f32 (in_f[i]) - rec_f[i]) < 0.001;
6430
+/* { dg-final { scan-assembler "frecpx\\ts\[0-9\]+, s\[0-9\]+" } } */
6433
+test_frecpx_float64_t (void)
6437
+ for (i = 0; i < 8; i++)
6438
+ ret &= fabs (vrecpxd_f64 (in_d[i]) - rec_d[i]) < 0.001;
6443
+/* { dg-final { scan-assembler "frecpx\\td\[0-9\]+, d\[0-9\]+" } } */
6446
+main (int argc, char **argv)
6448
+ if (!test_frecpx_float32_t ())
6450
+ if (!test_frecpx_float64_t ())
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
6460
+/* { dg-do run } */
6461
+/* { dg-options "-O3 --save-temps" } */
6463
+#include <arm_neon.h>
6465
+extern void abort (void);
6466
+extern float fabsf (float);
6467
+extern double fabs (double);
6469
+#define NUM_TESTS 8
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};
6476
+#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F) \
6478
+test_vca##T##_float##WIDTH##x##LANES##_t (void) \
6482
+ uint##WIDTH##_t output[NUM_TESTS]; \
6484
+ for (i = 0; i < NUM_TESTS; i++) \
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; \
6493
+ for (i = 0; i < NUM_TESTS; i += LANES) \
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), \
6504
+ vst1##Q##_u##WIDTH (output + i, out); \
6507
+ for (i = 0; i < NUM_TESTS; i++) \
6508
+ ret |= output[i]; \
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, )
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" } } */
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" } } */
6528
+/* No need for another scan-assembler as these tests
6529
+ also generate facge, facgt instructions. */
6530
+BUILD_VARIANTS (le, <=)
6531
+BUILD_VARIANTS (lt, <)
6534
+#define TEST(T, CMP, SUFFIX, WIDTH, LANES, Q, F) \
6535
+if (test_vca##T##_float##WIDTH##x##LANES##_t ()) \
6539
+main (int argc, char **argv)
6541
+BUILD_VARIANTS (ge, >=)
6542
+BUILD_VARIANTS (gt, >)
6543
+BUILD_VARIANTS (le, <=)
6544
+BUILD_VARIANTS (lt, <)
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
6552
+/* { dg-do run } */
6553
+/* { dg-options "-O3 --save-temps" } */
6555
+#include <arm_neon.h>
6557
+extern void abort (void);
6558
+extern float fabsf (float);
6559
+extern double fabs (double);
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);
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);
6575
+#define NUM_TESTS 8
6576
+#define DELTA 0.000001
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};
6583
+#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F) \
6585
+test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t (void) \
6589
+ int nlanes = LANES; \
6590
+ float##WIDTH##_t expected_out[NUM_TESTS]; \
6591
+ float##WIDTH##_t actual_out[NUM_TESTS]; \
6593
+ for (i = 0; i < NUM_TESTS; i++) \
6595
+ expected_out[i] = C_FN##F (input_f##WIDTH[i]); \
6596
+ /* Don't vectorize this. */ \
6597
+ asm volatile ("" : : : "memory"); \
6600
+ /* Prevent the compiler from noticing these two loops do the same \
6601
+ thing and optimizing away the comparison. */ \
6602
+ asm volatile ("" : : : "memory"); \
6604
+ for (i = 0; i < NUM_TESTS; i+=nlanes) \
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); \
6612
+ for (i = 0; i < NUM_TESTS; i++) \
6613
+ ret &= fabs##F (expected_out[i] - actual_out[i]) < DELTA; \
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, ) \
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" } } */
6650
+#define TEST(SUFFIX, Q, WIDTH, LANES, C_FN, F) \
6652
+ if (!test_vrnd##SUFFIX##_float##WIDTH##x##LANES##_t ()) \
6657
+main (int argc, char **argv)
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)
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
6672
/* { dg-do compile } */
6673
/* { dg-options "-O2" } */
6676
+#include "atomic-op-relaxed.x"
6679
-atomic_fetch_add_RELAXED (int a)
6681
- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
6685
-atomic_fetch_sub_RELAXED (int a)
6687
- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
6691
-atomic_fetch_and_RELAXED (int a)
6693
- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
6697
-atomic_fetch_nand_RELAXED (int a)
6699
- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
6703
-atomic_fetch_xor_RELAXED (int a)
6705
- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
6709
-atomic_fetch_or_RELAXED (int a)
6711
- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
6719
2.0, -4.0, 8.0, -16.0,
6720
-2.125, 4.25, -8.5, 17.0};
6722
+/* Float comparisons, float results. */
6725
foo (FTYPE *in1, FTYPE *in2, FTYPE *output)
6728
output[i] = (in1[i] INV_OP 0.0) ? 4.0 : 2.0;
6731
+/* Float comparisons, int results. */
6734
+foo_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
6737
+ /* Vectorizable. */
6738
+ for (i = 0; i < N; i++)
6739
+ output[i] = (in1[i] OP in2[i]) ? 2 : 4;
6743
+bar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
6746
+ /* Vectorizable. */
6747
+ for (i = 0; i < N; i++)
6748
+ output[i] = (in1[i] INV_OP in2[i]) ? 4 : 2;
6752
+foobar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
6755
+ /* Vectorizable. */
6756
+ for (i = 0; i < N; i++)
6757
+ output[i] = (in1[i] OP 0.0) ? 4 : 2;
6761
+foobarbar_int (FTYPE *in1, FTYPE *in2, ITYPE *output)
6764
+ /* Vectorizable. */
6765
+ for (i = 0; i < N; i++)
6766
+ output[i] = (in1[i] INV_OP 0.0) ? 4 : 2;
6770
main (int argc, char **argv)
6778
foo (input1, input2, out1);
6779
bar (input1, input2, out2);
6781
for (i = 0; i < N; i++)
6782
if (out1[i] == out2[i])
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])
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])
6798
--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c
6799
+++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic-compile.c
6802
+/* { dg-do compile } */
6803
+/* { dg-options "-O3" } */
6805
+#include "arm_neon.h"
6807
+#include "vaddv-intrinsic.x"
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
6815
+/* { dg-do compile } */
6816
+/* { dg-options "-O2" } */
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));
6828
--- a/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c
6829
+++ b/src/gcc/testsuite/gcc.target/aarch64/vabs_intrinsic_1.c
6831
+/* { dg-do run } */
6832
+/* { dg-options "-O3 --save-temps" } */
6834
+#include <arm_neon.h>
6836
+extern void abort (void);
6838
+#define ETYPE(size) int##size##_t
6839
+#define VTYPE(size, lanes) int##size##x##lanes##_t
6841
+#define TEST_VABS(q, size, lanes) \
6843
+test_vabs##q##_##size (ETYPE (size) * res, \
6844
+ const ETYPE (size) *in1) \
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); \
6852
+#define BUILD_VARS(width, n_lanes, n_half_lanes) \
6853
+TEST_VABS (, width, n_half_lanes) \
6854
+TEST_VABS (q, width, n_lanes) \
6856
+BUILD_VARS (64, 2, 1)
6857
+BUILD_VARS (32, 4, 2)
6858
+BUILD_VARS (16, 8, 4)
6859
+BUILD_VARS (8, 16, 8)
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}
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}
6875
+#define BUILD_TEST(size, lanes_64, lanes_128) \
6877
+test_##size (void) \
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; \
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]) \
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]) \
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)
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)
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)
6914
+/* { dg-final { scan-assembler-times "abs\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
6915
+BUILD_TEST (64, 1, 2)
6919
+#define BUILD_TEST(size) test_##size ()
6922
+main (int argc, char **argv)
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
6938
+atomic_fetch_add_RELAXED (int a)
6940
+ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
6944
+atomic_fetch_sub_RELAXED (int a)
6946
+ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
6950
+atomic_fetch_and_RELAXED (int a)
6952
+ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
6956
+atomic_fetch_nand_RELAXED (int a)
6958
+ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
6962
+atomic_fetch_xor_RELAXED (int a)
6964
+ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
6968
+atomic_fetch_or_RELAXED (int a)
6970
+ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
6972
--- a/src/gcc/testsuite/gcc.target/aarch64/vect.c
6973
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect.c
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;
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
6995
+/* { dg-do compile } */
6996
+/* { dg-options "-g -mgeneral-regs-only" } */
6999
+foo (const char *c, ...)
7002
+ buf[256 - 1] = '\0';
7004
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c
7005
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-movi.c
7007
+/* { dg-do run } */
7008
+/* { dg-options "-O3 --save-temps -fno-inline" } */
7010
+extern void abort (void);
7015
+movi_msl8 (int *__restrict a)
7019
+ /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */
7020
+ for (i = 0; i < N; i++)
7025
+movi_msl16 (int *__restrict a)
7029
+ /* { dg-final { scan-assembler "movi\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */
7030
+ for (i = 0; i < N; i++)
7035
+mvni_msl8 (int *__restrict a)
7039
+ /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 8" } } */
7040
+ for (i = 0; i < N; i++)
7041
+ a[i] = 0xffff5400;
7045
+mvni_msl16 (int *__restrict a)
7049
+ /* { dg-final { scan-assembler "mvni\\tv\[0-9\]+\.4s, 0xab, msl 16" } } */
7050
+ for (i = 0; i < N; i++)
7051
+ a[i] = 0xff540000;
7060
+#define CHECK_ARRAY(a, val) \
7061
+ for (i = 0; i < N; i++) \
7062
+ if (a[i] != val) \
7066
+ CHECK_ARRAY (a, 0xabff);
7069
+ CHECK_ARRAY (a, 0xabffff);
7072
+ CHECK_ARRAY (a, 0xffff5400);
7075
+ CHECK_ARRAY (a, 0xff540000);
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
7084
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
7086
#define FTYPE double
7091
#include "vect-fcm.x"
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
7101
/* { dg-do compile } */
7102
/* { dg-options "-O2" } */
7105
+#include "atomic-op-acquire.x"
7108
-atomic_fetch_add_ACQUIRE (int a)
7110
- return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE);
7114
-atomic_fetch_sub_ACQUIRE (int a)
7116
- return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE);
7120
-atomic_fetch_and_ACQUIRE (int a)
7122
- return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE);
7126
-atomic_fetch_nand_ACQUIRE (int a)
7128
- return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE);
7132
-atomic_fetch_xor_ACQUIRE (int a)
7134
- return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE);
7138
-atomic_fetch_or_ACQUIRE (int a)
7140
- return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE);
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
7148
+/* { dg-do run } */
7149
+/* { dg-options "-O2 -fno-inline --save-temps" } */
7151
+extern long long llabs (long long);
7152
+extern void abort (void);
7155
+abs64 (long long a)
7157
+ /* { dg-final { scan-assembler "eor\t" } } */
7158
+ /* { dg-final { scan-assembler "sub\t" } } */
7163
+abs64_in_dreg (long long a)
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));
7170
+ asm volatile ("" : : "w" (y));
7177
+ volatile long long ll0 = 0LL, ll1 = 1LL, llm1 = -1LL;
7179
+ if (abs64 (ll0) != 0LL)
7182
+ if (abs64 (ll1) != 1LL)
7185
+ if (abs64 (llm1) != 1LL)
7188
+ if (abs64_in_dreg (ll0) != 0LL)
7191
+ if (abs64_in_dreg (ll1) != 1LL)
7194
+ if (abs64_in_dreg (llm1) != 1LL)
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
7204
/* { dg-do compile } */
7205
/* { dg-options "-O2" } */
7210
+#include "atomic-comp-swap-release-acquire.x"
7213
-atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b)
7215
- return __atomic_compare_exchange (&v, &a, &b,
7216
- STRONG, __ATOMIC_RELEASE,
7217
- __ATOMIC_ACQUIRE);
7221
-atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b)
7223
- return __atomic_compare_exchange (&v, &a, &b,
7224
- WEAK, __ATOMIC_RELEASE,
7225
- __ATOMIC_ACQUIRE);
7229
-atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b)
7231
- return __atomic_compare_exchange_n (&v, &a, b,
7232
- STRONG, __ATOMIC_RELEASE,
7233
- __ATOMIC_ACQUIRE);
7237
-atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b)
7239
- return __atomic_compare_exchange_n (&v, &a, b,
7240
- WEAK, __ATOMIC_RELEASE,
7241
- __ATOMIC_ACQUIRE);
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 @@
7253
+void sabd (pRINT a, pRINT b, pRINT c)
7256
+ for (i = 0; i < 16; i++)
7257
+ c[i] = abs (a[i] - b[i]);
7260
+void saba (pRINT a, pRINT b, pRINT c)
7263
+ for (i = 0; i < 16; i++)
7264
+ c[i] += abs (a[i] - b[i]);
7266
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c
7267
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-clz.c
7269
+/* { dg-do run } */
7270
+/* { dg-options "-O3 -save-temps -fno-inline" } */
7272
+extern void abort ();
7275
+count_lz_v4si (unsigned *__restrict a, int *__restrict b)
7279
+ for (i = 0; i < 4; i++)
7280
+ b[i] = __builtin_clz (a[i]);
7283
+/* { dg-final { scan-assembler "clz\tv\[0-9\]+\.4s" } } */
7288
+ unsigned int x[4] = { 0x0, 0xFFFF, 0x1FFFF, 0xFFFFFFFF };
7289
+ int r[4] = { 32, 16, 15, 0 };
7292
+ count_lz_v4si (x, d);
7294
+ for (i = 0; i < 4; i++)
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
7307
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
7314
#include "vect-fcm.x"
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
7324
+/* { dg-do run } */
7325
+/* { dg-options "-O2 --save-temps -fno-inline" } */
7327
+extern void abort (void);
7328
+typedef long long s64;
7331
+subs_ext (s64 a, int b, int c)
7342
+subs_shift_ext (s64 a, int b, int c)
7344
+ s64 d = (a - ((s64)b << 3));
7357
+ x = subs_ext (0x13000002ll, 41, 15);
7358
+ if (x != 318767121)
7361
+ x = subs_ext (0x50505050ll, 29, 4);
7362
+ if (x != 1347440724)
7365
+ x = subs_ext (0x12121212121ll, 2, 14);
7366
+ if (x != 555819311)
7369
+ x = subs_shift_ext (0x123456789ll, 4, 12);
7370
+ if (x != 591751033)
7373
+ x = subs_shift_ext (0x02020202ll, 9, 8);
7374
+ if (x != 33685963)
7377
+ x = subs_shift_ext (0x987987987987ll, 23, 41);
7378
+ if (x != -2020050673)
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
7388
+/* { dg-do run } */
7389
+/* { dg-options "-O2 --save-temps -fno-inline" } */
7391
+extern void abort (void);
7394
+bics_si_test1 (int a, int b, int c)
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 } } */
7407
+bics_si_test2 (int a, int b, int c)
7409
+ int d = a & ~(b << 3);
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" } } */
7419
+typedef long long s64;
7422
+bics_di_test1 (s64 a, s64 b, s64 c)
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 } } */
7435
+bics_di_test2 (s64 a, s64 b, s64 c)
7437
+ s64 d = a & ~(b << 3);
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" } } */
7453
+ x = bics_si_test1 (29, ~4, 5);
7454
+ if (x != ((29 & 4) + ~4 + 5))
7457
+ x = bics_si_test1 (5, ~2, 20);
7461
+ x = bics_si_test2 (35, ~4, 5);
7462
+ if (x != ((35 & ~(~4 << 3)) + ~4 + 5))
7465
+ x = bics_si_test2 (96, ~2, 20);
7469
+ y = bics_di_test1 (0x130000029ll,
7473
+ if (y != ((0x130000029ll & 0x320000004ll) + ~0x320000004ll + 0x505050505ll))
7476
+ y = bics_di_test1 (0x5000500050005ll,
7477
+ ~0x2111211121112ll,
7478
+ 0x0000000002020ll);
7479
+ if (y != 0x5000500052025ll)
7482
+ y = bics_di_test2 (0x130000029ll,
7485
+ if (y != ((0x130000029ll & ~(~0x064000008ll << 3))
7486
+ + ~0x064000008ll + 0x505050505ll))
7489
+ y = bics_di_test2 (0x130002900ll,
7492
+ if (y != (0x130002900ll + 0x505050505ll))
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
7505
+atomic_fetch_add_ACQUIRE (int a)
7507
+ return __atomic_fetch_add (&v, a, __ATOMIC_ACQUIRE);
7511
+atomic_fetch_sub_ACQUIRE (int a)
7513
+ return __atomic_fetch_sub (&v, a, __ATOMIC_ACQUIRE);
7517
+atomic_fetch_and_ACQUIRE (int a)
7519
+ return __atomic_fetch_and (&v, a, __ATOMIC_ACQUIRE);
7523
+atomic_fetch_nand_ACQUIRE (int a)
7525
+ return __atomic_fetch_nand (&v, a, __ATOMIC_ACQUIRE);
7529
+atomic_fetch_xor_ACQUIRE (int a)
7531
+ return __atomic_fetch_xor (&v, a, __ATOMIC_ACQUIRE);
7535
+atomic_fetch_or_ACQUIRE (int a)
7537
+ return __atomic_fetch_or (&v, a, __ATOMIC_ACQUIRE);
7539
--- a/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c
7540
+++ b/src/gcc/testsuite/gcc.target/aarch64/vaddv-intrinsic.c
7543
+/* { dg-do run } */
7544
+/* { dg-options "-O3" } */
7546
+#include "arm_neon.h"
7548
+extern void abort (void);
7550
+#include "vaddv-intrinsic.x"
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};
7559
+ if (test_vaddv_v2sf (pool_v2sf) != 13.0f)
7562
+ if (test_vaddv_v4sf (pool_v4sf) != 54.0f)
7565
+ if (test_vaddv_v2df (pool_v2df) != 13.0)
7570
--- a/src/gcc/testsuite/gcc.target/aarch64/sbc.c
7571
+++ b/src/gcc/testsuite/gcc.target/aarch64/sbc.c
7573
+/* { dg-do run } */
7574
+/* { dg-options "-O2 --save-temps" } */
7576
+extern void abort (void);
7578
+typedef unsigned int u32int;
7579
+typedef unsigned long long u64int;
7582
+test_si (u32int w1, u32int w2, u32int w3, u32int w4)
7585
+ /* { dg-final { scan-assembler "sbc\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+\n" } } */
7586
+ w0 = w1 - w2 - (w3 < w4);
7591
+test_di (u64int x1, u64int x2, u64int x3, u64int x4)
7594
+ /* { dg-final { scan-assembler "sbc\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+\n" } } */
7595
+ x0 = x1 - x2 - (x3 < x4);
7604
+ x = test_si (7, 8, 12, 15);
7607
+ y = test_di (0x987654321ll, 0x123456789ll, 0x345345345ll, 0x123123123ll);
7608
+ if (y != 0x8641fdb98ll)
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
7623
+atomic_compare_exchange_STRONG_RELEASE_ACQUIRE (int a, int b)
7625
+ return __atomic_compare_exchange (&v, &a, &b,
7626
+ STRONG, __ATOMIC_RELEASE,
7627
+ __ATOMIC_ACQUIRE);
7631
+atomic_compare_exchange_WEAK_RELEASE_ACQUIRE (int a, int b)
7633
+ return __atomic_compare_exchange (&v, &a, &b,
7634
+ WEAK, __ATOMIC_RELEASE,
7635
+ __ATOMIC_ACQUIRE);
7639
+atomic_compare_exchange_n_STRONG_RELEASE_ACQUIRE (int a, int b)
7641
+ return __atomic_compare_exchange_n (&v, &a, b,
7642
+ STRONG, __ATOMIC_RELEASE,
7643
+ __ATOMIC_ACQUIRE);
7647
+atomic_compare_exchange_n_WEAK_RELEASE_ACQUIRE (int a, int b)
7649
+ return __atomic_compare_exchange_n (&v, &a, b,
7650
+ WEAK, __ATOMIC_RELEASE,
7651
+ __ATOMIC_ACQUIRE);
7653
--- a/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
7654
+++ b/src/gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
7656
/* { dg-do compile } */
7657
-/* { dg-options "-O2" } */
7658
+/* { dg-options "-O2 -dp" } */
7660
-#include "../../../config/aarch64/arm_neon.h"
7661
+#include <arm_neon.h>
7663
+/* Used to force a variable to a SIMD register. */
7664
+#define force_simd(V1) asm volatile ("mov %d0, %1.d[0]" \
7667
+ : /* No clobbers */);
7669
/* { dg-final { scan-assembler-times "\\tadd\\tx\[0-9\]+" 2 } } */
7676
+/* { dg-final { scan-assembler-times "\\tabs\\td\[0-9\]+, d\[0-9\]+" 1 } } */
7679
+test_vabs_s64 (int64x1_t a)
7683
+ res = vabs_s64 (a);
7688
/* { dg-final { scan-assembler-times "\\tcmeq\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
7691
test_vceqd_s64 (int64x1_t a, int64x1_t b)
7693
- return vceqd_s64 (a, b);
7697
+ res = vceqd_s64 (a, b);
7702
/* { dg-final { scan-assembler-times "\\tcmeq\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
7705
test_vceqzd_s64 (int64x1_t a)
7707
- return vceqzd_s64 (a);
7710
+ res = vceqzd_s64 (a);
7715
/* { dg-final { scan-assembler-times "\\tcmge\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
7718
test_vcged_s64 (int64x1_t a, int64x1_t b)
7720
- return vcged_s64 (a, b);
7724
+ res = vcged_s64 (a, b);
7730
test_vcled_s64 (int64x1_t a, int64x1_t b)
7732
- return vcled_s64 (a, b);
7736
+ res = vcled_s64 (a, b);
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. */
7746
test_vcgezd_s64 (int64x1_t a)
7748
- return vcgezd_s64 (a);
7751
+ res = vcgezd_s64 (a);
7756
/* { dg-final { scan-assembler-times "\\tcmhs\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
7759
test_vcged_u64 (uint64x1_t a, uint64x1_t b)
7761
- return vcged_u64 (a, b);
7765
+ res = vcged_u64 (a, b);
7770
/* { dg-final { scan-assembler-times "\\tcmgt\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
7771
@@ -77,13 +124,23 @@
7773
test_vcgtd_s64 (int64x1_t a, int64x1_t b)
7775
- return vcgtd_s64 (a, b);
7779
+ res = vcgtd_s64 (a, b);
7785
test_vcltd_s64 (int64x1_t a, int64x1_t b)
7787
- return vcltd_s64 (a, b);
7791
+ res = vcltd_s64 (a, b);
7796
/* { dg-final { scan-assembler-times "\\tcmgt\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
7799
test_vcgtzd_s64 (int64x1_t a)
7801
- return vcgtzd_s64 (a);
7804
+ res = vcgtzd_s64 (a);
7809
/* { dg-final { scan-assembler-times "\\tcmhi\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 1 } } */
7812
test_vcgtd_u64 (uint64x1_t a, uint64x1_t b)
7814
- return vcgtd_u64 (a, b);
7818
+ res = vcgtd_u64 (a, b);
7823
/* { dg-final { scan-assembler-times "\\tcmle\\td\[0-9\]+, d\[0-9\]+, #?0" 1 } } */
7824
@@ -107,18 +173,27 @@
7826
test_vclezd_s64 (int64x1_t a)
7828
- return vclezd_s64 (a);
7831
+ res = vclezd_s64 (a);
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. */
7841
test_vcltzd_s64 (int64x1_t a)
7843
- return vcltzd_s64 (a);
7846
+ res = vcltzd_s64 (a);
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 } } */
7855
test_vdupb_lane_s8 (int8x16_t a)
7857
return vdupb_lane_u8 (a, 2);
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 } } */
7864
test_vduph_lane_s16 (int16x8_t a)
7866
return vduph_lane_u16 (a, 2);
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 } } */
7873
test_vdups_lane_s32 (int32x4_t a)
7874
@@ -160,18 +235,18 @@
7875
return vdups_lane_u32 (a, 2);
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 } } */
7882
test_vdupd_lane_s64 (int64x2_t a)
7884
- return vdupd_lane_s64 (a, 2);
7885
+ return vdupd_lane_s64 (a, 1);
7889
test_vdupd_lane_u64 (uint64x2_t a)
7891
- return vdupd_lane_u64 (a, 2);
7892
+ return vdupd_lane_u64 (a, 1);
7895
/* { dg-final { scan-assembler-times "\\tcmtst\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 2 } } */
7896
@@ -179,13 +254,23 @@
7898
test_vtst_s64 (int64x1_t a, int64x1_t b)
7900
- return vtstd_s64 (a, b);
7904
+ res = vtstd_s64 (a, b);
7910
test_vtst_u64 (uint64x1_t a, uint64x1_t b)
7912
- return vtstd_u64 (a, b);
7916
+ res = vtstd_s64 (a, b);
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);
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. */
7930
+/* { dg-final { scan-assembler "\\tasr\\tx\[0-9\]+" } } */
7933
test_vshrd_n_s64 (int64x1_t a)
7935
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c
7936
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-int.c
7938
/* { dg-do compile } */
7939
/* { dg-options "-O2" } */
7942
+#include "atomic-op-int.x"
7945
-atomic_fetch_add_RELAXED (int a)
7947
- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
7951
-atomic_fetch_sub_RELAXED (int a)
7953
- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
7957
-atomic_fetch_and_RELAXED (int a)
7959
- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
7963
-atomic_fetch_nand_RELAXED (int a)
7965
- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
7969
-atomic_fetch_xor_RELAXED (int a)
7971
- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
7975
-atomic_fetch_or_RELAXED (int a)
7977
- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
7985
+/* { dg-do run } */
7986
+/* { dg-options "-O2 --save-temps" } */
7988
+extern void abort (void);
7990
+void __attribute__ ((noinline))
7991
+foo_s32 (int a, int b)
7996
+/* { dg-final { scan-assembler "cmn\tw\[0-9\]" } } */
7998
+void __attribute__ ((noinline))
7999
+foo_s64 (long long a, long long b)
8004
+/* { dg-final { scan-assembler "cmn\tx\[0-9\]" } } */
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
8021
/* { dg-do compile } */
8022
/* { dg-options "-O2" } */
8025
+#include "atomic-op-seq_cst.x"
8028
-atomic_fetch_add_SEQ_CST (int a)
8030
- return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST);
8034
-atomic_fetch_sub_SEQ_CST (int a)
8036
- return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST);
8040
-atomic_fetch_and_SEQ_CST (int a)
8042
- return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST);
8046
-atomic_fetch_nand_SEQ_CST (int a)
8048
- return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST);
8052
-atomic_fetch_xor_SEQ_CST (int a)
8054
- return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST);
8058
-atomic_fetch_or_SEQ_CST (int a)
8060
- return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST);
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
8070
+test_vaddv_v2sf (const float32_t *pool)
8074
+ val = vld1_f32 (pool);
8075
+ return vaddv_f32 (val);
8079
+test_vaddv_v4sf (const float32_t *pool)
8083
+ val = vld1q_f32 (pool);
8084
+ return vaddvq_f32 (val);
8088
+test_vaddv_v2df (const float64_t *pool)
8092
+ val = vld1q_f64 (pool);
8093
+ return vaddvq_f64 (val);
8095
--- a/src/gcc/testsuite/gcc.target/aarch64/negs.c
8096
+++ b/src/gcc/testsuite/gcc.target/aarch64/negs.c
8098
+/* { dg-do run } */
8099
+/* { dg-options "-O2 --save-temps" } */
8101
+extern void abort (void);
8105
+negs_si_test1 (int a, int b, int c)
8109
+ /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+" } } */
8118
+negs_si_test3 (int a, int b, int c)
8120
+ int d = -(b) << 3;
8122
+ /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+, lsl 3" } } */
8130
+typedef long long s64;
8134
+negs_di_test1 (s64 a, s64 b, s64 c)
8138
+ /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+" } } */
8147
+negs_di_test3 (s64 a, s64 b, s64 c)
8149
+ s64 d = -(b) << 3;
8151
+ /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+, lsl 3" } } */
8164
+ x = negs_si_test1 (2, 12, 5);
8168
+ x = negs_si_test1 (1, 2, 32);
8172
+ x = negs_si_test3 (13, 14, 5);
8176
+ x = negs_si_test3 (15, 21, 2);
8180
+ y = negs_di_test1 (0x20202020ll,
8183
+ if (y != 0x62636263ll)
8186
+ y = negs_di_test1 (0x1010101010101ll,
8187
+ 0x123456789abcdll,
8188
+ 0x5555555555555ll);
8189
+ if (y != 0x6565656565656ll)
8192
+ y = negs_di_test3 (0x62523781ll,
8195
+ if (y != 0xfffffffd553d4edbll)
8198
+ y = negs_di_test3 (0x763526268ll,
8201
+ if (y != 0xfffffffb1b1b1b1bll)
8206
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c
8207
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-consume.c
8209
/* { dg-do compile } */
8210
/* { dg-options "-O2" } */
8213
+#include "atomic-op-consume.x"
8216
-atomic_fetch_add_CONSUME (int a)
8218
- return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME);
8222
-atomic_fetch_sub_CONSUME (int a)
8224
- return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME);
8228
-atomic_fetch_and_CONSUME (int a)
8230
- return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME);
8234
-atomic_fetch_nand_CONSUME (int a)
8236
- return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME);
8240
-atomic_fetch_xor_CONSUME (int a)
8242
- return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME);
8246
-atomic_fetch_or_CONSUME (int a)
8248
- return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME);
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
8256
+/* { dg-do run } */
8257
+/* { dg-options "-O3 --save-temps -ffast-math" } */
8259
+#include <arm_neon.h>
8261
+extern void abort (void);
8262
+extern float fabsf (float);
8263
+extern double fabs (double);
8265
+#define NUM_TESTS 16
8266
+#define DELTA 0.000001
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};
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};
8284
+uint64_t input_uint64[] = {1, 56, 2, 9, 90, 23, 54, 76,
8285
+ 4, 34, 110, 110, 6, 4, 75, 34};
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};
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};
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)
8301
+#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT) \
8303
+test_vaddv##SUFFIX##_##TYPE##x##LANES##_t (void) \
8306
+ int moves = (NUM_TESTS - LANES) + 1; \
8307
+ TYPE##_t out_l[NUM_TESTS]; \
8308
+ TYPE##_t out_v[NUM_TESTS]; \
8310
+ /* Calculate linearly. */ \
8311
+ for (i = 0; i < moves; i++) \
8313
+ out_l[i] = input_##TYPE[i]; \
8314
+ for (j = 1; j < LANES; j++) \
8315
+ out_l[i] += input_##TYPE[i + j]; \
8318
+ /* Calculate using vector reduction intrinsics. */ \
8319
+ for (i = 0; i < moves; i++) \
8321
+ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \
8322
+ out_v[i] = vaddv##Q##_##SUFFIX (t1); \
8326
+ for (i = 0; i < moves; i++) \
8328
+ if (!EQUAL##FLOAT (out_v[i], out_l[i])) \
8334
+#define BUILD_VARIANTS(TYPE, STYPE, W32, W64, F) \
8335
+TEST (STYPE, , TYPE, W32, F) \
8336
+TEST (STYPE, q, TYPE, W64, F) \
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" } } */
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" } } */
8361
+#define TEST(SUFFIX, Q, TYPE, LANES, FLOAT) \
8363
+ if (!test_vaddv##SUFFIX##_##TYPE##x##LANES##_t ()) \
8368
+main (int argc, char **argv)
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)
8377
+BUILD_VARIANTS (float32, f32, 2, 4, F)
8378
+TEST (f64, q, float64, 2, D)
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
8387
/* { dg-do compile } */
8388
/* { dg-options "-O2" } */
8391
+#include "atomic-op-char.x"
8394
-atomic_fetch_add_RELAXED (char a)
8396
- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
8400
-atomic_fetch_sub_RELAXED (char a)
8402
- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
8406
-atomic_fetch_and_RELAXED (char a)
8408
- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
8412
-atomic_fetch_nand_RELAXED (char a)
8414
- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
8418
-atomic_fetch_xor_RELAXED (char a)
8420
- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
8424
-atomic_fetch_or_RELAXED (char a)
8426
- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
8437
+atomic_fetch_add_RELAXED (int a)
8439
+ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
8443
+atomic_fetch_sub_RELAXED (int a)
8445
+ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
8449
+atomic_fetch_and_RELAXED (int a)
8451
+ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
8455
+atomic_fetch_nand_RELAXED (int a)
8457
+ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
8461
+atomic_fetch_xor_RELAXED (int a)
8463
+ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
8467
+atomic_fetch_or_RELAXED (int a)
8469
+ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
8477
+atomic_fetch_add_SEQ_CST (int a)
8479
+ return __atomic_fetch_add (&v, a, __ATOMIC_SEQ_CST);
8483
+atomic_fetch_sub_SEQ_CST (int a)
8485
+ return __atomic_fetch_sub (&v, a, __ATOMIC_SEQ_CST);
8489
+atomic_fetch_and_SEQ_CST (int a)
8491
+ return __atomic_fetch_and (&v, a, __ATOMIC_SEQ_CST);
8495
+atomic_fetch_nand_SEQ_CST (int a)
8497
+ return __atomic_fetch_nand (&v, a, __ATOMIC_SEQ_CST);
8501
+atomic_fetch_xor_SEQ_CST (int a)
8503
+ return __atomic_fetch_xor (&v, a, __ATOMIC_SEQ_CST);
8507
+atomic_fetch_or_SEQ_CST (int a)
8509
+ return __atomic_fetch_or (&v, a, __ATOMIC_SEQ_CST);
8511
--- a/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c
8512
+++ b/src/gcc/testsuite/gcc.target/aarch64/bfxil_1.c
8514
+/* { dg-do run { target aarch64*-*-* } } */
8515
+/* { dg-options "-O2 --save-temps -fno-inline" } */
8516
+/* { dg-require-effective-target aarch64_little_endian } */
8518
+extern void abort (void);
8520
+typedef struct bitfield
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;
8532
+ /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 16, 8" } } */
8533
+ a.eight1 = a.eight2;
8540
+ static bitfield a;
8547
+ if (b.eight1 != a.eight2)
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
8560
+atomic_fetch_add_CONSUME (int a)
8562
+ return __atomic_fetch_add (&v, a, __ATOMIC_CONSUME);
8566
+atomic_fetch_sub_CONSUME (int a)
8568
+ return __atomic_fetch_sub (&v, a, __ATOMIC_CONSUME);
8572
+atomic_fetch_and_CONSUME (int a)
8574
+ return __atomic_fetch_and (&v, a, __ATOMIC_CONSUME);
8578
+atomic_fetch_nand_CONSUME (int a)
8580
+ return __atomic_fetch_nand (&v, a, __ATOMIC_CONSUME);
8584
+atomic_fetch_xor_CONSUME (int a)
8586
+ return __atomic_fetch_xor (&v, a, __ATOMIC_CONSUME);
8590
+atomic_fetch_or_CONSUME (int a)
8592
+ return __atomic_fetch_or (&v, a, __ATOMIC_CONSUME);
8594
--- a/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c
8595
+++ b/src/gcc/testsuite/gcc.target/aarch64/atomic-op-short.c
8597
/* { dg-do compile } */
8598
/* { dg-options "-O2" } */
8601
+#include "atomic-op-short.x"
8604
-atomic_fetch_add_RELAXED (short a)
8606
- return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
8610
-atomic_fetch_sub_RELAXED (short a)
8612
- return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
8616
-atomic_fetch_and_RELAXED (short a)
8618
- return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
8622
-atomic_fetch_nand_RELAXED (short a)
8624
- return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
8628
-atomic_fetch_xor_RELAXED (short a)
8630
- return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
8634
-atomic_fetch_or_RELAXED (short a)
8636
- return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
8647
+atomic_fetch_add_RELAXED (char a)
8649
+ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
8653
+atomic_fetch_sub_RELAXED (char a)
8655
+ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
8659
+atomic_fetch_and_RELAXED (char a)
8661
+ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
8665
+atomic_fetch_nand_RELAXED (char a)
8667
+ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
8671
+atomic_fetch_xor_RELAXED (char a)
8673
+ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
8677
+atomic_fetch_or_RELAXED (char a)
8679
+ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
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
8684
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
8691
#include "vect-fcm.x"
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
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
8708
+/* { dg-do run } */
8709
+/* { dg-options "-O2 --save-temps -fno-inline" } */
8711
+extern void abort (void);
8714
+adds_si_test1 (int a, int b, int c)
8718
+ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
8726
+adds_si_test2 (int a, int b, int c)
8730
+ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, 255" } } */
8738
+adds_si_test3 (int a, int b, int c)
8740
+ int d = a + (b << 3);
8742
+ /* { dg-final { scan-assembler "adds\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
8749
+typedef long long s64;
8752
+adds_di_test1 (s64 a, s64 b, s64 c)
8756
+ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
8764
+adds_di_test2 (s64 a, s64 b, s64 c)
8768
+ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, 255" } } */
8776
+adds_di_test3 (s64 a, s64 b, s64 c)
8778
+ s64 d = a + (b << 3);
8780
+ /* { dg-final { scan-assembler "adds\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
8792
+ x = adds_si_test1 (29, 4, 5);
8796
+ x = adds_si_test1 (5, 2, 20);
8800
+ x = adds_si_test2 (29, 4, 5);
8804
+ x = adds_si_test2 (1024, 2, 20);
8808
+ x = adds_si_test3 (35, 4, 5);
8812
+ x = adds_si_test3 (5, 2, 20);
8816
+ y = adds_di_test1 (0x130000029ll,
8820
+ if (y != 0xc75050536)
8823
+ y = adds_di_test1 (0x5000500050005ll,
8824
+ 0x2111211121112ll,
8825
+ 0x0000000002020ll);
8826
+ if (y != 0x9222922294249)
8829
+ y = adds_di_test2 (0x130000029ll,
8832
+ if (y != 0x955050631)
8835
+ y = adds_di_test2 (0x130002900ll,
8838
+ if (y != 0x955052f08)
8841
+ y = adds_di_test3 (0x130000029ll,
8844
+ if (y != 0x9b9050576)
8847
+ y = adds_di_test3 (0x130002900ll,
8850
+ if (y != 0xafd052e4d)
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
8860
+/* { dg-do run { target aarch64*-*-* } } */
8861
+/* { dg-options "-O2 --save-temps -fno-inline" } */
8862
+/* { dg-require-effective-target aarch64_little_endian } */
8864
+extern void abort (void);
8866
+typedef struct bitfield
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;
8878
+ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 0, 8" } } */
8886
+ /* { dg-final { scan-assembler "bfi\tx\[0-9\]+, x\[0-9\]+, 16, 5" } } */
8894
+ /* { dg-final { scan-assembler "movk\tx\[0-9\]+, 0x1d6b, lsl 32" } } */
8902
+ /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, 2031616" } } */
8910
+ /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -2031617" } } */
8917
+main (int argc, char** argv)
8919
+ static bitfield a;
8920
+ bitfield b = bfi1 (a);
8921
+ bitfield c = bfi2 (b);
8922
+ bitfield d = movk (c);
8930
+ if (d.sixteen != 7531)
8934
+ if (d.five != 0x1f)
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
8948
+/* { dg-options "-O2 --save-temps" } */
8949
+/* { dg-do run } */
8951
+extern void abort (void);
8956
+ /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 27\n" } } */
8957
+ return (a << 5) | ((unsigned int) a >> 27);
8961
+test_di (long long a)
8963
+ /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 45\n" } } */
8964
+ return (a << 19) | ((unsigned long long) a >> 45);
8972
+ v = test_si (0x0203050);
8973
+ if (v != 0x4060a00)
8975
+ w = test_di (0x0000020506010304ll);
8976
+ if (w != 0x1028300818200000ll)
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
8985
+/* { dg-do run } */
8986
+/* { dg-options "-O2 --save-temps -fno-inline" } */
8988
+extern void abort (void);
8991
+ands_si_test1 (int a, int b, int c)
8995
+ /* { dg-final { scan-assembler-times "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
9003
+ands_si_test2 (int a, int b, int c)
9007
+ /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, 255" } } */
9015
+ands_si_test3 (int a, int b, int c)
9017
+ int d = a & (b << 3);
9019
+ /* { dg-final { scan-assembler "ands\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
9026
+typedef long long s64;
9029
+ands_di_test1 (s64 a, s64 b, s64 c)
9033
+ /* { dg-final { scan-assembler-times "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
9041
+ands_di_test2 (s64 a, s64 b, s64 c)
9045
+ /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, 255" } } */
9053
+ands_di_test3 (s64 a, s64 b, s64 c)
9055
+ s64 d = a & (b << 3);
9057
+ /* { dg-final { scan-assembler "ands\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
9070
+ x = ands_si_test1 (29, 4, 5);
9074
+ x = ands_si_test1 (5, 2, 20);
9078
+ x = ands_si_test2 (29, 4, 5);
9082
+ x = ands_si_test2 (1024, 2, 20);
9086
+ x = ands_si_test3 (35, 4, 5);
9090
+ x = ands_si_test3 (5, 2, 20);
9094
+ y = ands_di_test1 (0x130000029ll,
9098
+ if (y != ((0x130000029ll & 0x320000004ll) + 0x320000004ll + 0x505050505ll))
9101
+ y = ands_di_test1 (0x5000500050005ll,
9102
+ 0x2111211121112ll,
9103
+ 0x0000000002020ll);
9104
+ if (y != 0x5000500052025ll)
9107
+ y = ands_di_test2 (0x130000029ll,
9110
+ if (y != ((0x130000029ll & 0xff) + 0x320000004ll + 0x505050505ll))
9113
+ y = ands_di_test2 (0x130002900ll,
9116
+ if (y != (0x130002900ll + 0x505050505ll))
9119
+ y = ands_di_test3 (0x130000029ll,
9122
+ if (y != ((0x130000029ll & (0x064000008ll << 3))
9123
+ + 0x064000008ll + 0x505050505ll))
9126
+ y = ands_di_test3 (0x130002900ll,
9129
+ if (y != (0x130002900ll + 0x505050505ll))
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
9139
/* { dg-do compile } */
9140
/* { dg-options "-O2" } */
9143
+#include "atomic-op-release.x"
9146
-atomic_fetch_add_RELEASE (int a)
9148
- return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE);
9152
-atomic_fetch_sub_RELEASE (int a)
9154
- return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE);
9158
-atomic_fetch_and_RELEASE (int a)
9160
- return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE);
9164
-atomic_fetch_nand_RELEASE (int a)
9166
- return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE);
9170
-atomic_fetch_xor_RELEASE (int a)
9172
- return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE);
9176
-atomic_fetch_or_RELEASE (int a)
9178
- return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE);
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
9186
+/* { dg-do run } */
9187
+/* { dg-options "-O3 --save-temps -ffast-math" } */
9189
+#include <arm_neon.h>
9191
+extern void abort (void);
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);
9201
+#define NUM_TESTS 16
9202
+#define DELTA 0.000001
9203
+#define NAN (0.0 / 0.0)
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};
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};
9215
+#define EQUALF(a, b) (fabsf (a - b) < DELTA)
9216
+#define EQUALD(a, b) (fabs (a - b) < DELTA)
9218
+/* Floating point 'unordered' variants. */
9221
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \
9223
+test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t (void) \
9226
+ int moves = (NUM_TESTS - LANES) + 1; \
9227
+ TYPE##_t out_l[NUM_TESTS]; \
9228
+ TYPE##_t out_v[NUM_TESTS]; \
9230
+ /* Calculate linearly. */ \
9231
+ for (i = 0; i < moves; i++) \
9233
+ out_l[i] = input_##TYPE[i]; \
9234
+ for (j = 0; j < LANES; j++) \
9236
+ if (isnan (out_l[i])) \
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]; \
9244
+ /* Calculate using vector reduction intrinsics. */ \
9245
+ for (i = 0; i < moves; i++) \
9247
+ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \
9248
+ out_v[i] = v##MAXMIN##v##Q##_##SUFFIX (t1); \
9252
+ for (i = 0; i < moves; i++) \
9254
+ if (!EQUAL##FLOAT (out_v[i], out_l[i]) \
9255
+ && !(isnan (out_v[i]) && isnan (out_l[i]))) \
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)
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" } } */
9277
+/* Floating point 'nm' variants. */
9280
+#define TEST(MAXMIN, F, SUFFIX, Q, TYPE, LANES, FLOAT) \
9282
+test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t (void) \
9285
+ int moves = (NUM_TESTS - LANES) + 1; \
9286
+ TYPE##_t out_l[NUM_TESTS]; \
9287
+ TYPE##_t out_v[NUM_TESTS]; \
9289
+ /* Calculate linearly. */ \
9290
+ for (i = 0; i < moves; i++) \
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]); \
9297
+ /* Calculate using vector reduction intrinsics. */ \
9298
+ for (i = 0; i < moves; i++) \
9300
+ TYPE##x##LANES##_t t1 = vld1##Q##_##SUFFIX (input_##TYPE + i); \
9301
+ out_v[i] = v##MAXMIN##nmv##Q##_##SUFFIX (t1); \
9305
+ for (i = 0; i < moves; i++) \
9307
+ if (!EQUAL##FLOAT (out_v[i], out_l[i])) \
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" } } */
9327
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \
9329
+ if (!test_v##MAXMIN##v##SUFFIX##_##TYPE##x##LANES##_t ()) \
9334
+main (int argc, char **argv)
9336
+ BUILD_VARIANTS (float32, f32, 2, 4, F)
9337
+ TEST (max, >, f64, q, float64, 2, D)
9338
+ TEST (min, <, f64, q, float64, 2, D)
9341
+#define TEST(MAXMIN, CMP_OP, SUFFIX, Q, TYPE, LANES, FLOAT) \
9343
+ if (!test_v##MAXMIN##nmv##SUFFIX##_##TYPE##x##LANES##_t ()) \
9347
+ BUILD_VARIANTS (float32, f32, 2, 4, F)
9348
+ TEST (max, >, f64, q, float64, 2, D)
9349
+ TEST (min, <, f64, q, float64, 2, D)
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
9361
+atomic_fetch_add_RELAXED (short a)
9363
+ return __atomic_fetch_add (&v, a, __ATOMIC_RELAXED);
9367
+atomic_fetch_sub_RELAXED (short a)
9369
+ return __atomic_fetch_sub (&v, a, __ATOMIC_RELAXED);
9373
+atomic_fetch_and_RELAXED (short a)
9375
+ return __atomic_fetch_and (&v, a, __ATOMIC_RELAXED);
9379
+atomic_fetch_nand_RELAXED (short a)
9381
+ return __atomic_fetch_nand (&v, a, __ATOMIC_RELAXED);
9385
+atomic_fetch_xor_RELAXED (short a)
9387
+ return __atomic_fetch_xor (&v, a, __ATOMIC_RELAXED);
9391
+atomic_fetch_or_RELAXED (short a)
9393
+ return __atomic_fetch_or (&v, a, __ATOMIC_RELAXED);
9395
--- a/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c
9396
+++ b/src/gcc/testsuite/gcc.target/aarch64/vect-vcvt.c
9398
+/* { dg-do run } */
9399
+/* { dg-options "-O3 --save-temps -ffast-math" } */
9401
+#include <arm_neon.h>
9403
+extern void abort (void);
9404
+extern double fabs (double);
9406
+#define NUM_TESTS 8
9407
+#define DELTA 0.000001
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};
9414
+#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D) \
9416
+test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t (void) \
9420
+ int nlanes = LANES; \
9421
+ U##int##WIDTH##_t expected_out[NUM_TESTS]; \
9422
+ U##int##WIDTH##_t actual_out[NUM_TESTS]; \
9424
+ for (i = 0; i < NUM_TESTS; i++) \
9427
+ = vcvt##SUFFIX##D##_##S##WIDTH##_f##WIDTH (input_f##WIDTH[i]); \
9428
+ /* Don't vectorize this. */ \
9429
+ asm volatile ("" : : : "memory"); \
9432
+ for (i = 0; i < NUM_TESTS; i+=nlanes) \
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); \
9440
+ for (i = 0; i < NUM_TESTS; i++) \
9441
+ ret &= fabs (expected_out[i] - actual_out[i]) < DELTA; \
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) \
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" } } */
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" } } */
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" } } */
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" } } */
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" } } */
9512
+#define TEST(SUFFIX, Q, WIDTH, LANES, S, U, D) \
9514
+ if (!test_vcvt##SUFFIX##_##S##WIDTH##_f##WIDTH##x##LANES##_t ()) \
9519
+main (int argc, char **argv)
9521
+ BUILD_VARIANTS ( )
9522
+ BUILD_VARIANTS (a)
9523
+ BUILD_VARIANTS (m)
9524
+ BUILD_VARIANTS (n)
9525
+ BUILD_VARIANTS (p)
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
9536
+atomic_fetch_add_RELEASE (int a)
9538
+ return __atomic_fetch_add (&v, a, __ATOMIC_RELEASE);
9542
+atomic_fetch_sub_RELEASE (int a)
9544
+ return __atomic_fetch_sub (&v, a, __ATOMIC_RELEASE);
9548
+atomic_fetch_and_RELEASE (int a)
9550
+ return __atomic_fetch_and (&v, a, __ATOMIC_RELEASE);
9554
+atomic_fetch_nand_RELEASE (int a)
9556
+ return __atomic_fetch_nand (&v, a, __ATOMIC_RELEASE);
9560
+atomic_fetch_xor_RELEASE (int a)
9562
+ return __atomic_fetch_xor (&v, a, __ATOMIC_RELEASE);
9566
+atomic_fetch_or_RELEASE (int a)
9568
+ return __atomic_fetch_or (&v, a, __ATOMIC_RELEASE);
9570
--- a/src/gcc/testsuite/gcc.target/aarch64/fabd.c
9571
+++ b/src/gcc/testsuite/gcc.target/aarch64/fabd.c
9573
+/* { dg-do run } */
9574
+/* { dg-options "-O1 -fno-inline --save-temps" } */
9576
+extern double fabs (double);
9577
+extern float fabsf (float);
9578
+extern void abort ();
9579
+extern void exit (int);
9582
+fabd_d (double x, double y, double d)
9584
+ if ((fabs (x - y) - d) > 0.00001)
9588
+/* { dg-final { scan-assembler "fabd\td\[0-9\]+" } } */
9591
+fabd_f (float x, float y, float d)
9593
+ if ((fabsf (x - y) - d) > 0.00001)
9597
+/* { dg-final { scan-assembler "fabd\ts\[0-9\]+" } } */
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);
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 };
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 };
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 };
9627
/* Setup input vectors. */
9628
for (i=1; i<=16; i++)
9638
--- a/src/gcc/testsuite/gcc.target/aarch64/ngc.c
9639
+++ b/src/gcc/testsuite/gcc.target/aarch64/ngc.c
9641
+/* { dg-do run } */
9642
+/* { dg-options "-O2 --save-temps -fno-inline" } */
9644
+extern void abort (void);
9645
+typedef unsigned int u32;
9648
+ngc_si (u32 a, u32 b, u32 c, u32 d)
9654
+typedef unsigned long long u64;
9657
+ngc_si_tst (u64 a, u32 b, u32 c, u32 d)
9664
+ngc_di (u64 a, u64 b, u64 c, u64 d)
9676
+ x = ngc_si (29, 4, 5, 4);
9680
+ x = ngc_si (1024, 2, 20, 13);
9684
+ y = ngc_si_tst (0x130000029ll, 32, 50, 12);
9685
+ if (y != 0xffffffe0)
9688
+ y = ngc_si_tst (0x5000500050005ll, 21, 2, 14);
9689
+ if (y != 0xffffffea)
9692
+ y = ngc_di (0x130000029ll, 0x320000004ll, 0x505050505ll, 0x123123123ll);
9693
+ if (y != 0xfffffffcdffffffc)
9696
+ y = ngc_di (0x5000500050005ll,
9697
+ 0x2111211121112ll, 0x0000000002020ll, 0x1414575046477ll);
9698
+ if (y != 0xfffdeeedeeedeeed)
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
9710
+/* { dg-do compile } */
9711
+/* { dg-options "-O2" } */
9714
+cmp_si_test1 (int a, int b, int c)
9723
+cmp_si_test2 (int a, int b, int c)
9731
+typedef long long s64;
9734
+cmp_di_test1 (s64 a, s64 b, s64 c)
9743
+cmp_di_test2 (s64 a, s64 b, s64 c)
9752
+cmp_di_test3 (int a, s64 b, s64 c)
9761
+cmp_di_test4 (int a, s64 b, s64 c)
9763
+ if (((s64)a << 3) > b)
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
9774
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
9781
#include "vect-fcm.x"
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
9791
+/* { dg-do run { target aarch64*-*-* } } */
9792
+/* { dg-options "-O2 --save-temps -fno-inline" } */
9793
+/* { dg-require-effective-target aarch64_big_endian } */
9795
+extern void abort (void);
9797
+typedef struct bitfield
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;
9811
+ /* { dg-final { scan-assembler "bfxil\tx\[0-9\]+, x\[0-9\]+, 40, 8" } } */
9812
+ a.eight4 = a.eight2;
9819
+ static bitfield a;
9826
+ if (b.eight4 != a.eight2)
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
9836
extern float fabsf (float);
9837
extern double fabs (double);
9839
+#define DEF3a(fname, type, op) \
9840
+ void fname##_##type (pR##type a, \
9845
+ for (i = 0; i < 16; i++) \
9846
+ a[i] = op (b[i] - c[i]); \
9849
#define DEF3(fname, type, op) \
9850
void fname##_##type (pR##type a, \
9855
- for (i=0; i<16; i++) \
9856
+ for (i = 0; i < 16; i++) \
9857
a[i] = b[i] op c[i]; \
9864
- for (i=0; i<16; i++) \
9865
+ for (i = 0; i < 16; i++) \
9870
+#define DEFN3a(fname, op) \
9871
+ DEF3a (fname, F32, op) \
9872
+ DEF3a (fname, F64, op)
9874
#define DEFN3(fname, op) \
9875
DEF3 (fname, F32, op) \
9876
DEF3 (fname, F64, op)
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
9886
/* { dg-do compile } */
9887
/* { dg-options "-O2" } */
9890
+#include "atomic-op-acq_rel.x"
9893
-atomic_fetch_add_ACQ_REL (int a)
9895
- return __atomic_fetch_add (&v, a, __ATOMIC_ACQ_REL);
9899
-atomic_fetch_sub_ACQ_REL (int a)
9901
- return __atomic_fetch_sub (&v, a, __ATOMIC_ACQ_REL);
9905
-atomic_fetch_and_ACQ_REL (int a)
9907
- return __atomic_fetch_and (&v, a, __ATOMIC_ACQ_REL);
9911
-atomic_fetch_nand_ACQ_REL (int a)
9913
- return __atomic_fetch_nand (&v, a, __ATOMIC_ACQ_REL);
9917
-atomic_fetch_xor_ACQ_REL (int a)
9919
- return __atomic_fetch_xor (&v, a, __ATOMIC_ACQ_REL);
9923
-atomic_fetch_or_ACQ_REL (int a)
9925
- return __atomic_fetch_or (&v, a, __ATOMIC_ACQ_REL);
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
9933
+/* { dg-do run } */
9934
+/* { dg-options "-O2 --save-temps -fno-inline" } */
9936
+extern void abort (void);
9939
+subs_si_test1 (int a, int b, int c)
9943
+ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
9951
+subs_si_test2 (int a, int b, int c)
9955
+ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, #255" } } */
9963
+subs_si_test3 (int a, int b, int c)
9965
+ int d = a - (b << 3);
9967
+ /* { dg-final { scan-assembler "subs\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
9974
+typedef long long s64;
9977
+subs_di_test1 (s64 a, s64 b, s64 c)
9981
+ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
9989
+subs_di_test2 (s64 a, s64 b, s64 c)
9993
+ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, #255" } } */
10001
+subs_di_test3 (s64 a, s64 b, s64 c)
10003
+ s64 d = a - (b << 3);
10005
+ /* { dg-final { scan-assembler "subs\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
10009
+ return b + d + c;
10017
+ x = subs_si_test1 (29, 4, 5);
10021
+ x = subs_si_test1 (5, 2, 20);
10025
+ x = subs_si_test2 (29, 4, 5);
10029
+ x = subs_si_test2 (1024, 2, 20);
10033
+ x = subs_si_test3 (35, 4, 5);
10037
+ x = subs_si_test3 (5, 2, 20);
10041
+ y = subs_di_test1 (0x130000029ll,
10045
+ if (y != 0x45000002d)
10048
+ y = subs_di_test1 (0x5000500050005ll,
10049
+ 0x2111211121112ll,
10050
+ 0x0000000002020ll);
10051
+ if (y != 0x7111711171117)
10054
+ y = subs_di_test2 (0x130000029ll,
10057
+ if (y != 0x955050433)
10060
+ y = subs_di_test2 (0x130002900ll,
10063
+ if (y != 0x955052d0a)
10066
+ y = subs_di_test3 (0x130000029ll,
10069
+ if (y != 0x3790504f6)
10072
+ y = subs_di_test3 (0x130002900ll,
10075
+ if (y != 0x27d052dcd)
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
10085
+/* { dg-do run } */
10086
+/* { dg-options "-O2 --save-temps -fno-inline" } */
10088
+extern void abort (void);
10091
+adds_si_test1 (int a, int b, int c)
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\]+" } } */
10100
+ return b + d + c;
10104
+adds_si_test2 (int a, int b, int c)
10106
+ int d = a + 0xfff;
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" } } */
10113
+ return b + d + c;
10117
+adds_si_test3 (int a, int b, int c)
10119
+ int d = a + (b << 3);
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" } } */
10126
+ return b + d + c;
10129
+typedef long long s64;
10132
+adds_di_test1 (s64 a, s64 b, s64 c)
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\]+" } } */
10141
+ return b + d + c;
10145
+adds_di_test2 (s64 a, s64 b, s64 c)
10147
+ s64 d = a + 0x1000ll;
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" } } */
10154
+ return b + d + c;
10158
+adds_di_test3 (s64 a, s64 b, s64 c)
10160
+ s64 d = a + (b << 3);
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" } } */
10167
+ return b + d + c;
10175
+ x = adds_si_test1 (29, 4, 5);
10179
+ x = adds_si_test1 (5, 2, 20);
10183
+ x = adds_si_test2 (29, 4, 5);
10187
+ x = adds_si_test2 (1024, 2, 20);
10191
+ x = adds_si_test3 (35, 4, 5);
10195
+ x = adds_si_test3 (5, 2, 20);
10199
+ y = adds_di_test1 (0x130000029ll,
10203
+ if (y != 0xc75050536)
10206
+ y = adds_di_test1 (0x5000500050005ll,
10207
+ 0x2111211121112ll,
10208
+ 0x0000000002020ll);
10209
+ if (y != 0x9222922294249)
10212
+ y = adds_di_test2 (0x130000029ll,
10215
+ if (y != 0x955051532)
10218
+ y = adds_di_test2 (0x540004100ll,
10221
+ if (y != 0x1065055309)
10224
+ y = adds_di_test3 (0x130000029ll,
10227
+ if (y != 0x9b9050576)
10230
+ y = adds_di_test3 (0x130002900ll,
10233
+ if (y != 0xafd052e4d)
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
10243
/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-all -fno-unroll-loops --save-temps -fno-inline" } */
10245
#define FTYPE double
10246
+#define ITYPE long
10250
#include "vect-fcm.x"
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 @@
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") } {
10270
# cygwin does not support -p.
10271
if { [istarget *-*-cygwin*] && $test_what == "-p" } {
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 @@
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__)
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 @@
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 {
10308
- __asm__ volatile ("vrintn.f32 q0, q0");
10311
- } "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"]
10317
# Return 1 if this is an ARM target supporting -mfpu=vfp
10318
# -mfloat-abi=hard. Some multilibs may be incompatible with these
10320
@@ -2226,7 +2213,8 @@
10321
if { ! [check_effective_target_arm_v8_neon_ok] } {
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"
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]
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.
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"
10348
+ foo (float32x4_t arg)
10350
+ return vcvt_f16_f32 (arg);
10353
+ set et_arm_neon_fp16_flags $flags
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]
10367
+proc add_options_for_arm_neon_fp16 { flags } {
10368
+ if { ! [check_effective_target_arm_neon_fp16_ok] } {
10371
+ global et_arm_neon_fp16_flags
10372
+ return "$flags $et_arm_neon_fp16_flags"
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.
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"
10390
+ __asm__ volatile ("vrintn.f32 q0, q0");
10393
+ set et_arm_v8_neon_flags $flags
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]
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 ""]]
10414
+# Return 1 if the target supports executing ARMv8 NEON instructions, 0
10417
+proc check_effective_target_arm_v8_neon_hw { } {
10418
+ return [check_runtime arm_v8_neon_hw_available {
10419
+ #include "arm_neon.h"
10424
+ asm ("vrinta.f32 %P0, %P1"
10429
+ } [add_options_for_arm_v8_neon ""]]
10432
# Return 1 if this is a ARM target with NEON enabled.
10434
proc check_effective_target_arm_neon { } {
10435
@@ -4591,6 +4670,33 @@
10439
+# Return 1 if programs are intended to be run on hardware rather than
10442
+proc check_effective_target_hw { } {
10444
+ # All "src/sim" simulators set this one.
10445
+ if [board_info target exists is_simulator] {
10446
+ if [board_info target is_simulator] {
10453
+ # The "sid" simulators don't set that one, but at least they set
10455
+ if [board_info target exists slow_simulator] {
10456
+ if [board_info target slow_simulator] {
10466
# Return 1 if the target is a VxWorks kernel.
10468
proc check_effective_target_vxworks_kernel { } {
10469
--- a/src/gcc/testsuite/ChangeLog.linaro
10470
+++ b/src/gcc/testsuite/ChangeLog.linaro
10472
+2013-10-09 Christophe Lyon <christophe.lyon@linaro.org>
10474
+ Backport from trunk r198526,200595,200597.
10475
+ 2013-05-02 Ian Bolton <ian.bolton@arm.com>
10477
+ * gcc.target/aarch64/bics_1.c: New test.
10478
+ * gcc.target/aarch64/bics_2.c: Likewise.
10480
+ 2013-07-02 Ian Bolton <ian.bolton@arm.com>
10482
+ * gcc.target/aarch64/bfxil_1.c: New test.
10483
+ * gcc.target/aarch64/bfxil_2.c: Likewise.
10485
+ 2013-07-02 Ian Bolton <ian.bolton@arm.com>
10487
+ * gcc.target/config/aarch64/insv_1.c: Update to show it doesn't work
10489
+ * gcc.target/config/aarch64/insv_2.c: New test for big endian.
10490
+ * lib/target-supports.exp: Define aarch64_little_endian.
10492
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
10494
+ Backport from trunk r202400.
10495
+ 2013-09-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10497
+ * gcc.target/aarch64/cmn-neg.c: New test.
10499
+2013-10-03 Christophe Lyon <christophe.lyon@linaro.org>
10501
+ Backport from trunk r202164.
10502
+ 2013-09-02 Bin Cheng <bin.cheng@arm.com>
10504
+ * gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.
10506
+2013-10-01 Kugan Vivekanandarajah <kuganv@linaro.org>
10508
+ Backport from trunk r203059,203116.
10509
+ 2013-10-01 Kugan Vivekanandarajah <kuganv@linaro.org>
10512
+ * gcc.target/arm/pr58578.c: New test.
10514
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
10516
+ GCC Linaro 4.8-2013.09 released.
10518
+2013-09-06 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
10520
+ Backport from trunk r201411.
10521
+ 2013-08-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10523
+ * gcc.target/arm/pr46972-2.c: New test.
10525
+2013-09-05 Yvan Roux <yvan.roux@linaro.org>
10527
+ Backport from trunk r201267.
10528
+ 2013-07-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10530
+ * gcc.target/arm/minmax_minus.c: Scan for absence of mov.
10532
+2013-09-05 Christophe Lyon <christophe.lyon@linaro.org>
10534
+ Backport from trunk r199527,199814,201435.
10535
+ 2013-05-31 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10538
+ * gcc.target/arm/iordi3-opt.c: New test.
10540
+ 2013-06-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10543
+ * gcc.target/arm/xordi3-opt.c: New test.
10545
+ 2013-08-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10547
+ * gcc.target/arm/neon-for-64bits-2.c: Delete.
10549
+2013-09-05 Christophe Lyon <christophe.lyon@linaro.org>
10551
+ Backport from trunk r201730,201731.
10553
+ 2013-08-14 Janis Johnson <janisjo@codesourcery.com>
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.
10567
+ 2013-08-14 Janis Johnson <janisjo@codesourcery.com>
10569
+ * gcc.target/arm/pr19599.c: Skip for -mthumb.
10571
+2013-09-03 Venkataramanan Kumar <venkataramanan.kumar@linaro.org>
10573
+ Backport from trunk r201624.
10574
+ 2013-08-09 James Greenhalgh <james.greenhalgh@arm.com>
10576
+ * gcc.target/aarch64/scalar_intrinsics.c: Update expected
10577
+ output of vdup intrinsics
10579
+2013-08-26 Kugan Vivekanandarajah <kuganv@linaro.org>
10581
+ Backport from trunk r201636.
10582
+ 2013-08-09 Yufeng Zhang <yufeng.zhang@arm.com>
10584
+ * gcc.dg/lower-subreg-1.c: Skip aarch64*-*-*.
10586
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
10588
+ GCC Linaro 4.8-2013.08 released.
10590
+2013-08-07 Christophe Lyon <christophe.lyon@linaro.org>
10592
+ Backport from trunk r199720
10593
+ 2013-06-06 Marcus Shawcroft <marcus.shawcroft@arm.com>
10595
+ * gcc.dg/vect/no-section-anchors-vect-68.c:
10596
+ Add dg-skip-if aarch64_tiny.
10598
+2013-08-07 Christophe Lyon <christophe.lyon@linaro.org>
10600
+ Backport from trunk r201237.
10601
+ 2013-07-25 Terry Guo <terry.guo@arm.com>
10603
+ * gcc.target/arm/thumb1-Os-mult.c: New test case.
10605
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
10607
+ Backport from trunk r200596,201067,201083.
10608
+ 2013-07-02 Ian Bolton <ian.bolton@arm.com>
10610
+ * gcc.target/aarch64/abs_1.c: New test.
10612
+ 2013-07-19 Ian Bolton <ian.bolton@arm.com>
10614
+ * gcc.target/aarch64/scalar_intrinsics.c (test_vabs_s64): Added
10617
+ 2013-07-20 James Greenhalgh <james.greenhalgh@arm.com>
10619
+ * gcc.target/aarch64/vabs_intrinsic_1.c: New file.
10621
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
10623
+ Backport from trunk r198864.
10624
+ 2013-05-07 Ian Bolton <ian.bolton@arm.com>
10626
+ * gcc.target/aarch64/ands_1.c: New test.
10627
+ * gcc.target/aarch64/ands_2.c: Likewise
10629
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
10631
+ Backport from trunk r199439,199533,201326.
10633
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
10639
+ 2013-05-31 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
10641
+ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
10643
+ 2013-07-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
10645
+ * gcc.target/arm/pr57637.c: New testcase.
10647
+2013-08-06 Christophe Lyon <christophe.lyon@linaro.org>
10649
+ Backport from trunk r198928,198973,199203,201240,201241.
10650
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
10653
+ * gcc.target/arm/pr40887.c: Adjust testcase.
10654
+ * gcc.target/arm/pr19599.c: New test.
10656
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
10658
+ Backport from trunk r200922.
10659
+ 2013-07-12 Tejas Belagod <tejas.belagod@arm.com>
10661
+ * gcc.target/aarch64/vect-movi.c: New.
10663
+2013-08-05 Yvan Roux <yvan.roux@linaro.org>
10665
+ Backport from trunk r200720.
10666
+ 2013-07-05 Marcus Shawcroft <marcus.shawcroft@arm.com>
10668
+ * gcc.dg/pr57518.c: Adjust scan-rtl-dump-not pattern.
10670
+2013-07-21 Yvan Roux <yvan.roux@linaro.org>
10672
+ Backport from trunk r200204.
10673
+ 2013-06-19 Yufeng Zhang <yufeng.zhang@arm.com>
10675
+ * gcc.dg/torture/stackalign/builtin-apply-2.c: set
10676
+ STACK_ARGUMENTS_SIZE with 0 if __aarch64__ is defined.
10678
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10680
+ GCC Linaro 4.8-2013.07-1 released.
10682
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
10684
+ GCC Linaro 4.8-2013.07 released.
10686
+2013-07-03 Christophe Lyon <christophe.lyon@linaro.org>
10688
+ Revert backport from trunk r198928.
10689
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
10692
+ * gcc.target/arm/pr40887.c: Adjust testcase.
10693
+ * gcc.target/arm/pr19599.c: New test.
10695
+2013-07-03 Christophe Lyon <christophe.lyon@linaro.org>
10697
+ Revert backport from trunk 199439, 199533
10698
+ 2013-05-31 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
10700
+ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
10702
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
10708
+2013-07-02 Rob Savoye <rob.savoye@linaro.org>
10710
+ Backport from trunk 200096
10712
+ 2013-06-14 Vidya Praveen <vidyapraveen@arm.com>
10714
+ * gcc.target/aarch64/vect_smlal_1.c: New file.
10716
+2013-07-02 Rob Savoye <rob.savoye@linaro.org>
10718
+ Backport from trunk 200019
10719
+ 2013-06-12 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
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.
10725
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
10727
+ Backport from trunk 200152
10728
+ 2013-06-17 Sofiane Naci <sofiane.naci@arm.com>
10730
+ * gcc.target/aarch64/scalar_intrinsics.c: Update.
10732
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
10734
+ Backport from trunk 200148
10735
+ 2013-06-17 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10737
+ * gcc.target/arm/unaligned-memcpy-2.c (dest): Initialize to
10738
+ ensure alignment.
10740
+2013-06-20 Rob Savoye <rob.savoye@linaro.org>
10742
+ Backport from trunk 199533
10743
+ 2013-05-31 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
10745
+ * gcc.dg/shrink-wrap-alloca.c: Use __builtin_alloca.
10747
+2013-06-20 Christophe Lyon <christophe.lyon@linaro.org>
10749
+ Backport from trunk r198683.
10750
+ 2013-05-07 Christophe Lyon <christophe.lyon@linaro.org>
10752
+ * lib/target-supports.exp (check_effective_target_hw): New
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.
10766
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
10768
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
10770
+2013-06-06 Zhenqiang Chen <zhenqiang.chen@linaro.org>
10772
+ Backport from mainline r199439.
10773
+ 2013-05-30 Zhenqiang Chen <zhenqiang.chen@linaro.org>
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.
10779
+2013-06-05 Christophe Lyon <christophe.lyon@linaro.org>
10781
+ Backport from trunk r199658.
10782
+ 2013-06-04 Ian Bolton <ian.bolton@arm.com>
10784
+ * gcc.target/aarch64/movi_1.c: New test.
10786
+2013-06-04 Christophe Lyon <christophe.lyon@linaro.org>
10788
+ Backport from trunk r199261.
10789
+ 2013-05-23 Christian Bruel <christian.bruel@st.com>
10792
+ * gcc.dg/debug/pr57351.c: New test
10794
+2013-06-03 Christophe Lyon <christophe.lyon@linaro.org>
10795
+ Backport from trunk r198890,199254,199294,199454.
10797
+ 2013-05-30 Ian Bolton <ian.bolton@arm.com>
10799
+ * gcc.target/aarch64/insv_1.c: New test.
10801
+ 2013-05-24 Ian Bolton <ian.bolton@arm.com>
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.
10808
+ 2013-05-23 Vidya Praveen <vidyapraveen@arm.com>
10810
+ * gcc.target/aarch64/vect-clz.c: New file.
10812
+ 2013-05-14 James Greenhalgh <james.greenhalgh@arm.com>
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.
10823
+2013-05-29 Christophe Lyon <christophe.lyon@linaro.org>
10825
+ Backport from trunk r198928.
10826
+ 2013-05-15 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
10829
+ * gcc.target/arm/pr40887.c: Adjust testcase.
10830
+ * gcc.target/arm/pr19599.c: New test.
10832
+2013-05-28 Christophe Lyon <christophe.lyon@linaro.org>
10834
+ Backport from trunk r198680.
10835
+ 2013-05-07 Sofiane Naci <sofiane.naci@arm.com>
10837
+ * gcc.target/aarch64/scalar_intrinsics.c: Update.
10839
+2013-05-28 Christophe Lyon <christophe.lyon@linaro.org>
10841
+ Backport from trunk r198499-198500.
10842
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
10843
+ * gcc.target/aarch64/vect-vaddv.c: New.
10845
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
10847
+ * gcc.target/aarch64/vect-vmaxv.c: New.
10848
+ * gcc.target/aarch64/vect-vfmaxv.c: Likewise.
10850
+2013-05-23 Christophe Lyon <christophe.lyon@linaro.org>
10852
+ Backport from trunk r198970.
10853
+ 2013-05-16 Greta Yorsh <Greta.Yorsh@arm.com>
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.
10859
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10861
+ GCC Linaro 4.8-2013.05 released.
10863
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10865
+ Backport from trunk r198574-198575.
10866
+ 2013-05-03 Vidya Praveen <vidyapraveen@arm.com>
10868
+ * gcc.target/aarch64/fabd.c: New file.
10870
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10872
+ Backport from trunk r198490-198496.
10873
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
10875
+ * gcc.target/aarch64/scalar-vca.c: New.
10876
+ * gcc.target/aarch64/vect-vca.c: Likewise.
10878
+ 2013-05-01 James Greenhalgh <james.greenhalgh@arm.com>
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.
10896
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10898
+ Backport from trunk r198191.
10899
+ 2013-04-23 Sofiane Naci <sofiane.naci@arm.com>
10901
+ * gcc.target/aarch64/scalar-mov.c: New testcase.
10903
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10905
+ Backport from trunk r197838.
10906
+ 2013-04-11 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
10908
+ * gcc.target/aarch64/negs.c: New.
10910
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10912
+ Backport from trunk r198019.
10913
+ 2013-04-16 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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.
10920
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10922
+ Backport from trunk r198394,198396-198400,198402-198404,198406.
10923
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
10925
+ * lib/target-supports.exp (vect_uintfloat_cvt): Enable for AArch64.
10927
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
10929
+ * gcc.target/aarch64/vect-vcvt.c: New.
10931
+ 2013-04-29 James Greenhalgh <james.greenhalgh@arm.com>
10933
+ * gcc.target/aarch64/vect-vrnd.c: New.
10935
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10937
+ Backport from trunk r198302-198306,198316.
10938
+ 2013-04-25 James Greenhalgh <james.greenhalgh@arm.com>
10939
+ Tejas Belagod <tejas.belagod@arm.com>
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.
10945
+ 2013-04-25 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
10947
+ * gcc.target/aarch64/cmp.c: New.
10949
+ 2013-04-25 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
10951
+ * gcc.target/aarch64/ngc.c: New.
10953
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10955
+ Backport from trunk r198298.
10956
+ 2013-04-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
10965
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10967
+ Backport from trunk r198136-198137,198142,198176
10968
+ 2013-04-22 James Greenhalgh <james.greenhalgh@arm.com>
10970
+ * gcc.target/aarch64/vrecps.c: New.
10971
+ * gcc.target/aarch64/vrecpx.c: Likewise.
10973
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10975
+ Backport from trunk r198020.
10976
+ 2013-04-16 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
10978
+ * gcc.target/aarch64/adds3.c: New.
10979
+ * gcc.target/aarch64/subs3.c: New.
10981
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10983
+ Backport from trunk r197965.
10984
+ 2013-04-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10986
+ * gcc.target/arm/anddi3-opt.c: New test.
10987
+ * gcc.target/arm/anddi3-opt2.c: Likewise.
10989
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10991
+ Backport from trunk r197642.
10992
+ 2013-04-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
10994
+ * gcc.target/arm/minmax_minus.c: New test.
10996
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
10998
+ Backport from trunk r197530,197921.
10999
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
11001
+ * gcc.target/arm/peep-ldrd-1.c: New test.
11002
+ * gcc.target/arm/peep-strd-1.c: Likewise.
11004
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11006
+ Backport from trunk r197523.
11007
+ 2013-04-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
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.
11021
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11023
+ Backport from trunk r197518-197522,197516-197528.
11024
+ 2013-04-05 Greta Yorsh <Greta.Yorsh@arm.com>
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.
11031
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11033
+ Backport from trunk r197489-197491.
11034
+ 2013-04-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
11036
+ * lib/target-supports.exp (check_effective_target_arm_v8_neon_hw):
11038
+ (check_effective_target_arm_v8_neon_ok_nocache):
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
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
11052
+2013-05-02 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11054
+ Backport from trunk r196795-196797,196957.
11055
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
11057
+ * gcc.target/aarch64/sbc.c: New test.
11059
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
11061
+ * gcc.target/aarch64/ror.c: New test.
11063
+ 2013-03-19 Ian Bolton <ian.bolton@arm.com>
11065
+ * gcc.target/aarch64/extr.c: New test.
11067
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11069
+ * GCC Linaro 4.8-2013.04 released.
11071
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11073
+ Backport from trunk r197052.
11074
+ 2013-03-25 Kyrylo Tkachov <kyrylo.tkachov at arm.com>
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.
11093
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11095
+ Backport from trunk r197051.
11096
+ 2013-03-25 Kyrylo Tkachov <kyrylo.tkachov at arm.com>
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.
11130
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11132
+ Backport from trunk r196876.
11133
+ 2013-03-21 Christophe Lyon <christophe.lyon@linaro.org>
11135
+ * gcc.target/arm/neon-for-64bits-1.c: New tests.
11136
+ * gcc.target/arm/neon-for-64bits-2.c: Likewise.
11138
+2013-04-08 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11140
+ Backport from trunk r196858.
11141
+ 2013-03-21 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
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
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" } } */
11164
--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c
11165
+++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-alloca.c
11167
+/* { dg-do compile } */
11168
+/* { dg-options "-O2 -g" } */
11176
+ p = __builtin_alloca (4);
11178
--- a/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c
11179
+++ b/src/gcc/testsuite/gcc.dg/shrink-wrap-pretend.c
11181
+/* { dg-do compile } */
11182
+/* { dg-options "-O2 -g" } */
11184
+#include <stdlib.h>
11185
+#include <stdio.h>
11186
+#include <stdarg.h>
11188
+#define DEBUG_BUFFER_SIZE 80
11189
+int unifi_debug = 5;
11192
+unifi_trace (void* ospriv, int level, const char *fmt, ...)
11194
+ static char s[DEBUG_BUFFER_SIZE];
11196
+ unsigned int len;
11201
+ if (unifi_debug >= level)
11203
+ va_start (args, fmt);
11204
+ len = vsnprintf (&(s)[0], (DEBUG_BUFFER_SIZE), fmt, args);
11207
+ if (len >= DEBUG_BUFFER_SIZE)
11209
+ (s)[DEBUG_BUFFER_SIZE - 2] = '\n';
11210
+ (s)[DEBUG_BUFFER_SIZE - 1] = 0;
11213
+ printf ("%s", s);
11217
--- a/src/gcc/testsuite/gcc.dg/debug/pr57351.c
11218
+++ b/src/gcc/testsuite/gcc.dg/debug/pr57351.c
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 } */
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
11236
+ index_type lower_bound;
11237
+ index_type _ubound;
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;
11243
+all_l8 (gfc_array_l8 * const restrict retarray,
11244
+ gfc_array_l1 * const restrict array,
11245
+ const index_type * const restrict pdim)
11247
+ GFC_LOGICAL_8 * restrict dest;
11250
+ index_type delta;
11252
+ dim = (*pdim) - 1;
11253
+ len = ((array)->dim[dim]._ubound + 1 - (array)->dim[dim].lower_bound);
11254
+ for (n = 0; n < dim; n++)
11256
+ const GFC_LOGICAL_1 * restrict src;
11257
+ GFC_LOGICAL_8 result;
11261
+ for (n = 0; n < len; n++, src += delta)
11274
--- a/src/gcc/testsuite/gcc.dg/lower-subreg-1.c
11275
+++ b/src/gcc/testsuite/gcc.dg/lower-subreg-1.c
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
11285
+/* { dg-do compile } */
11286
+/* { dg-options "-O2 -g" } */
11288
+unsigned char a, b, d, f, g;
11295
+ if (c == 0) return test ();
11299
+ int e = (a & 0x0f) - (g & 0x0f);
11301
+ if (!a) b |= 0x80;
11303
+ f = g/5 + a*3879 + b *2985;
11307
+ f = g + a*39879 + b *25;
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
11314
E, F and G are passed on stack. So the size of the stack argument
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
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
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} {"*"} {""} }
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
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
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
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
11378
/* { dg-do run { target setrlimit } } */
11379
/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
11380
+/* { dg-require-effective-target hw } */
11381
/* { dg-shouldfail "asan" } */
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
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 @@
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
11415
/* { dg-do run { target { *-*-linux* } } } */
11416
/* { dg-require-effective-target clone } */
11417
+/* { dg-require-effective-target hw } */
11418
/* { dg-options "-D_GNU_SOURCE" } */
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
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
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
11446
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11448
+ GCC Linaro 4.8-2013.09 released.
11450
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11452
+ GCC Linaro 4.8-2013.08 released.
11454
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11456
+ GCC Linaro 4.8-2013.07-1 released.
11458
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11460
+ GCC Linaro 4.8-2013.07 released.
11462
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11464
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11466
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11468
+ GCC Linaro 4.8-2013.05 released.
11470
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11472
+ * GCC Linaro 4.8-2013.04 released.
11473
--- a/src/gcc/cp/ChangeLog.linaro
11474
+++ b/src/gcc/cp/ChangeLog.linaro
11476
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11478
+ GCC Linaro 4.8-2013.09 released.
11480
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11482
+ GCC Linaro 4.8-2013.08 released.
11484
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11486
+ GCC Linaro 4.8-2013.07-1 released.
11488
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11490
+ GCC Linaro 4.8-2013.07 released.
11492
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11494
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11496
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11498
+ GCC Linaro 4.8-2013.05 released.
11500
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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++)
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)
11515
for (j = 0; j < n_iv_uses (data); j++)
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))
11522
+ if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at))
11524
- if (closest == NULL || uid > gimple_uid (closest->stmt))
11527
+ if (uid < gimple_uid (cand->incremented_at)
11528
+ && (closest_before == NULL
11529
+ || uid > gimple_uid (closest_before->stmt)))
11530
+ closest_before = use;
11532
+ if (uid > gimple_uid (cand->incremented_at)
11533
+ && (closest_after == NULL
11534
+ || uid < gimple_uid (closest_after->stmt)))
11535
+ closest_after = use;
11537
- if (closest == NULL || !autoinc_possible_for_pair (data, closest, cand))
11539
- cand->ainc_use = closest;
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;
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)
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
11567
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11569
+ GCC Linaro 4.8-2013.09 released.
11571
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11573
+ GCC Linaro 4.8-2013.08 released.
11575
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11577
+ GCC Linaro 4.8-2013.07-1 released.
11579
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11581
+ GCC Linaro 4.8-2013.07 released.
11583
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11585
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11587
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11589
+ GCC Linaro 4.8-2013.05 released.
11591
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11593
+ * GCC Linaro 4.8-2013.04 released.
11594
--- a/src/gcc/ada/ChangeLog.linaro
11595
+++ b/src/gcc/ada/ChangeLog.linaro
11597
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11599
+ GCC Linaro 4.8-2013.09 released.
11601
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11603
+ GCC Linaro 4.8-2013.08 released.
11605
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11607
+ GCC Linaro 4.8-2013.07-1 released.
11609
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11611
+ GCC Linaro 4.8-2013.07 released.
11613
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11615
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11617
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11619
+ GCC Linaro 4.8-2013.05 released.
11621
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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
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 }
11635
--- a/src/gcc/fortran/ChangeLog.linaro
11636
+++ b/src/gcc/fortran/ChangeLog.linaro
11638
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11640
+ GCC Linaro 4.8-2013.09 released.
11642
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11644
+ GCC Linaro 4.8-2013.08 released.
11646
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11648
+ GCC Linaro 4.8-2013.07-1 released.
11650
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11652
+ GCC Linaro 4.8-2013.07 released.
11654
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11656
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11658
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11660
+ GCC Linaro 4.8-2013.05 released.
11662
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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 @@
11669
AC_SUBST(CONFIGURE_SPECS)
11671
-ACX_PKGVERSION([GCC])
11672
+ACX_PKGVERSION([Linaro GCC `cat $srcdir/LINARO-VERSION`])
11673
ACX_BUGURL([http://gcc.gnu.org/bugs.html])
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 \
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++)
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++)
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);
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++)
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);
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++)
11729
+ CLEAR_REGNO_REG_SET (live_out, i);
11730
+ CLEAR_REGNO_REG_SET (live_in, i);
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++)
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++)
11743
+ SET_REGNO_REG_SET (live_out, i);
11744
+ SET_REGNO_REG_SET (live_in, i);
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
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;
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);
11766
+ else if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
11767
+ changed |= targetm.gimple_fold_builtin (gsi);
11771
--- a/src/gcc/lto/ChangeLog.linaro
11772
+++ b/src/gcc/lto/ChangeLog.linaro
11774
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11776
+ GCC Linaro 4.8-2013.09 released.
11778
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11780
+ GCC Linaro 4.8-2013.08 released.
11782
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11784
+ GCC Linaro 4.8-2013.07-1 released.
11786
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11788
+ GCC Linaro 4.8-2013.07 released.
11790
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11792
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11794
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11796
+ GCC Linaro 4.8-2013.05 released.
11798
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11800
+ * GCC Linaro 4.8-2013.04 released.
11801
--- a/src/gcc/po/ChangeLog.linaro
11802
+++ b/src/gcc/po/ChangeLog.linaro
11804
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
11806
+ GCC Linaro 4.8-2013.09 released.
11808
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
11810
+ GCC Linaro 4.8-2013.08 released.
11812
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11814
+ GCC Linaro 4.8-2013.07-1 released.
11816
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
11818
+ GCC Linaro 4.8-2013.07 released.
11820
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
11822
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
11824
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
11826
+ GCC Linaro 4.8-2013.05 released.
11828
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
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 @@
11837
+ /* We may have changed the comparison operands. Re-canonicalize. */
11838
+ if (swap_commutative_operands_p (op0, op1))
11840
+ tem = op0, op0 = op1, op1 = tem;
11841
+ code = swap_condition (code);
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"
11857
@@ -885,10 +886,6 @@
11858
tmake_file="$tmake_file arm/t-linux-androideabi"
11861
- # The BPABI long long divmod functions return a 128-bit value in
11862
- # registers r0-r3. Correctly modeling that requires the use of
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
11875
- need_64bit_hwint=yes
11876
# The EABI requires the use of __cxa_atexit.
11877
default_use_cxa_atexit=yes
11879
@@ -909,10 +902,6 @@
11881
tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
11883
- # The BPABI long long divmod functions return a 128-bit value in
11884
- # registers r0-r3. Correctly modeling that requires the use of
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 @@
11894
/* Iterator object for GIMPLE statement sequences. */
11897
+struct gimple_stmt_iterator_d
11899
/* Sequence node holding the current statement. */
11900
gimple_seq_node ptr;
11901
@@ -141,9 +141,8 @@
11902
block/sequence is removed. */
11905
-} gimple_stmt_iterator;
11909
/* Data structure definitions for GIMPLE tuples. NOTE: word markers
11910
are for 64 bit hosts. */
11912
--- a/src/gcc/config/i386/linux-common.h
11913
+++ b/src/gcc/config/i386/linux-common.h
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)
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)"
11929
+#define GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC \
11931
+ %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
11933
#define GNU_USER_TARGET_LIB_SPEC \
11934
- "%{pthread:-lpthread} \
11936
- %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
11937
+ "%{pthread:-lpthread} " \
11938
+ GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC
11941
#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
11943
--- a/src/gcc/config/aarch64/aarch64-simd.md
11944
+++ b/src/gcc/config/aarch64/aarch64-simd.md
11947
; Main data types used by the insntructions
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"))
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.
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 @@
11983
@@ -161,9 +163,9 @@
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")
12006
(const_string "unknown")))
12007
@@ -355,18 +357,6 @@
12008
(set_attr "simd_mode" "<MODE>")]
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")])
12018
- "dup\\t%<v>0<Vmtype>, %1.<Vetype>[%2]"
12019
- [(set_attr "simd_type" "simd_dup")
12020
- (set_attr "simd_mode" "<MODE>")]
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";
12030
- return aarch64_output_simd_mov_immediate (&operands[1],
12031
+ return aarch64_output_simd_mov_immediate (operands[1],
12033
default: gcc_unreachable ();
12035
@@ -414,16 +404,20 @@
12037
switch (which_alternative)
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 "#";
12046
+ return "ld1\t{%0.<Vtype>}, %1";
12048
+ return "st1\t{%1.<Vtype>}, %0";
12050
+ return "orr\t%0.<Vbtype>, %1.<Vbtype>, %1.<Vbtype>";
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);
12061
+ gcc_unreachable ();
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);
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]))))"
12077
+ aarch64_split_simd_move (operands[0], operands[1]);
12081
+(define_expand "aarch64_split_simd_mov<mode>"
12082
+ [(set (match_operand:VQ 0)
12083
+ (match_operand:VQ 1))]
12086
+ rtx dst = operands[0];
12087
+ rtx src = operands[1];
12089
+ if (GP_REGNUM_P (REGNO (src)))
12091
+ rtx src_low_part = gen_lowpart (<VHALF>mode, src);
12092
+ rtx src_high_part = gen_highpart (<VHALF>mode, src);
12095
+ (gen_move_lo_quad_<mode> (dst, src_low_part));
12097
+ (gen_move_hi_quad_<mode> (dst, src_high_part));
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);
12108
+ (gen_aarch64_simd_mov_from_<mode>low (dst_low_part, src, lo));
12110
+ (gen_aarch64_simd_mov_from_<mode>high (dst_high_part, src, hi));
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")
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")
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 @@
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")))]
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>")]
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"))))]
12164
+ "sabd\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
12165
+ [(set_attr "simd_type" "simd_abd")
12166
+ (set_attr "simd_mode" "<MODE>")]
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")))]
12176
+ "saba\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
12177
+ [(set_attr "simd_type" "simd_abd")
12178
+ (set_attr "simd_mode" "<MODE>")]
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"))))]
12187
+ "fabd\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
12188
+ [(set_attr "simd_type" "simd_fabd")
12189
+ (set_attr "simd_mode" "<MODE>")]
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"))))]
12198
+ "fabd\t%<s>0, %<s>1, %<s>2"
12199
+ [(set_attr "simd_type" "simd_fabd")
12200
+ (set_attr "mode" "<MODE>")]
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 @@
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")))]
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>")]
12221
@@ -917,29 +1027,39 @@
12222
;; Move into low-half clearing high half to 0.
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")
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))))]
12232
- "mov\\t%d0, %d1";
12233
- [(set_attr "simd_type" "simd_dup")
12234
- (set_attr "simd_mode" "<MODE>")]
12236
+ dup\\t%d0, %1.d[0]
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")]
12247
;; Move into high-half.
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")
12253
(vec_select:<VHALF>
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")))]
12259
- "ins\\t%0.d[1], %1.d[0]";
12260
- [(set_attr "simd_type" "simd_ins")
12261
- (set_attr "simd_mode" "<MODE>")]
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")]
12270
(define_expand "move_hi_quad_<mode>"
12271
@@ -1045,6 +1165,104 @@
12273
;; Widening arithmetic.
12275
+(define_insn "*aarch64_<su>mlal_lo<mode>"
12276
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
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")
12285
+ (match_operand:<VWIDE> 1 "register_operand" "0")))]
12287
+ "<su>mlal\t%0.<Vwtype>, %2.<Vhalftype>, %4.<Vhalftype>"
12288
+ [(set_attr "simd_type" "simd_mlal")
12289
+ (set_attr "simd_mode" "<MODE>")]
12292
+(define_insn "*aarch64_<su>mlal_hi<mode>"
12293
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
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")
12302
+ (match_operand:<VWIDE> 1 "register_operand" "0")))]
12304
+ "<su>mlal2\t%0.<Vwtype>, %2.<Vtype>, %4.<Vtype>"
12305
+ [(set_attr "simd_type" "simd_mlal")
12306
+ (set_attr "simd_mode" "<MODE>")]
12309
+(define_insn "*aarch64_<su>mlsl_lo<mode>"
12310
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
12312
+ (match_operand:<VWIDE> 1 "register_operand" "0")
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))))))]
12321
+ "<su>mlsl\t%0.<Vwtype>, %2.<Vhalftype>, %4.<Vhalftype>"
12322
+ [(set_attr "simd_type" "simd_mlal")
12323
+ (set_attr "simd_mode" "<MODE>")]
12326
+(define_insn "*aarch64_<su>mlsl_hi<mode>"
12327
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
12329
+ (match_operand:<VWIDE> 1 "register_operand" "0")
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))))))]
12338
+ "<su>mlsl2\t%0.<Vwtype>, %2.<Vtype>, %4.<Vtype>"
12339
+ [(set_attr "simd_type" "simd_mlal")
12340
+ (set_attr "simd_mode" "<MODE>")]
12343
+(define_insn "*aarch64_<su>mlal<mode>"
12344
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
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")))]
12353
+ "<su>mlal\t%0.<Vwtype>, %1.<Vtype>, %2.<Vtype>"
12354
+ [(set_attr "simd_type" "simd_mlal")
12355
+ (set_attr "simd_mode" "<MODE>")]
12358
+(define_insn "*aarch64_<su>mlsl<mode>"
12359
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
12361
+ (match_operand:<VWIDE> 1 "register_operand" "0")
12363
+ (ANY_EXTEND:<VWIDE>
12364
+ (match_operand:VDW 2 "register_operand" "w"))
12365
+ (ANY_EXTEND:<VWIDE>
12366
+ (match_operand:VDW 3 "register_operand" "w")))))]
12368
+ "<su>mlsl\t%0.<Vwtype>, %2.<Vtype>, %3.<Vtype>"
12369
+ [(set_attr "simd_type" "simd_mlal")
12370
+ (set_attr "simd_mode" "<MODE>")]
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>")]
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")]
12387
@@ -1206,16 +1426,9 @@
12388
(set_attr "simd_mode" "<MODE>")]
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")]
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>")]
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")]
12419
+ UNSPEC_FRINTZ)))]
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)))]
12431
+(define_expand "ftrunc<VDQF:mode>2"
12432
+ [(set (match_operand:VDQF 0 "register_operand")
12433
+ (unspec:VDQF [(match_operand:VDQF 1 "register_operand")]
12438
+(define_insn "<optab><fcvt_target><VDQF:mode>2"
12439
+ [(set (match_operand:VDQF 0 "register_operand" "=w")
12441
+ (match_operand:<FCVT_TARGET> 1 "register_operand" "w")))]
12443
+ "<su_optab>cvtf\\t%0.<Vtype>, %1.<Vtype>"
12444
+ [(set_attr "simd_type" "simd_icvtf")
12445
+ (set_attr "simd_mode" "<MODE>")]
12448
+;; Conversions between vectors of floats and doubles.
12449
+;; Contains a mix of patterns to match standard pattern names
12450
+;; and those for intrinsics.
12452
+;; Float widening operations.
12454
+(define_insn "vec_unpacks_lo_v4sf"
12455
+ [(set (match_operand:V2DF 0 "register_operand" "=w")
12456
+ (float_extend:V2DF
12458
+ (match_operand:V4SF 1 "register_operand" "w")
12459
+ (parallel [(const_int 0) (const_int 1)])
12462
+ "fcvtl\\t%0.2d, %1.2s"
12463
+ [(set_attr "simd_type" "simd_fcvtl")
12464
+ (set_attr "simd_mode" "V2DF")]
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")))]
12472
+ "fcvtl\\t%0.2d, %1.2s"
12473
+ [(set_attr "simd_type" "simd_fcvtl")
12474
+ (set_attr "simd_mode" "V2DF")]
12477
+(define_insn "vec_unpacks_hi_v4sf"
12478
+ [(set (match_operand:V2DF 0 "register_operand" "=w")
12479
+ (float_extend:V2DF
12481
+ (match_operand:V4SF 1 "register_operand" "w")
12482
+ (parallel [(const_int 2) (const_int 3)])
12485
+ "fcvtl2\\t%0.2d, %1.4s"
12486
+ [(set_attr "simd_type" "simd_fcvtl")
12487
+ (set_attr "simd_mode" "V2DF")]
12490
+;; Float narrowing operations.
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")))]
12497
+ "fcvtn\\t%0.2s, %1.2d"
12498
+ [(set_attr "simd_type" "simd_fcvtl")
12499
+ (set_attr "simd_mode" "V2SF")]
12502
+(define_insn "aarch64_float_truncate_hi_v4sf"
12503
+ [(set (match_operand:V4SF 0 "register_operand" "=w")
12505
+ (match_operand:V2SF 1 "register_operand" "0")
12506
+ (float_truncate:V2SF
12507
+ (match_operand:V2DF 2 "register_operand" "w"))))]
12509
+ "fcvtn2\\t%0.4s, %2.2d"
12510
+ [(set_attr "simd_type" "simd_fcvtl")
12511
+ (set_attr "simd_mode" "V4SF")]
12514
+(define_expand "vec_pack_trunc_v2df"
12515
+ [(set (match_operand:V4SF 0 "register_operand")
12517
+ (float_truncate:V2SF
12518
+ (match_operand:V2DF 1 "register_operand"))
12519
+ (float_truncate:V2SF
12520
+ (match_operand:V2DF 2 "register_operand"))
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]));
12532
+(define_expand "vec_pack_trunc_df"
12533
+ [(set (match_operand:V2SF 0 "register_operand")
12535
+ (float_truncate:SF
12536
+ (match_operand:DF 1 "register_operand"))
12537
+ (float_truncate:SF
12538
+ (match_operand:DF 2 "register_operand"))
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));
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
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")))]
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>")]
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")]
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>")]
12585
-;; FP 'across lanes' max and min ops.
12586
+;; 'across lanes' add.
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")]
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")]
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>")]
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")]
12611
+ "addp\\t%d0, %1.2d"
12612
+ [(set_attr "simd_type" "simd_addv")
12613
+ (set_attr "simd_mode" "V2DI")]
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")]
12621
+ "addp\\t%0.2s, %1.2s, %1.2s"
12622
+ [(set_attr "simd_type" "simd_addv")
12623
+ (set_attr "simd_mode" "V2SI")]
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")]
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>")]
12639
-;; FP 'across lanes' add.
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")]
12646
@@ -1315,169 +1672,106 @@
12647
(set_attr "simd_mode" "V4SF")]
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")]
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));
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")))]
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));
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")]
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>")]
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")]
12701
+;; 'across lanes' max and min ops.
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")]
12711
-;; Reduction across lanes.
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")]
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>")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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>")]
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")]
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")]
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")]
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
12841
+;; Operand 1 is the mask, operands 2 and 3 are the bitfields from which
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)
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
12858
(define_insn "aarch64_simd_bsl<mode>_internal"
12859
[(set (match_operand:VALL 0 "register_operand" "=w,w,w")
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")]
12867
+ (match_operand:<V_cmp_result> 1 "register_operand" " 0,w,w")
12868
+ (match_operand:VALL 2 "register_operand" " w,w,0"))
12870
+ (not:<V_cmp_result>
12871
+ (match_dup:<V_cmp_result> 1))
12872
+ (match_operand:VALL 3 "register_operand" " w,0,w"))
12876
bsl\\t%0.<Vbtype>, %2.<Vbtype>, %3.<Vbtype>
12877
@@ -1486,28 +1780,32 @@
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")]
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")]
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]));
12900
-(define_expand "aarch64_vcond_internal<mode>"
12901
+(define_expand "aarch64_vcond_internal<mode><mode>"
12902
[(set (match_operand:VDQ 0 "register_operand")
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")))]
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);
12918
switch (GET_CODE (operands[3]))
12919
@@ -1548,12 +1846,12 @@
12923
- emit_insn (gen_aarch64_cmhs<mode> (mask, operands[4], operands[5]));
12924
+ emit_insn (gen_aarch64_cmgeu<mode> (mask, operands[4], operands[5]));
12929
- emit_insn (gen_aarch64_cmhi<mode> (mask, operands[4], operands[5]));
12930
+ emit_insn (gen_aarch64_cmgtu<mode> (mask, operands[4], operands[5]));
12934
@@ -1566,30 +1864,47 @@
12938
- emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[2],
12941
- emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[1],
12944
+ op1 = operands[2];
12945
+ op2 = operands[1];
12948
+ /* If we have (a = (b CMP c) ? -1 : 0);
12949
+ Then we can simply move the generated mask. */
12951
+ if (op1 == CONSTM1_RTX (<V_cmp_result>mode)
12952
+ && op2 == CONST0_RTX (<V_cmp_result>mode))
12953
+ emit_move_insn (operands[0], mask);
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,
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")
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")))]
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);
12991
rtx (*base_comparison) (rtx, rtx, rtx);
12992
rtx (*complimentary_comparison) (rtx, rtx, rtx);
12993
@@ -1609,7 +1924,7 @@
12994
/* Fall through. */
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]);
13001
switch (GET_CODE (operands[3]))
13002
@@ -1622,8 +1937,8 @@
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>;
13013
@@ -1631,14 +1946,14 @@
13014
/* Fall through. */
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>;
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>;
13031
gcc_unreachable ();
13032
@@ -1666,10 +1981,10 @@
13033
switch (GET_CODE (operands[3]))
13036
- base_comparison = gen_aarch64_cmlt<mode>;
13037
+ base_comparison = gen_aarch64_cmlt<VDQF:mode>;
13040
- base_comparison = gen_aarch64_cmle<mode>;
13041
+ base_comparison = gen_aarch64_cmle<VDQF:mode>;
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. */
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;
13058
@@ -1723,20 +2038,36 @@
13059
swap_bsl_operands = 1;
13060
/* Fall through. */
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));
13070
gcc_unreachable ();
13073
if (swap_bsl_operands)
13074
- emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[2],
13077
- emit_insn (gen_aarch64_simd_bsl<mode> (operands[0], mask, operands[1],
13080
+ op1 = operands[2];
13081
+ op2 = operands[1];
13084
+ /* If we have (a = (b CMP c) ? -1 : 0);
13085
+ Then we can simply move the generated mask. */
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);
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,
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")))]
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]));
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")))]
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]));
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")))]
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]));
13154
@@ -1785,45 +2132,50 @@
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")
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")]))))]
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>")]
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")
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")]))))]
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>")]
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")
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")])))]
13205
- "mov\\t%0.<Vetype>[0], %1.<Vetype>[%2]"
13206
- [(set_attr "simd_type" "simd_ins")
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>")]
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")]
13223
aarch64_simd_lane_bounds (operands[2], 0, 1);
13224
@@ -1944,16 +2296,30 @@
13225
(set_attr "simd_mode" "<MODE>")]
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")))]
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>")]
13239
+ "&& reload_completed"
13242
+ aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
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")))]
13252
+ emit_insn (gen_move_lo_quad_<Vdbl> (operands[0], operands[1]));
13253
+ emit_insn (gen_move_hi_quad_<Vdbl> (operands[0], operands[2]));
13257
;; <su><addsub>l<q>.
13259
(define_insn "aarch64_<ANY_EXTEND:su><ADDSUB:optab>l2<mode>_internal"
13260
@@ -2861,28 +3227,6 @@
13261
(set_attr "simd_mode" "<MODE>")]
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")]
13272
- emit_insn (gen_ashl<mode>3 (operands[0], operands[1], operands[2]));
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")]
13282
- emit_insn (gen_ashl<mode>3 (operands[0], operands[1], operands[2]));
13288
(define_insn "aarch64_<sur>shll_n<mode>"
13289
@@ -2927,28 +3271,6 @@
13290
(set_attr "simd_mode" "<MODE>")]
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")]
13301
- emit_insn (gen_ashr<mode>3 (operands[0], operands[1], operands[2]));
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")]
13311
- emit_insn (gen_lshr<mode>3 (operands[0], operands[1], operands[2]));
13317
(define_insn "aarch64_<sur>shr_n<mode>"
13318
@@ -3034,52 +3356,180 @@
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.
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")]
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")
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>")]
13350
+(define_insn_and_split "aarch64_cm<optab>di"
13351
+ [(set (match_operand:DI 0 "register_operand" "=w,w,r")
13354
+ (match_operand:DI 1 "register_operand" "w,w,r")
13355
+ (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,ZDz,r")
13357
+ (clobber (reg:CC CC_REGNUM))]
13360
+ cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
13361
+ cm<optab>\t%d0, %d1, #0
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]))"
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));
13376
+ [(set_attr "simd_type" "simd_cmp")
13377
+ (set_attr "simd_mode" "DI")]
13380
-(define_insn "aarch64_cm<cmp><mode>"
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")]
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")
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>")]
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")
13406
+ (match_operand:DI 1 "register_operand" "w,r")
13407
+ (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,r")
13409
+ (clobber (reg:CC CC_REGNUM))]
13412
+ cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
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]))"
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));
13427
+ [(set_attr "simd_type" "simd_cmp")
13428
+ (set_attr "simd_mode" "DI")]
13431
-(define_insn "aarch64_cm<cmp><mode>"
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>
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)))))]
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>")]
13448
+(define_insn_and_split "aarch64_cmtstdi"
13449
+ [(set (match_operand:DI 0 "register_operand" "=w,r")
13453
+ (match_operand:DI 1 "register_operand" "w,r")
13454
+ (match_operand:DI 2 "register_operand" "w,r"))
13456
+ (clobber (reg:CC CC_REGNUM))]
13459
+ cmtst\t%d0, %d1, %d2
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]))"
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));
13475
+ [(set_attr "simd_type" "simd_cmp")
13476
+ (set_attr "simd_mode" "DI")]
13479
+;; fcm(eq|ge|gt|le|lt)
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")]
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")
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>")]
13503
+;; Note we can also handle what would be fac(le|lt) by
13504
+;; generating fac(ge|gt).
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"))
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>")]
13521
(define_insn "aarch64_addp<mode>"
13522
@@ -3105,30 +3555,6 @@
13523
(set_attr "simd_mode" "DI")]
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")))]
13534
- emit_insn (gen_<maxmin><mode>3 (operands[0], operands[1], operands[2]));
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")]
13545
- "<fmaxmin>\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
13546
- [(set_attr "simd_type" "simd_fminmax")
13547
- (set_attr "simd_mode" "<MODE>")]
13552
(define_insn "sqrt<mode>2"
13553
@@ -3140,16 +3566,6 @@
13554
(set_attr "simd_mode" "<MODE>")]
13557
-(define_expand "aarch64_sqrt<mode>"
13558
- [(match_operand:VDQF 0 "register_operand" "=w")
13559
- (match_operand:VDQF 1 "register_operand" "w")]
13562
- emit_insn (gen_sqrt<mode>2 (operands[0], operands[1]));
13567
;; Patterns for vector struct loads and stores.
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>")])
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")]
13580
+ "frecpe\\t%0.<Vtype>, %1.<Vtype>"
13581
+ [(set_attr "simd_type" "simd_frecpe")
13582
+ (set_attr "simd_mode" "<MODE>")]
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")]
13591
+ "frecps\\t%0.<Vtype>, %1.<Vtype>, %2.<Vtype>"
13592
+ [(set_attr "simd_type" "simd_frecps")
13593
+ (set_attr "simd_mode" "<MODE>")]
13596
--- a/src/gcc/config/aarch64/predicates.md
13597
+++ b/src/gcc/config/aarch64/predicates.md
13599
(ior (match_operand 0 "register_operand")
13600
(match_test "op == const0_rtx"))))
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)"))))
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,
13614
-(define_predicate "aarch64_const_address"
13615
- (and (match_code "symbol_ref")
13616
- (match_test "mode == DImode && CONSTANT_ADDRESS_P (op)")))
13618
(define_predicate "aarch64_valid_symref"
13619
(match_code "const, symbol_ref, label_ref")
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);
13628
(define_predicate "aarch64_tls_ie_symref"
13629
@@ -165,15 +165,10 @@
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)")))))
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 @@
13651
#define ASM_COMMENT_START "//"
13653
-#define REGISTER_PREFIX ""
13654
#define LOCAL_LABEL_PREFIX "."
13655
#define USER_LABEL_PREFIX ""
13657
--- a/src/gcc/config/aarch64/arm_neon.h
13658
+++ b/src/gcc/config/aarch64/arm_neon.h
13661
#include <stdint.h>
13663
+#define __AARCH64_UINT64_C(__C) ((uint64_t) __C)
13664
+#define __AARCH64_INT64_C(__C) ((int64_t) __C)
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 @@
13673
+/* vget_lane internal macros. */
13675
+#define __aarch64_vget_lane_any(__size, __cast_ret, __cast_a, __a, __b) \
13677
+ __builtin_aarch64_get_lane##__size (__cast_a __a, __b))
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)
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)
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)
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)
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)
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)
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)
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)
13733
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
13734
vadd_s8 (int8x8_t __a, int8x8_t __b)
13736
@@ -2307,155 +2369,156 @@
13737
return (poly16x4_t) __a;
13742
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
13743
+vget_lane_f32 (float32x2_t __a, const int __b)
13745
+ return __aarch64_vget_lane_f32 (__a, __b);
13748
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
13749
+vget_lane_f64 (float64x1_t __a, const int __b)
13751
+ return __aarch64_vget_lane_f64 (__a, __b);
13754
+__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
13755
+vget_lane_p8 (poly8x8_t __a, const int __b)
13757
+ return __aarch64_vget_lane_p8 (__a, __b);
13760
+__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
13761
+vget_lane_p16 (poly16x4_t __a, const int __b)
13763
+ return __aarch64_vget_lane_p16 (__a, __b);
13766
__extension__ static __inline int8_t __attribute__ ((__always_inline__))
13767
vget_lane_s8 (int8x8_t __a, const int __b)
13769
- return (int8_t) __builtin_aarch64_get_lane_signedv8qi (__a, __b);
13770
+ return __aarch64_vget_lane_s8 (__a, __b);
13773
__extension__ static __inline int16_t __attribute__ ((__always_inline__))
13774
vget_lane_s16 (int16x4_t __a, const int __b)
13776
- return (int16_t) __builtin_aarch64_get_lane_signedv4hi (__a, __b);
13777
+ return __aarch64_vget_lane_s16 (__a, __b);
13780
__extension__ static __inline int32_t __attribute__ ((__always_inline__))
13781
vget_lane_s32 (int32x2_t __a, const int __b)
13783
- return (int32_t) __builtin_aarch64_get_lane_signedv2si (__a, __b);
13784
+ return __aarch64_vget_lane_s32 (__a, __b);
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)
13792
- return (float32_t) __builtin_aarch64_get_lanev2sf (__a, __b);
13793
+ return __aarch64_vget_lane_s64 (__a, __b);
13796
__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
13797
vget_lane_u8 (uint8x8_t __a, const int __b)
13799
- return (uint8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a,
13801
+ return __aarch64_vget_lane_u8 (__a, __b);
13804
__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
13805
vget_lane_u16 (uint16x4_t __a, const int __b)
13807
- return (uint16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a,
13809
+ return __aarch64_vget_lane_u16 (__a, __b);
13812
__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
13813
vget_lane_u32 (uint32x2_t __a, const int __b)
13815
- return (uint32_t) __builtin_aarch64_get_lane_unsignedv2si ((int32x2_t) __a,
13817
+ return __aarch64_vget_lane_u32 (__a, __b);
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)
13825
- return (poly8_t) __builtin_aarch64_get_lane_unsignedv8qi ((int8x8_t) __a,
13827
+ return __aarch64_vget_lane_u64 (__a, __b);
13830
-__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
13831
-vget_lane_p16 (poly16x4_t __a, const int __b)
13834
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
13835
+vgetq_lane_f32 (float32x4_t __a, const int __b)
13837
- return (poly16_t) __builtin_aarch64_get_lane_unsignedv4hi ((int16x4_t) __a,
13839
+ return __aarch64_vgetq_lane_f32 (__a, __b);
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)
13847
- return (int64_t) __builtin_aarch64_get_lanedi (__a, __b);
13848
+ return __aarch64_vgetq_lane_f64 (__a, __b);
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)
13856
- return (uint64_t) __builtin_aarch64_get_lanedi ((int64x1_t) __a, __b);
13857
+ return __aarch64_vgetq_lane_p8 (__a, __b);
13860
+__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
13861
+vgetq_lane_p16 (poly16x8_t __a, const int __b)
13863
+ return __aarch64_vgetq_lane_p16 (__a, __b);
13866
__extension__ static __inline int8_t __attribute__ ((__always_inline__))
13867
vgetq_lane_s8 (int8x16_t __a, const int __b)
13869
- return (int8_t) __builtin_aarch64_get_lane_signedv16qi (__a, __b);
13870
+ return __aarch64_vgetq_lane_s8 (__a, __b);
13873
__extension__ static __inline int16_t __attribute__ ((__always_inline__))
13874
vgetq_lane_s16 (int16x8_t __a, const int __b)
13876
- return (int16_t) __builtin_aarch64_get_lane_signedv8hi (__a, __b);
13877
+ return __aarch64_vgetq_lane_s16 (__a, __b);
13880
__extension__ static __inline int32_t __attribute__ ((__always_inline__))
13881
vgetq_lane_s32 (int32x4_t __a, const int __b)
13883
- return (int32_t) __builtin_aarch64_get_lane_signedv4si (__a, __b);
13884
+ return __aarch64_vgetq_lane_s32 (__a, __b);
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)
13892
- return (float32_t) __builtin_aarch64_get_lanev4sf (__a, __b);
13893
+ return __aarch64_vgetq_lane_s64 (__a, __b);
13896
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
13897
-vgetq_lane_f64 (float64x2_t __a, const int __b)
13899
- return (float64_t) __builtin_aarch64_get_lanev2df (__a, __b);
13902
__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
13903
vgetq_lane_u8 (uint8x16_t __a, const int __b)
13905
- return (uint8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a,
13907
+ return __aarch64_vgetq_lane_u8 (__a, __b);
13910
__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
13911
vgetq_lane_u16 (uint16x8_t __a, const int __b)
13913
- return (uint16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a,
13915
+ return __aarch64_vgetq_lane_u16 (__a, __b);
13918
__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
13919
vgetq_lane_u32 (uint32x4_t __a, const int __b)
13921
- return (uint32_t) __builtin_aarch64_get_lane_unsignedv4si ((int32x4_t) __a,
13923
+ return __aarch64_vgetq_lane_u32 (__a, __b);
13926
-__extension__ static __inline poly8_t __attribute__ ((__always_inline__))
13927
-vgetq_lane_p8 (poly8x16_t __a, const int __b)
13929
- return (poly8_t) __builtin_aarch64_get_lane_unsignedv16qi ((int8x16_t) __a,
13933
-__extension__ static __inline poly16_t __attribute__ ((__always_inline__))
13934
-vgetq_lane_p16 (poly16x8_t __a, const int __b)
13936
- return (poly16_t) __builtin_aarch64_get_lane_unsignedv8hi ((int16x8_t) __a,
13940
-__extension__ static __inline int64_t __attribute__ ((__always_inline__))
13941
-vgetq_lane_s64 (int64x2_t __a, const int __b)
13943
- return __builtin_aarch64_get_lane_unsignedv2di (__a, __b);
13946
__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
13947
vgetq_lane_u64 (uint64x2_t __a, const int __b)
13949
- return (uint64_t) __builtin_aarch64_get_lane_unsignedv2di ((int64x2_t) __a,
13951
+ return __aarch64_vgetq_lane_u64 (__a, __b);
13954
+/* vreinterpret */
13956
__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
13957
vreinterpret_p8_s8 (int8x8_t __a)
13959
@@ -3805,6 +3868,85 @@
13960
return (uint32x4_t) __builtin_aarch64_reinterpretv4siv8hi ((int16x8_t) __a);
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);
13968
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
13969
+vget_low_f32 (float32x4_t __a)
13974
+__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
13975
+vget_low_f64 (float64x2_t __a)
13977
+ return vgetq_lane_f64 (__a, 0);
13980
+__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
13981
+vget_low_p8 (poly8x16_t __a)
13986
+__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
13987
+vget_low_p16 (poly16x8_t __a)
13992
+__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
13993
+vget_low_s8 (int8x16_t __a)
13998
+__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
13999
+vget_low_s16 (int16x8_t __a)
14004
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
14005
+vget_low_s32 (int32x4_t __a)
14010
+__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
14011
+vget_low_s64 (int64x2_t __a)
14013
+ return vgetq_lane_s64 (__a, 0);
14016
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
14017
+vget_low_u8 (uint8x16_t __a)
14022
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
14023
+vget_low_u16 (uint16x8_t __a)
14028
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14029
+vget_low_u32 (uint32x4_t __a)
14034
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14035
+vget_low_u64 (uint64x2_t __a)
14037
+ return vgetq_lane_u64 (__a, 0);
14042
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
14043
vcombine_s8 (int8x8_t __a, int8x8_t __b)
14045
@@ -4468,160 +4610,6 @@
14049
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
14050
-vabs_f32 (float32x2_t a)
14052
- float32x2_t result;
14053
- __asm__ ("fabs %0.2s,%1.2s"
14056
- : /* No clobbers */);
14060
-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
14061
-vabs_s8 (int8x8_t a)
14064
- __asm__ ("abs %0.8b,%1.8b"
14067
- : /* No clobbers */);
14071
-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
14072
-vabs_s16 (int16x4_t a)
14074
- int16x4_t result;
14075
- __asm__ ("abs %0.4h,%1.4h"
14078
- : /* No clobbers */);
14082
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
14083
-vabs_s32 (int32x2_t a)
14085
- int32x2_t result;
14086
- __asm__ ("abs %0.2s,%1.2s"
14089
- : /* No clobbers */);
14093
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
14094
-vabsq_f32 (float32x4_t a)
14096
- float32x4_t result;
14097
- __asm__ ("fabs %0.4s,%1.4s"
14100
- : /* No clobbers */);
14104
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
14105
-vabsq_f64 (float64x2_t a)
14107
- float64x2_t result;
14108
- __asm__ ("fabs %0.2d,%1.2d"
14111
- : /* No clobbers */);
14115
-__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
14116
-vabsq_s8 (int8x16_t a)
14118
- int8x16_t result;
14119
- __asm__ ("abs %0.16b,%1.16b"
14122
- : /* No clobbers */);
14126
-__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
14127
-vabsq_s16 (int16x8_t a)
14129
- int16x8_t result;
14130
- __asm__ ("abs %0.8h,%1.8h"
14133
- : /* No clobbers */);
14137
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
14138
-vabsq_s32 (int32x4_t a)
14140
- int32x4_t result;
14141
- __asm__ ("abs %0.4s,%1.4s"
14144
- : /* No clobbers */);
14148
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
14149
-vabsq_s64 (int64x2_t a)
14151
- int64x2_t result;
14152
- __asm__ ("abs %0.2d,%1.2d"
14155
- : /* No clobbers */);
14159
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14160
-vacged_f64 (float64_t a, float64_t b)
14162
- float64_t result;
14163
- __asm__ ("facge %d0,%d1,%d2"
14166
- : /* No clobbers */);
14170
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14171
-vacges_f32 (float32_t a, float32_t b)
14173
- float32_t result;
14174
- __asm__ ("facge %s0,%s1,%s2"
14177
- : /* No clobbers */);
14181
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14182
-vacgtd_f64 (float64_t a, float64_t b)
14184
- float64_t result;
14185
- __asm__ ("facgt %d0,%d1,%d2"
14188
- : /* No clobbers */);
14192
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14193
-vacgts_f32 (float32_t a, float32_t b)
14195
- float32_t result;
14196
- __asm__ ("facgt %s0,%s1,%s2"
14199
- : /* No clobbers */);
14203
__extension__ static __inline int16_t __attribute__ ((__always_inline__))
14204
vaddlv_s8 (int8x8_t a)
14206
@@ -4732,116 +4720,6 @@
14210
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
14211
-vaddv_s8 (int8x8_t a)
14214
- __asm__ ("addv %b0,%1.8b"
14217
- : /* No clobbers */);
14221
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
14222
-vaddv_s16 (int16x4_t a)
14225
- __asm__ ("addv %h0,%1.4h"
14228
- : /* No clobbers */);
14232
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
14233
-vaddv_u8 (uint8x8_t a)
14236
- __asm__ ("addv %b0,%1.8b"
14239
- : /* No clobbers */);
14243
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
14244
-vaddv_u16 (uint16x4_t a)
14247
- __asm__ ("addv %h0,%1.4h"
14250
- : /* No clobbers */);
14254
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
14255
-vaddvq_s8 (int8x16_t a)
14258
- __asm__ ("addv %b0,%1.16b"
14261
- : /* No clobbers */);
14265
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
14266
-vaddvq_s16 (int16x8_t a)
14269
- __asm__ ("addv %h0,%1.8h"
14272
- : /* No clobbers */);
14276
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
14277
-vaddvq_s32 (int32x4_t a)
14280
- __asm__ ("addv %s0,%1.4s"
14283
- : /* No clobbers */);
14287
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
14288
-vaddvq_u8 (uint8x16_t a)
14291
- __asm__ ("addv %b0,%1.16b"
14294
- : /* No clobbers */);
14298
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
14299
-vaddvq_u16 (uint16x8_t a)
14302
- __asm__ ("addv %h0,%1.8h"
14305
- : /* No clobbers */);
14309
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
14310
-vaddvq_u32 (uint32x4_t a)
14313
- __asm__ ("addv %s0,%1.4s"
14316
- : /* No clobbers */);
14320
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
14321
vbsl_f32 (uint32x2_t a, float32x2_t b, float32x2_t c)
14323
@@ -5095,358 +4973,6 @@
14327
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14328
-vcage_f32 (float32x2_t a, float32x2_t b)
14330
- uint32x2_t result;
14331
- __asm__ ("facge %0.2s, %1.2s, %2.2s"
14334
- : /* No clobbers */);
14338
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14339
-vcageq_f32 (float32x4_t a, float32x4_t b)
14341
- uint32x4_t result;
14342
- __asm__ ("facge %0.4s, %1.4s, %2.4s"
14345
- : /* No clobbers */);
14349
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14350
-vcageq_f64 (float64x2_t a, float64x2_t b)
14352
- uint64x2_t result;
14353
- __asm__ ("facge %0.2d, %1.2d, %2.2d"
14356
- : /* No clobbers */);
14360
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14361
-vcagt_f32 (float32x2_t a, float32x2_t b)
14363
- uint32x2_t result;
14364
- __asm__ ("facgt %0.2s, %1.2s, %2.2s"
14367
- : /* No clobbers */);
14371
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14372
-vcagtq_f32 (float32x4_t a, float32x4_t b)
14374
- uint32x4_t result;
14375
- __asm__ ("facgt %0.4s, %1.4s, %2.4s"
14378
- : /* No clobbers */);
14382
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14383
-vcagtq_f64 (float64x2_t a, float64x2_t b)
14385
- uint64x2_t result;
14386
- __asm__ ("facgt %0.2d, %1.2d, %2.2d"
14389
- : /* No clobbers */);
14393
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14394
-vcale_f32 (float32x2_t a, float32x2_t b)
14396
- uint32x2_t result;
14397
- __asm__ ("facge %0.2s, %2.2s, %1.2s"
14400
- : /* No clobbers */);
14404
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14405
-vcaleq_f32 (float32x4_t a, float32x4_t b)
14407
- uint32x4_t result;
14408
- __asm__ ("facge %0.4s, %2.4s, %1.4s"
14411
- : /* No clobbers */);
14415
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14416
-vcaleq_f64 (float64x2_t a, float64x2_t b)
14418
- uint64x2_t result;
14419
- __asm__ ("facge %0.2d, %2.2d, %1.2d"
14422
- : /* No clobbers */);
14426
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14427
-vcalt_f32 (float32x2_t a, float32x2_t b)
14429
- uint32x2_t result;
14430
- __asm__ ("facgt %0.2s, %2.2s, %1.2s"
14433
- : /* No clobbers */);
14437
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14438
-vcaltq_f32 (float32x4_t a, float32x4_t b)
14440
- uint32x4_t result;
14441
- __asm__ ("facgt %0.4s, %2.4s, %1.4s"
14444
- : /* No clobbers */);
14448
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14449
-vcaltq_f64 (float64x2_t a, float64x2_t b)
14451
- uint64x2_t result;
14452
- __asm__ ("facgt %0.2d, %2.2d, %1.2d"
14455
- : /* No clobbers */);
14459
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14460
-vceq_f32 (float32x2_t a, float32x2_t b)
14462
- uint32x2_t result;
14463
- __asm__ ("fcmeq %0.2s, %1.2s, %2.2s"
14466
- : /* No clobbers */);
14470
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14471
-vceq_f64 (float64x1_t a, float64x1_t b)
14473
- uint64x1_t result;
14474
- __asm__ ("fcmeq %d0, %d1, %d2"
14477
- : /* No clobbers */);
14481
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14482
-vceqd_f64 (float64_t a, float64_t b)
14484
- float64_t result;
14485
- __asm__ ("fcmeq %d0,%d1,%d2"
14488
- : /* No clobbers */);
14492
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14493
-vceqq_f32 (float32x4_t a, float32x4_t b)
14495
- uint32x4_t result;
14496
- __asm__ ("fcmeq %0.4s, %1.4s, %2.4s"
14499
- : /* No clobbers */);
14503
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14504
-vceqq_f64 (float64x2_t a, float64x2_t b)
14506
- uint64x2_t result;
14507
- __asm__ ("fcmeq %0.2d, %1.2d, %2.2d"
14510
- : /* No clobbers */);
14514
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14515
-vceqs_f32 (float32_t a, float32_t b)
14517
- float32_t result;
14518
- __asm__ ("fcmeq %s0,%s1,%s2"
14521
- : /* No clobbers */);
14525
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14526
-vceqzd_f64 (float64_t a)
14528
- float64_t result;
14529
- __asm__ ("fcmeq %d0,%d1,#0"
14532
- : /* No clobbers */);
14536
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14537
-vceqzs_f32 (float32_t a)
14539
- float32_t result;
14540
- __asm__ ("fcmeq %s0,%s1,#0"
14543
- : /* No clobbers */);
14547
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14548
-vcge_f32 (float32x2_t a, float32x2_t b)
14550
- uint32x2_t result;
14551
- __asm__ ("fcmge %0.2s, %1.2s, %2.2s"
14554
- : /* No clobbers */);
14558
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14559
-vcge_f64 (float64x1_t a, float64x1_t b)
14561
- uint64x1_t result;
14562
- __asm__ ("fcmge %d0, %d1, %d2"
14565
- : /* No clobbers */);
14569
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14570
-vcgeq_f32 (float32x4_t a, float32x4_t b)
14572
- uint32x4_t result;
14573
- __asm__ ("fcmge %0.4s, %1.4s, %2.4s"
14576
- : /* No clobbers */);
14580
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14581
-vcgeq_f64 (float64x2_t a, float64x2_t b)
14583
- uint64x2_t result;
14584
- __asm__ ("fcmge %0.2d, %1.2d, %2.2d"
14587
- : /* No clobbers */);
14591
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14592
-vcgt_f32 (float32x2_t a, float32x2_t b)
14594
- uint32x2_t result;
14595
- __asm__ ("fcmgt %0.2s, %1.2s, %2.2s"
14598
- : /* No clobbers */);
14602
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14603
-vcgt_f64 (float64x1_t a, float64x1_t b)
14605
- uint64x1_t result;
14606
- __asm__ ("fcmgt %d0, %d1, %d2"
14609
- : /* No clobbers */);
14613
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14614
-vcgtq_f32 (float32x4_t a, float32x4_t b)
14616
- uint32x4_t result;
14617
- __asm__ ("fcmgt %0.4s, %1.4s, %2.4s"
14620
- : /* No clobbers */);
14624
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14625
-vcgtq_f64 (float64x2_t a, float64x2_t b)
14627
- uint64x2_t result;
14628
- __asm__ ("fcmgt %0.2d, %1.2d, %2.2d"
14631
- : /* No clobbers */);
14635
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14636
-vcle_f32 (float32x2_t a, float32x2_t b)
14638
- uint32x2_t result;
14639
- __asm__ ("fcmge %0.2s, %2.2s, %1.2s"
14642
- : /* No clobbers */);
14646
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14647
-vcle_f64 (float64x1_t a, float64x1_t b)
14649
- uint64x1_t result;
14650
- __asm__ ("fcmge %d0, %d2, %d1"
14653
- : /* No clobbers */);
14657
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14658
-vcleq_f32 (float32x4_t a, float32x4_t b)
14660
- uint32x4_t result;
14661
- __asm__ ("fcmge %0.4s, %2.4s, %1.4s"
14664
- : /* No clobbers */);
14668
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14669
-vcleq_f64 (float64x2_t a, float64x2_t b)
14671
- uint64x2_t result;
14672
- __asm__ ("fcmge %0.2d, %2.2d, %1.2d"
14675
- : /* No clobbers */);
14679
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
14680
vcls_s8 (int8x8_t a)
14682
@@ -5513,50 +5039,6 @@
14686
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14687
-vclt_f32 (float32x2_t a, float32x2_t b)
14689
- uint32x2_t result;
14690
- __asm__ ("fcmgt %0.2s, %2.2s, %1.2s"
14693
- : /* No clobbers */);
14697
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
14698
-vclt_f64 (float64x1_t a, float64x1_t b)
14700
- uint64x1_t result;
14701
- __asm__ ("fcmgt %d0, %d2, %d1"
14704
- : /* No clobbers */);
14708
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14709
-vcltq_f32 (float32x4_t a, float32x4_t b)
14711
- uint32x4_t result;
14712
- __asm__ ("fcmgt %0.4s, %2.4s, %1.4s"
14715
- : /* No clobbers */);
14719
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14720
-vcltq_f64 (float64x2_t a, float64x2_t b)
14722
- uint64x2_t result;
14723
- __asm__ ("fcmgt %0.2d, %2.2d, %1.2d"
14726
- : /* No clobbers */);
14730
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
14731
vclz_s8 (int8x8_t a)
14733
@@ -5915,100 +5397,12 @@
14735
/* vcvt_f32_f16 not supported */
14737
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
14738
-vcvt_f32_f64 (float64x2_t a)
14740
- float32x2_t result;
14741
- __asm__ ("fcvtn %0.2s,%1.2d"
14744
- : /* No clobbers */);
14748
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
14749
-vcvt_f32_s32 (int32x2_t a)
14751
- float32x2_t result;
14752
- __asm__ ("scvtf %0.2s, %1.2s"
14755
- : /* No clobbers */);
14759
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
14760
-vcvt_f32_u32 (uint32x2_t a)
14762
- float32x2_t result;
14763
- __asm__ ("ucvtf %0.2s, %1.2s"
14766
- : /* No clobbers */);
14770
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
14771
-vcvt_f64_f32 (float32x2_t a)
14773
- float64x2_t result;
14774
- __asm__ ("fcvtl %0.2d,%1.2s"
14777
- : /* No clobbers */);
14781
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
14782
-vcvt_f64_s64 (uint64x1_t a)
14784
- float64x1_t result;
14785
- __asm__ ("scvtf %d0, %d1"
14788
- : /* No clobbers */);
14792
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
14793
-vcvt_f64_u64 (uint64x1_t a)
14795
- float64x1_t result;
14796
- __asm__ ("ucvtf %d0, %d1"
14799
- : /* No clobbers */);
14803
/* vcvt_high_f16_f32 not supported */
14805
/* vcvt_high_f32_f16 not supported */
14807
static float32x2_t vdup_n_f32 (float32_t);
14809
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
14810
-vcvt_high_f32_f64 (float32x2_t a, float64x2_t b)
14812
- float32x4_t result = vcombine_f32 (a, vdup_n_f32 (0.0f));
14813
- __asm__ ("fcvtn2 %0.4s,%2.2d"
14816
- : /* No clobbers */);
14820
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
14821
-vcvt_high_f64_f32 (float32x4_t a)
14823
- float64x2_t result;
14824
- __asm__ ("fcvtl2 %0.2d,%1.4s"
14827
- : /* No clobbers */);
14831
#define vcvt_n_f32_s32(a, b) \
14834
@@ -6057,160 +5451,6 @@
14838
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
14839
-vcvt_s32_f32 (float32x2_t a)
14841
- int32x2_t result;
14842
- __asm__ ("fcvtzs %0.2s, %1.2s"
14845
- : /* No clobbers */);
14849
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14850
-vcvt_u32_f32 (float32x2_t a)
14852
- uint32x2_t result;
14853
- __asm__ ("fcvtzu %0.2s, %1.2s"
14856
- : /* No clobbers */);
14860
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
14861
-vcvta_s32_f32 (float32x2_t a)
14863
- int32x2_t result;
14864
- __asm__ ("fcvtas %0.2s, %1.2s"
14867
- : /* No clobbers */);
14871
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
14872
-vcvta_u32_f32 (float32x2_t a)
14874
- uint32x2_t result;
14875
- __asm__ ("fcvtau %0.2s, %1.2s"
14878
- : /* No clobbers */);
14882
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14883
-vcvtad_s64_f64 (float64_t a)
14885
- float64_t result;
14886
- __asm__ ("fcvtas %d0,%d1"
14889
- : /* No clobbers */);
14893
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
14894
-vcvtad_u64_f64 (float64_t a)
14896
- float64_t result;
14897
- __asm__ ("fcvtau %d0,%d1"
14900
- : /* No clobbers */);
14904
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
14905
-vcvtaq_s32_f32 (float32x4_t a)
14907
- int32x4_t result;
14908
- __asm__ ("fcvtas %0.4s, %1.4s"
14911
- : /* No clobbers */);
14915
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
14916
-vcvtaq_s64_f64 (float64x2_t a)
14918
- int64x2_t result;
14919
- __asm__ ("fcvtas %0.2d, %1.2d"
14922
- : /* No clobbers */);
14926
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
14927
-vcvtaq_u32_f32 (float32x4_t a)
14929
- uint32x4_t result;
14930
- __asm__ ("fcvtau %0.4s, %1.4s"
14933
- : /* No clobbers */);
14937
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
14938
-vcvtaq_u64_f64 (float64x2_t a)
14940
- uint64x2_t result;
14941
- __asm__ ("fcvtau %0.2d, %1.2d"
14944
- : /* No clobbers */);
14948
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14949
-vcvtas_s64_f64 (float32_t a)
14951
- float32_t result;
14952
- __asm__ ("fcvtas %s0,%s1"
14955
- : /* No clobbers */);
14959
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
14960
-vcvtas_u64_f64 (float32_t a)
14962
- float32_t result;
14963
- __asm__ ("fcvtau %s0,%s1"
14966
- : /* No clobbers */);
14970
-__extension__ static __inline int64_t __attribute__ ((__always_inline__))
14971
-vcvtd_f64_s64 (int64_t a)
14974
- __asm__ ("scvtf %d0,%d1"
14977
- : /* No clobbers */);
14981
-__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
14982
-vcvtd_f64_u64 (uint64_t a)
14985
- __asm__ ("ucvtf %d0,%d1"
14988
- : /* No clobbers */);
14992
#define vcvtd_n_f64_s64(a, b) \
14995
@@ -6259,402 +5499,6 @@
14999
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15000
-vcvtd_s64_f64 (float64_t a)
15002
- float64_t result;
15003
- __asm__ ("fcvtzs %d0,%d1"
15006
- : /* No clobbers */);
15010
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15011
-vcvtd_u64_f64 (float64_t a)
15013
- float64_t result;
15014
- __asm__ ("fcvtzu %d0,%d1"
15017
- : /* No clobbers */);
15021
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
15022
-vcvtm_s32_f32 (float32x2_t a)
15024
- int32x2_t result;
15025
- __asm__ ("fcvtms %0.2s, %1.2s"
15028
- : /* No clobbers */);
15032
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
15033
-vcvtm_u32_f32 (float32x2_t a)
15035
- uint32x2_t result;
15036
- __asm__ ("fcvtmu %0.2s, %1.2s"
15039
- : /* No clobbers */);
15043
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15044
-vcvtmd_s64_f64 (float64_t a)
15046
- float64_t result;
15047
- __asm__ ("fcvtms %d0,%d1"
15050
- : /* No clobbers */);
15054
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15055
-vcvtmd_u64_f64 (float64_t a)
15057
- float64_t result;
15058
- __asm__ ("fcvtmu %d0,%d1"
15061
- : /* No clobbers */);
15065
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
15066
-vcvtmq_s32_f32 (float32x4_t a)
15068
- int32x4_t result;
15069
- __asm__ ("fcvtms %0.4s, %1.4s"
15072
- : /* No clobbers */);
15076
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
15077
-vcvtmq_s64_f64 (float64x2_t a)
15079
- int64x2_t result;
15080
- __asm__ ("fcvtms %0.2d, %1.2d"
15083
- : /* No clobbers */);
15087
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
15088
-vcvtmq_u32_f32 (float32x4_t a)
15090
- uint32x4_t result;
15091
- __asm__ ("fcvtmu %0.4s, %1.4s"
15094
- : /* No clobbers */);
15098
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
15099
-vcvtmq_u64_f64 (float64x2_t a)
15101
- uint64x2_t result;
15102
- __asm__ ("fcvtmu %0.2d, %1.2d"
15105
- : /* No clobbers */);
15109
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15110
-vcvtms_s64_f64 (float32_t a)
15112
- float32_t result;
15113
- __asm__ ("fcvtms %s0,%s1"
15116
- : /* No clobbers */);
15120
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15121
-vcvtms_u64_f64 (float32_t a)
15123
- float32_t result;
15124
- __asm__ ("fcvtmu %s0,%s1"
15127
- : /* No clobbers */);
15131
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
15132
-vcvtn_s32_f32 (float32x2_t a)
15134
- int32x2_t result;
15135
- __asm__ ("fcvtns %0.2s, %1.2s"
15138
- : /* No clobbers */);
15142
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
15143
-vcvtn_u32_f32 (float32x2_t a)
15145
- uint32x2_t result;
15146
- __asm__ ("fcvtnu %0.2s, %1.2s"
15149
- : /* No clobbers */);
15153
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15154
-vcvtnd_s64_f64 (float64_t a)
15156
- float64_t result;
15157
- __asm__ ("fcvtns %d0,%d1"
15160
- : /* No clobbers */);
15164
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15165
-vcvtnd_u64_f64 (float64_t a)
15167
- float64_t result;
15168
- __asm__ ("fcvtnu %d0,%d1"
15171
- : /* No clobbers */);
15175
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
15176
-vcvtnq_s32_f32 (float32x4_t a)
15178
- int32x4_t result;
15179
- __asm__ ("fcvtns %0.4s, %1.4s"
15182
- : /* No clobbers */);
15186
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
15187
-vcvtnq_s64_f64 (float64x2_t a)
15189
- int64x2_t result;
15190
- __asm__ ("fcvtns %0.2d, %1.2d"
15193
- : /* No clobbers */);
15197
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
15198
-vcvtnq_u32_f32 (float32x4_t a)
15200
- uint32x4_t result;
15201
- __asm__ ("fcvtnu %0.4s, %1.4s"
15204
- : /* No clobbers */);
15208
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
15209
-vcvtnq_u64_f64 (float64x2_t a)
15211
- uint64x2_t result;
15212
- __asm__ ("fcvtnu %0.2d, %1.2d"
15215
- : /* No clobbers */);
15219
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15220
-vcvtns_s64_f64 (float32_t a)
15222
- float32_t result;
15223
- __asm__ ("fcvtns %s0,%s1"
15226
- : /* No clobbers */);
15230
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15231
-vcvtns_u64_f64 (float32_t a)
15233
- float32_t result;
15234
- __asm__ ("fcvtnu %s0,%s1"
15237
- : /* No clobbers */);
15241
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
15242
-vcvtp_s32_f32 (float32x2_t a)
15244
- int32x2_t result;
15245
- __asm__ ("fcvtps %0.2s, %1.2s"
15248
- : /* No clobbers */);
15252
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
15253
-vcvtp_u32_f32 (float32x2_t a)
15255
- uint32x2_t result;
15256
- __asm__ ("fcvtpu %0.2s, %1.2s"
15259
- : /* No clobbers */);
15263
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15264
-vcvtpd_s64_f64 (float64_t a)
15266
- float64_t result;
15267
- __asm__ ("fcvtps %d0,%d1"
15270
- : /* No clobbers */);
15274
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
15275
-vcvtpd_u64_f64 (float64_t a)
15277
- float64_t result;
15278
- __asm__ ("fcvtpu %d0,%d1"
15281
- : /* No clobbers */);
15285
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
15286
-vcvtpq_s32_f32 (float32x4_t a)
15288
- int32x4_t result;
15289
- __asm__ ("fcvtps %0.4s, %1.4s"
15292
- : /* No clobbers */);
15296
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
15297
-vcvtpq_s64_f64 (float64x2_t a)
15299
- int64x2_t result;
15300
- __asm__ ("fcvtps %0.2d, %1.2d"
15303
- : /* No clobbers */);
15307
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
15308
-vcvtpq_u32_f32 (float32x4_t a)
15310
- uint32x4_t result;
15311
- __asm__ ("fcvtpu %0.4s, %1.4s"
15314
- : /* No clobbers */);
15318
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
15319
-vcvtpq_u64_f64 (float64x2_t a)
15321
- uint64x2_t result;
15322
- __asm__ ("fcvtpu %0.2d, %1.2d"
15325
- : /* No clobbers */);
15329
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15330
-vcvtps_s64_f64 (float32_t a)
15332
- float32_t result;
15333
- __asm__ ("fcvtps %s0,%s1"
15336
- : /* No clobbers */);
15340
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15341
-vcvtps_u64_f64 (float32_t a)
15343
- float32_t result;
15344
- __asm__ ("fcvtpu %s0,%s1"
15347
- : /* No clobbers */);
15351
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
15352
-vcvtq_f32_s32 (int32x4_t a)
15354
- float32x4_t result;
15355
- __asm__ ("scvtf %0.4s, %1.4s"
15358
- : /* No clobbers */);
15362
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
15363
-vcvtq_f32_u32 (uint32x4_t a)
15365
- float32x4_t result;
15366
- __asm__ ("ucvtf %0.4s, %1.4s"
15369
- : /* No clobbers */);
15373
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
15374
-vcvtq_f64_s64 (int64x2_t a)
15376
- float64x2_t result;
15377
- __asm__ ("scvtf %0.2d, %1.2d"
15380
- : /* No clobbers */);
15384
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
15385
-vcvtq_f64_u64 (uint64x2_t a)
15387
- float64x2_t result;
15388
- __asm__ ("ucvtf %0.2d, %1.2d"
15391
- : /* No clobbers */);
15395
#define vcvtq_n_f32_s32(a, b) \
15398
@@ -6751,72 +5595,6 @@
15402
-__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
15403
-vcvtq_s32_f32 (float32x4_t a)
15405
- int32x4_t result;
15406
- __asm__ ("fcvtzs %0.4s, %1.4s"
15409
- : /* No clobbers */);
15413
-__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
15414
-vcvtq_s64_f64 (float64x2_t a)
15416
- int64x2_t result;
15417
- __asm__ ("fcvtzs %0.2d, %1.2d"
15420
- : /* No clobbers */);
15424
-__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
15425
-vcvtq_u32_f32 (float32x4_t a)
15427
- uint32x4_t result;
15428
- __asm__ ("fcvtzu %0.4s, %1.4s"
15431
- : /* No clobbers */);
15435
-__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
15436
-vcvtq_u64_f64 (float64x2_t a)
15438
- uint64x2_t result;
15439
- __asm__ ("fcvtzu %0.2d, %1.2d"
15442
- : /* No clobbers */);
15446
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
15447
-vcvts_f64_s32 (int32_t a)
15450
- __asm__ ("scvtf %s0,%s1"
15453
- : /* No clobbers */);
15457
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
15458
-vcvts_f64_u32 (uint32_t a)
15461
- __asm__ ("ucvtf %s0,%s1"
15464
- : /* No clobbers */);
15468
#define vcvts_n_f32_s32(a, b) \
15471
@@ -6865,28 +5643,6 @@
15475
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15476
-vcvts_s64_f64 (float32_t a)
15478
- float32_t result;
15479
- __asm__ ("fcvtzs %s0,%s1"
15482
- : /* No clobbers */);
15486
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15487
-vcvts_u64_f64 (float32_t a)
15489
- float32_t result;
15490
- __asm__ ("fcvtzu %s0,%s1"
15493
- : /* No clobbers */);
15497
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
15498
vcvtx_f32_f64 (float64x2_t a)
15500
@@ -8110,151 +6866,7 @@
15504
-#define vget_lane_f64(a, b) \
15507
- float64x1_t a_ = (a); \
15508
- float64_t result; \
15509
- __asm__ ("umov %x0, %1.d[%2]" \
15511
- : "w"(a_), "i"(b) \
15512
- : /* No clobbers */); \
15516
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
15517
-vget_low_f32 (float32x4_t a)
15519
- float32x2_t result;
15520
- __asm__ ("ins %0.d[0], %1.d[0]"
15523
- : /* No clobbers */);
15527
-__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
15528
-vget_low_f64 (float64x2_t a)
15530
- float64x1_t result;
15531
- __asm__ ("ins %0.d[0], %1.d[0]"
15534
- : /* No clobbers */);
15538
-__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
15539
-vget_low_p8 (poly8x16_t a)
15541
- poly8x8_t result;
15542
- __asm__ ("ins %0.d[0], %1.d[0]"
15545
- : /* No clobbers */);
15549
-__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
15550
-vget_low_p16 (poly16x8_t a)
15552
- poly16x4_t result;
15553
- __asm__ ("ins %0.d[0], %1.d[0]"
15556
- : /* No clobbers */);
15560
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
15561
-vget_low_s8 (int8x16_t a)
15564
- __asm__ ("ins %0.d[0], %1.d[0]"
15567
- : /* No clobbers */);
15571
-__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
15572
-vget_low_s16 (int16x8_t a)
15574
- int16x4_t result;
15575
- __asm__ ("ins %0.d[0], %1.d[0]"
15578
- : /* No clobbers */);
15582
-__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
15583
-vget_low_s32 (int32x4_t a)
15585
- int32x2_t result;
15586
- __asm__ ("ins %0.d[0], %1.d[0]"
15589
- : /* No clobbers */);
15593
-__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
15594
-vget_low_s64 (int64x2_t a)
15596
- int64x1_t result;
15597
- __asm__ ("ins %0.d[0], %1.d[0]"
15600
- : /* No clobbers */);
15604
-__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
15605
-vget_low_u8 (uint8x16_t a)
15607
- uint8x8_t result;
15608
- __asm__ ("ins %0.d[0], %1.d[0]"
15611
- : /* No clobbers */);
15615
-__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
15616
-vget_low_u16 (uint16x8_t a)
15618
- uint16x4_t result;
15619
- __asm__ ("ins %0.d[0], %1.d[0]"
15622
- : /* No clobbers */);
15626
-__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
15627
-vget_low_u32 (uint32x4_t a)
15629
- uint32x2_t result;
15630
- __asm__ ("ins %0.d[0], %1.d[0]"
15633
- : /* No clobbers */);
15637
-__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
15638
-vget_low_u64 (uint64x2_t a)
15640
- uint64x1_t result;
15641
- __asm__ ("ins %0.d[0], %1.d[0]"
15644
- : /* No clobbers */);
15648
-__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
15649
vhsub_s8 (int8x8_t a, int8x8_t b)
15652
@@ -8962,303 +7574,6 @@
15656
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
15657
-vmaxnm_f32 (float32x2_t a, float32x2_t b)
15659
- float32x2_t result;
15660
- __asm__ ("fmaxnm %0.2s,%1.2s,%2.2s"
15663
- : /* No clobbers */);
15667
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
15668
-vmaxnmq_f32 (float32x4_t a, float32x4_t b)
15670
- float32x4_t result;
15671
- __asm__ ("fmaxnm %0.4s,%1.4s,%2.4s"
15674
- : /* No clobbers */);
15678
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
15679
-vmaxnmq_f64 (float64x2_t a, float64x2_t b)
15681
- float64x2_t result;
15682
- __asm__ ("fmaxnm %0.2d,%1.2d,%2.2d"
15685
- : /* No clobbers */);
15689
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15690
-vmaxnmvq_f32 (float32x4_t a)
15692
- float32_t result;
15693
- __asm__ ("fmaxnmv %s0,%1.4s"
15696
- : /* No clobbers */);
15700
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
15701
-vmaxv_s8 (int8x8_t a)
15704
- __asm__ ("smaxv %b0,%1.8b"
15707
- : /* No clobbers */);
15711
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
15712
-vmaxv_s16 (int16x4_t a)
15715
- __asm__ ("smaxv %h0,%1.4h"
15718
- : /* No clobbers */);
15722
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
15723
-vmaxv_u8 (uint8x8_t a)
15726
- __asm__ ("umaxv %b0,%1.8b"
15729
- : /* No clobbers */);
15733
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
15734
-vmaxv_u16 (uint16x4_t a)
15737
- __asm__ ("umaxv %h0,%1.4h"
15740
- : /* No clobbers */);
15744
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15745
-vmaxvq_f32 (float32x4_t a)
15747
- float32_t result;
15748
- __asm__ ("fmaxv %s0,%1.4s"
15751
- : /* No clobbers */);
15755
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
15756
-vmaxvq_s8 (int8x16_t a)
15759
- __asm__ ("smaxv %b0,%1.16b"
15762
- : /* No clobbers */);
15766
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
15767
-vmaxvq_s16 (int16x8_t a)
15770
- __asm__ ("smaxv %h0,%1.8h"
15773
- : /* No clobbers */);
15777
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
15778
-vmaxvq_s32 (int32x4_t a)
15781
- __asm__ ("smaxv %s0,%1.4s"
15784
- : /* No clobbers */);
15788
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
15789
-vmaxvq_u8 (uint8x16_t a)
15792
- __asm__ ("umaxv %b0,%1.16b"
15795
- : /* No clobbers */);
15799
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
15800
-vmaxvq_u16 (uint16x8_t a)
15803
- __asm__ ("umaxv %h0,%1.8h"
15806
- : /* No clobbers */);
15810
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
15811
-vmaxvq_u32 (uint32x4_t a)
15814
- __asm__ ("umaxv %s0,%1.4s"
15817
- : /* No clobbers */);
15821
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15822
-vminnmvq_f32 (float32x4_t a)
15824
- float32_t result;
15825
- __asm__ ("fminnmv %s0,%1.4s"
15828
- : /* No clobbers */);
15832
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
15833
-vminv_s8 (int8x8_t a)
15836
- __asm__ ("sminv %b0,%1.8b"
15839
- : /* No clobbers */);
15843
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
15844
-vminv_s16 (int16x4_t a)
15847
- __asm__ ("sminv %h0,%1.4h"
15850
- : /* No clobbers */);
15854
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
15855
-vminv_u8 (uint8x8_t a)
15858
- __asm__ ("uminv %b0,%1.8b"
15861
- : /* No clobbers */);
15865
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
15866
-vminv_u16 (uint16x4_t a)
15869
- __asm__ ("uminv %h0,%1.4h"
15872
- : /* No clobbers */);
15876
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
15877
-vminvq_f32 (float32x4_t a)
15879
- float32_t result;
15880
- __asm__ ("fminv %s0,%1.4s"
15883
- : /* No clobbers */);
15887
-__extension__ static __inline int8_t __attribute__ ((__always_inline__))
15888
-vminvq_s8 (int8x16_t a)
15891
- __asm__ ("sminv %b0,%1.16b"
15894
- : /* No clobbers */);
15898
-__extension__ static __inline int16_t __attribute__ ((__always_inline__))
15899
-vminvq_s16 (int16x8_t a)
15902
- __asm__ ("sminv %h0,%1.8h"
15905
- : /* No clobbers */);
15909
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
15910
-vminvq_s32 (int32x4_t a)
15913
- __asm__ ("sminv %s0,%1.4s"
15916
- : /* No clobbers */);
15920
-__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
15921
-vminvq_u8 (uint8x16_t a)
15924
- __asm__ ("uminv %b0,%1.16b"
15927
- : /* No clobbers */);
15931
-__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
15932
-vminvq_u16 (uint16x8_t a)
15935
- __asm__ ("uminv %h0,%1.8h"
15938
- : /* No clobbers */);
15942
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
15943
-vminvq_u32 (uint32x4_t a)
15946
- __asm__ ("uminv %s0,%1.4s"
15949
- : /* No clobbers */);
15953
#define vmla_lane_f32(a, b, c, d) \
15956
@@ -11382,7 +9697,7 @@
15957
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
15958
vmovn_high_s16 (int8x8_t a, int16x8_t b)
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"
15965
@@ -11393,7 +9708,7 @@
15966
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
15967
vmovn_high_s32 (int16x4_t a, int32x4_t b)
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"
15974
@@ -11404,7 +9719,7 @@
15975
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
15976
vmovn_high_s64 (int32x2_t a, int64x2_t b)
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"
15983
@@ -11415,7 +9730,7 @@
15984
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
15985
vmovn_high_u16 (uint8x8_t a, uint16x8_t b)
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"
15992
@@ -11426,7 +9741,7 @@
15993
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
15994
vmovn_high_u32 (uint16x4_t a, uint32x4_t b)
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"
16001
@@ -11437,7 +9752,7 @@
16002
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
16003
vmovn_high_u64 (uint32x2_t a, uint64x2_t b)
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"
16010
@@ -13856,7 +12171,7 @@
16011
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
16012
vqmovn_high_s16 (int8x8_t a, int16x8_t b)
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"
16019
@@ -13867,7 +12182,7 @@
16020
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
16021
vqmovn_high_s32 (int16x4_t a, int32x4_t b)
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"
16028
@@ -13878,7 +12193,7 @@
16029
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
16030
vqmovn_high_s64 (int32x2_t a, int64x2_t b)
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"
16037
@@ -13889,7 +12204,7 @@
16038
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
16039
vqmovn_high_u16 (uint8x8_t a, uint16x8_t b)
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"
16046
@@ -13900,7 +12215,7 @@
16047
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
16048
vqmovn_high_u32 (uint16x4_t a, uint32x4_t b)
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"
16055
@@ -13911,7 +12226,7 @@
16056
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
16057
vqmovn_high_u64 (uint32x2_t a, uint64x2_t b)
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"
16064
@@ -13922,7 +12237,7 @@
16065
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
16066
vqmovun_high_s16 (uint8x8_t a, int16x8_t b)
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"
16073
@@ -13933,7 +12248,7 @@
16074
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
16075
vqmovun_high_s32 (uint16x4_t a, int32x4_t b)
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"
16082
@@ -13944,7 +12259,7 @@
16083
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
16084
vqmovun_high_s64 (uint32x2_t a, int64x2_t b)
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"
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
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" \
16270
: "w"(b_), "i"(c) \
16271
@@ -14292,17 +12625,6 @@
16275
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16276
-vrecpe_f32 (float32x2_t a)
16278
- float32x2_t result;
16279
- __asm__ ("frecpe %0.2s,%1.2s"
16282
- : /* No clobbers */);
16286
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
16287
vrecpe_u32 (uint32x2_t a)
16289
@@ -14314,39 +12636,6 @@
16293
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
16294
-vrecped_f64 (float64_t a)
16296
- float64_t result;
16297
- __asm__ ("frecpe %d0,%d1"
16300
- : /* No clobbers */);
16304
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16305
-vrecpeq_f32 (float32x4_t a)
16307
- float32x4_t result;
16308
- __asm__ ("frecpe %0.4s,%1.4s"
16311
- : /* No clobbers */);
16315
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16316
-vrecpeq_f64 (float64x2_t a)
16318
- float64x2_t result;
16319
- __asm__ ("frecpe %0.2d,%1.2d"
16322
- : /* No clobbers */);
16326
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
16327
vrecpeq_u32 (uint32x4_t a)
16329
@@ -14358,94 +12647,6 @@
16333
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
16334
-vrecpes_f32 (float32_t a)
16336
- float32_t result;
16337
- __asm__ ("frecpe %s0,%s1"
16340
- : /* No clobbers */);
16344
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16345
-vrecps_f32 (float32x2_t a, float32x2_t b)
16347
- float32x2_t result;
16348
- __asm__ ("frecps %0.2s,%1.2s,%2.2s"
16351
- : /* No clobbers */);
16355
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
16356
-vrecpsd_f64 (float64_t a, float64_t b)
16358
- float64_t result;
16359
- __asm__ ("frecps %d0,%d1,%d2"
16362
- : /* No clobbers */);
16366
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16367
-vrecpsq_f32 (float32x4_t a, float32x4_t b)
16369
- float32x4_t result;
16370
- __asm__ ("frecps %0.4s,%1.4s,%2.4s"
16373
- : /* No clobbers */);
16377
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16378
-vrecpsq_f64 (float64x2_t a, float64x2_t b)
16380
- float64x2_t result;
16381
- __asm__ ("frecps %0.2d,%1.2d,%2.2d"
16384
- : /* No clobbers */);
16388
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
16389
-vrecpss_f32 (float32_t a, float32_t b)
16391
- float32_t result;
16392
- __asm__ ("frecps %s0,%s1,%s2"
16395
- : /* No clobbers */);
16399
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
16400
-vrecpxd_f64 (float64_t a)
16402
- float64_t result;
16403
- __asm__ ("frecpe %d0,%d1"
16406
- : /* No clobbers */);
16410
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
16411
-vrecpxs_f32 (float32_t a)
16413
- float32_t result;
16414
- __asm__ ("frecpe %s0,%s1"
16417
- : /* No clobbers */);
16421
__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
16422
vrev16_p8 (poly8x8_t a)
16424
@@ -14842,178 +13043,14 @@
16428
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16429
-vrnd_f32 (float32x2_t a)
16431
- float32x2_t result;
16432
- __asm__ ("frintz %0.2s,%1.2s"
16435
- : /* No clobbers */);
16439
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16440
-vrnda_f32 (float32x2_t a)
16442
- float32x2_t result;
16443
- __asm__ ("frinta %0.2s,%1.2s"
16446
- : /* No clobbers */);
16450
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16451
-vrndm_f32 (float32x2_t a)
16453
- float32x2_t result;
16454
- __asm__ ("frintm %0.2s,%1.2s"
16457
- : /* No clobbers */);
16461
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16462
-vrndn_f32 (float32x2_t a)
16464
- float32x2_t result;
16465
- __asm__ ("frintn %0.2s,%1.2s"
16468
- : /* No clobbers */);
16472
-__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
16473
-vrndp_f32 (float32x2_t a)
16475
- float32x2_t result;
16476
- __asm__ ("frintp %0.2s,%1.2s"
16479
- : /* No clobbers */);
16483
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16484
-vrndq_f32 (float32x4_t a)
16486
- float32x4_t result;
16487
- __asm__ ("frintz %0.4s,%1.4s"
16490
- : /* No clobbers */);
16494
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16495
-vrndq_f64 (float64x2_t a)
16497
- float64x2_t result;
16498
- __asm__ ("frintz %0.2d,%1.2d"
16501
- : /* No clobbers */);
16505
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16506
-vrndqa_f32 (float32x4_t a)
16508
- float32x4_t result;
16509
- __asm__ ("frinta %0.4s,%1.4s"
16512
- : /* No clobbers */);
16516
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16517
-vrndqa_f64 (float64x2_t a)
16519
- float64x2_t result;
16520
- __asm__ ("frinta %0.2d,%1.2d"
16523
- : /* No clobbers */);
16527
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16528
-vrndqm_f32 (float32x4_t a)
16530
- float32x4_t result;
16531
- __asm__ ("frintm %0.4s,%1.4s"
16534
- : /* No clobbers */);
16538
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16539
-vrndqm_f64 (float64x2_t a)
16541
- float64x2_t result;
16542
- __asm__ ("frintm %0.2d,%1.2d"
16545
- : /* No clobbers */);
16549
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16550
-vrndqn_f32 (float32x4_t a)
16552
- float32x4_t result;
16553
- __asm__ ("frintn %0.4s,%1.4s"
16556
- : /* No clobbers */);
16560
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16561
-vrndqn_f64 (float64x2_t a)
16563
- float64x2_t result;
16564
- __asm__ ("frintn %0.2d,%1.2d"
16567
- : /* No clobbers */);
16571
-__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
16572
-vrndqp_f32 (float32x4_t a)
16574
- float32x4_t result;
16575
- __asm__ ("frintp %0.4s,%1.4s"
16578
- : /* No clobbers */);
16582
-__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
16583
-vrndqp_f64 (float64x2_t a)
16585
- float64x2_t result;
16586
- __asm__ ("frintp %0.2d,%1.2d"
16589
- : /* No clobbers */);
16593
#define vrshrn_high_n_s16(a, b, c) \
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" \
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" \
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" \
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" \
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" \
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" \
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)
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"
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)
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"
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)
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"
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)
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"
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)
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"
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)
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"
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" \
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" \
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" \
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" \
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" \
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" \
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)
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"
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)
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"
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)
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"
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)
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"
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)
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"
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)
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"
16823
@@ -18309,86 +16357,6 @@
16827
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
16828
-vaddv_s32 (int32x2_t a)
16831
- __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16835
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
16836
-vaddv_u32 (uint32x2_t a)
16839
- __asm__ ("addp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16843
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
16844
-vmaxnmv_f32 (float32x2_t a)
16846
- float32_t result;
16847
- __asm__ ("fmaxnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16851
-__extension__ static __inline float32_t __attribute__ ((__always_inline__))
16852
-vminnmv_f32 (float32x2_t a)
16854
- float32_t result;
16855
- __asm__ ("fminnmp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16859
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
16860
-vmaxnmvq_f64 (float64x2_t a)
16862
- float64_t result;
16863
- __asm__ ("fmaxnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : );
16867
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
16868
-vmaxv_s32 (int32x2_t a)
16871
- __asm__ ("smaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16875
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
16876
-vmaxv_u32 (uint32x2_t a)
16879
- __asm__ ("umaxp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16883
-__extension__ static __inline float64_t __attribute__ ((__always_inline__))
16884
-vminnmvq_f64 (float64x2_t a)
16886
- float64_t result;
16887
- __asm__ ("fminnmp %0.2d, %1.2d, %1.2d" : "=w"(result) : "w"(a) : );
16891
-__extension__ static __inline int32_t __attribute__ ((__always_inline__))
16892
-vminv_s32 (int32x2_t a)
16895
- __asm__ ("sminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16899
-__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
16900
-vminv_u32 (uint32x2_t a)
16903
- __asm__ ("uminp %0.2s, %1.2s, %1.2s" : "=w"(result) : "w"(a) : );
16907
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
16908
vpaddd_s64 (int64x2_t __a)
16910
@@ -19022,7 +16990,7 @@
16911
vtbl1_s8 (int8x8_t tab, int8x8_t idx)
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"
16918
: "w"(temp), "w"(idx)
16919
@@ -19034,7 +17002,7 @@
16920
vtbl1_u8 (uint8x8_t tab, uint8x8_t idx)
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"
16927
: "w"(temp), "w"(idx)
16928
@@ -19046,7 +17014,7 @@
16929
vtbl1_p8 (poly8x8_t tab, uint8x8_t idx)
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"
16936
: "w"(temp), "w"(idx)
16937
@@ -19096,7 +17064,7 @@
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"
16946
@@ -19111,7 +17079,7 @@
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"
16955
@@ -19126,7 +17094,7 @@
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"
16964
@@ -19185,7 +17153,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
17020
/* Start of optimal implementations in approved order. */
17024
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
17025
+vabs_f32 (float32x2_t __a)
17027
+ return __builtin_aarch64_absv2sf (__a);
17030
+__extension__ static __inline float64x1_t __attribute__ ((__always_inline__))
17031
+vabs_f64 (float64x1_t __a)
17033
+ return __builtin_fabs (__a);
17036
+__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
17037
+vabs_s8 (int8x8_t __a)
17039
+ return __builtin_aarch64_absv8qi (__a);
17042
+__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
17043
+vabs_s16 (int16x4_t __a)
17045
+ return __builtin_aarch64_absv4hi (__a);
17048
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
17049
+vabs_s32 (int32x2_t __a)
17051
+ return __builtin_aarch64_absv2si (__a);
17054
+__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
17055
+vabs_s64 (int64x1_t __a)
17057
+ return __builtin_llabs (__a);
17060
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
17061
+vabsq_f32 (float32x4_t __a)
17063
+ return __builtin_aarch64_absv4sf (__a);
17066
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
17067
+vabsq_f64 (float64x2_t __a)
17069
+ return __builtin_aarch64_absv2df (__a);
17072
+__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
17073
+vabsq_s8 (int8x16_t __a)
17075
+ return __builtin_aarch64_absv16qi (__a);
17078
+__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
17079
+vabsq_s16 (int16x8_t __a)
17081
+ return __builtin_aarch64_absv8hi (__a);
17084
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
17085
+vabsq_s32 (int32x4_t __a)
17087
+ return __builtin_aarch64_absv4si (__a);
17090
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
17091
+vabsq_s64 (int64x2_t __a)
17093
+ return __builtin_aarch64_absv2di (__a);
17098
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
17099
@@ -19384,8 +17426,238 @@
17106
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
17107
+vaddv_s8 (int8x8_t __a)
17109
+ return vget_lane_s8 (__builtin_aarch64_reduc_splus_v8qi (__a), 0);
17112
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
17113
+vaddv_s16 (int16x4_t __a)
17115
+ return vget_lane_s16 (__builtin_aarch64_reduc_splus_v4hi (__a), 0);
17118
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
17119
+vaddv_s32 (int32x2_t __a)
17121
+ return vget_lane_s32 (__builtin_aarch64_reduc_splus_v2si (__a), 0);
17124
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
17125
+vaddv_u8 (uint8x8_t __a)
17127
+ return vget_lane_u8 ((uint8x8_t)
17128
+ __builtin_aarch64_reduc_uplus_v8qi ((int8x8_t) __a), 0);
17131
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
17132
+vaddv_u16 (uint16x4_t __a)
17134
+ return vget_lane_u16 ((uint16x4_t)
17135
+ __builtin_aarch64_reduc_uplus_v4hi ((int16x4_t) __a), 0);
17138
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17139
+vaddv_u32 (uint32x2_t __a)
17141
+ return vget_lane_u32 ((uint32x2_t)
17142
+ __builtin_aarch64_reduc_uplus_v2si ((int32x2_t) __a), 0);
17145
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
17146
+vaddvq_s8 (int8x16_t __a)
17148
+ return vgetq_lane_s8 (__builtin_aarch64_reduc_splus_v16qi (__a), 0);
17151
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
17152
+vaddvq_s16 (int16x8_t __a)
17154
+ return vgetq_lane_s16 (__builtin_aarch64_reduc_splus_v8hi (__a), 0);
17157
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
17158
+vaddvq_s32 (int32x4_t __a)
17160
+ return vgetq_lane_s32 (__builtin_aarch64_reduc_splus_v4si (__a), 0);
17163
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
17164
+vaddvq_s64 (int64x2_t __a)
17166
+ return vgetq_lane_s64 (__builtin_aarch64_reduc_splus_v2di (__a), 0);
17169
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
17170
+vaddvq_u8 (uint8x16_t __a)
17172
+ return vgetq_lane_u8 ((uint8x16_t)
17173
+ __builtin_aarch64_reduc_uplus_v16qi ((int8x16_t) __a), 0);
17176
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
17177
+vaddvq_u16 (uint16x8_t __a)
17179
+ return vgetq_lane_u16 ((uint16x8_t)
17180
+ __builtin_aarch64_reduc_uplus_v8hi ((int16x8_t) __a), 0);
17183
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17184
+vaddvq_u32 (uint32x4_t __a)
17186
+ return vgetq_lane_u32 ((uint32x4_t)
17187
+ __builtin_aarch64_reduc_uplus_v4si ((int32x4_t) __a), 0);
17190
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17191
+vaddvq_u64 (uint64x2_t __a)
17193
+ return vgetq_lane_u64 ((uint64x2_t)
17194
+ __builtin_aarch64_reduc_uplus_v2di ((int64x2_t) __a), 0);
17197
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
17198
+vaddv_f32 (float32x2_t __a)
17200
+ float32x2_t t = __builtin_aarch64_reduc_splus_v2sf (__a);
17201
+ return vget_lane_f32 (t, 0);
17204
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
17205
+vaddvq_f32 (float32x4_t __a)
17207
+ float32x4_t t = __builtin_aarch64_reduc_splus_v4sf (__a);
17208
+ return vgetq_lane_f32 (t, 0);
17211
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
17212
+vaddvq_f64 (float64x2_t __a)
17214
+ float64x2_t t = __builtin_aarch64_reduc_splus_v2df (__a);
17215
+ return vgetq_lane_f64 (t, 0);
17220
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17221
+vcages_f32 (float32_t __a, float32_t __b)
17223
+ return __builtin_fabsf (__a) >= __builtin_fabsf (__b) ? -1 : 0;
17226
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17227
+vcage_f32 (float32x2_t __a, float32x2_t __b)
17229
+ return vabs_f32 (__a) >= vabs_f32 (__b);
17232
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17233
+vcageq_f32 (float32x4_t __a, float32x4_t __b)
17235
+ return vabsq_f32 (__a) >= vabsq_f32 (__b);
17238
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17239
+vcaged_f64 (float64_t __a, float64_t __b)
17241
+ return __builtin_fabs (__a) >= __builtin_fabs (__b) ? -1 : 0;
17244
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17245
+vcageq_f64 (float64x2_t __a, float64x2_t __b)
17247
+ return vabsq_f64 (__a) >= vabsq_f64 (__b);
17252
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17253
+vcagts_f32 (float32_t __a, float32_t __b)
17255
+ return __builtin_fabsf (__a) > __builtin_fabsf (__b) ? -1 : 0;
17258
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17259
+vcagt_f32 (float32x2_t __a, float32x2_t __b)
17261
+ return vabs_f32 (__a) > vabs_f32 (__b);
17264
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17265
+vcagtq_f32 (float32x4_t __a, float32x4_t __b)
17267
+ return vabsq_f32 (__a) > vabsq_f32 (__b);
17270
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17271
+vcagtd_f64 (float64_t __a, float64_t __b)
17273
+ return __builtin_fabs (__a) > __builtin_fabs (__b) ? -1 : 0;
17276
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17277
+vcagtq_f64 (float64x2_t __a, float64x2_t __b)
17279
+ return vabsq_f64 (__a) > vabsq_f64 (__b);
17284
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17285
+vcale_f32 (float32x2_t __a, float32x2_t __b)
17287
+ return vabs_f32 (__a) <= vabs_f32 (__b);
17290
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17291
+vcaleq_f32 (float32x4_t __a, float32x4_t __b)
17293
+ return vabsq_f32 (__a) <= vabsq_f32 (__b);
17296
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17297
+vcaleq_f64 (float64x2_t __a, float64x2_t __b)
17299
+ return vabsq_f64 (__a) <= vabsq_f64 (__b);
17304
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17305
+vcalt_f32 (float32x2_t __a, float32x2_t __b)
17307
+ return vabs_f32 (__a) < vabs_f32 (__b);
17310
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17311
+vcaltq_f32 (float32x4_t __a, float32x4_t __b)
17313
+ return vabsq_f32 (__a) < vabsq_f32 (__b);
17316
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17317
+vcaltq_f64 (float64x2_t __a, float64x2_t __b)
17319
+ return vabsq_f64 (__a) < vabsq_f64 (__b);
17322
+/* vceq - vector. */
17324
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17325
+vceq_f32 (float32x2_t __a, float32x2_t __b)
17327
+ return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b);
17330
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17331
+vceq_f64 (float64x1_t __a, float64x1_t __b)
17333
+ return __a == __b ? -1ll : 0ll;
17336
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17337
vceq_p8 (poly8x8_t __a, poly8x8_t __b)
17339
@@ -19414,7 +17686,7 @@
17340
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17341
vceq_s64 (int64x1_t __a, int64x1_t __b)
17343
- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
17344
+ return __a == __b ? -1ll : 0ll;
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)
17352
- return (uint64x1_t) __builtin_aarch64_cmeqdi ((int64x1_t) __a,
17353
- (int64x1_t) __b);
17354
+ return __a == __b ? -1ll : 0ll;
17357
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17358
+vceqq_f32 (float32x4_t __a, float32x4_t __b)
17360
+ return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b);
17363
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17364
+vceqq_f64 (float64x2_t __a, float64x2_t __b)
17366
+ return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b);
17369
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17370
vceqq_p8 (poly8x16_t __a, poly8x16_t __b)
17372
@@ -19504,27 +17787,245 @@
17376
+/* vceq - scalar. */
17378
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17379
+vceqs_f32 (float32_t __a, float32_t __b)
17381
+ return __a == __b ? -1 : 0;
17384
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17385
vceqd_s64 (int64x1_t __a, int64x1_t __b)
17387
- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
17388
+ return __a == __b ? -1ll : 0ll;
17391
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17392
vceqd_u64 (uint64x1_t __a, uint64x1_t __b)
17394
- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, __b);
17395
+ return __a == __b ? -1ll : 0ll;
17398
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17399
+vceqd_f64 (float64_t __a, float64_t __b)
17401
+ return __a == __b ? -1ll : 0ll;
17404
+/* vceqz - vector. */
17406
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17407
+vceqz_f32 (float32x2_t __a)
17409
+ float32x2_t __b = {0.0f, 0.0f};
17410
+ return (uint32x2_t) __builtin_aarch64_cmeqv2sf (__a, __b);
17413
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17414
+vceqz_f64 (float64x1_t __a)
17416
+ return __a == 0.0 ? -1ll : 0ll;
17419
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17420
+vceqz_p8 (poly8x8_t __a)
17422
+ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17423
+ return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a,
17427
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17428
+vceqz_s8 (int8x8_t __a)
17430
+ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17431
+ return (uint8x8_t) __builtin_aarch64_cmeqv8qi (__a, __b);
17434
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17435
+vceqz_s16 (int16x4_t __a)
17437
+ int16x4_t __b = {0, 0, 0, 0};
17438
+ return (uint16x4_t) __builtin_aarch64_cmeqv4hi (__a, __b);
17441
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17442
+vceqz_s32 (int32x2_t __a)
17444
+ int32x2_t __b = {0, 0};
17445
+ return (uint32x2_t) __builtin_aarch64_cmeqv2si (__a, __b);
17448
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17449
+vceqz_s64 (int64x1_t __a)
17451
+ return __a == 0ll ? -1ll : 0ll;
17454
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17455
+vceqz_u8 (uint8x8_t __a)
17457
+ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17458
+ return (uint8x8_t) __builtin_aarch64_cmeqv8qi ((int8x8_t) __a,
17462
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17463
+vceqz_u16 (uint16x4_t __a)
17465
+ uint16x4_t __b = {0, 0, 0, 0};
17466
+ return (uint16x4_t) __builtin_aarch64_cmeqv4hi ((int16x4_t) __a,
17467
+ (int16x4_t) __b);
17470
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17471
+vceqz_u32 (uint32x2_t __a)
17473
+ uint32x2_t __b = {0, 0};
17474
+ return (uint32x2_t) __builtin_aarch64_cmeqv2si ((int32x2_t) __a,
17475
+ (int32x2_t) __b);
17478
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17479
+vceqz_u64 (uint64x1_t __a)
17481
+ return __a == 0ll ? -1ll : 0ll;
17484
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17485
+vceqzq_f32 (float32x4_t __a)
17487
+ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
17488
+ return (uint32x4_t) __builtin_aarch64_cmeqv4sf (__a, __b);
17491
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17492
+vceqzq_f64 (float64x2_t __a)
17494
+ float64x2_t __b = {0.0, 0.0};
17495
+ return (uint64x2_t) __builtin_aarch64_cmeqv2df (__a, __b);
17498
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17499
+vceqzq_p8 (poly8x16_t __a)
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);
17507
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17508
+vceqzq_s8 (int8x16_t __a)
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);
17515
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
17516
+vceqzq_s16 (int16x8_t __a)
17518
+ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17519
+ return (uint16x8_t) __builtin_aarch64_cmeqv8hi (__a, __b);
17522
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17523
+vceqzq_s32 (int32x4_t __a)
17525
+ int32x4_t __b = {0, 0, 0, 0};
17526
+ return (uint32x4_t) __builtin_aarch64_cmeqv4si (__a, __b);
17529
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17530
+vceqzq_s64 (int64x2_t __a)
17532
+ int64x2_t __b = {0, 0};
17533
+ return (uint64x2_t) __builtin_aarch64_cmeqv2di (__a, __b);
17536
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17537
+vceqzq_u8 (uint8x16_t __a)
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);
17545
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
17546
+vceqzq_u16 (uint16x8_t __a)
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);
17553
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17554
+vceqzq_u32 (uint32x4_t __a)
17556
+ uint32x4_t __b = {0, 0, 0, 0};
17557
+ return (uint32x4_t) __builtin_aarch64_cmeqv4si ((int32x4_t) __a,
17558
+ (int32x4_t) __b);
17561
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17562
+vceqzq_u64 (uint64x2_t __a)
17564
+ uint64x2_t __b = {0, 0};
17565
+ return (uint64x2_t) __builtin_aarch64_cmeqv2di ((int64x2_t) __a,
17566
+ (int64x2_t) __b);
17569
+/* vceqz - scalar. */
17571
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17572
+vceqzs_f32 (float32_t __a)
17574
+ return __a == 0.0f ? -1 : 0;
17577
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17578
vceqzd_s64 (int64x1_t __a)
17580
- return (uint64x1_t) __builtin_aarch64_cmeqdi (__a, 0);
17581
+ return __a == 0 ? -1ll : 0ll;
17585
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17586
+vceqzd_u64 (int64x1_t __a)
17588
+ return __a == 0 ? -1ll : 0ll;
17591
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17592
+vceqzd_f64 (float64_t __a)
17594
+ return __a == 0.0 ? -1ll : 0ll;
17597
+/* vcge - vector. */
17599
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17600
+vcge_f32 (float32x2_t __a, float32x2_t __b)
17602
+ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b);
17605
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17606
+vcge_f64 (float64x1_t __a, float64x1_t __b)
17608
+ return __a >= __b ? -1ll : 0ll;
17611
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17612
+vcge_p8 (poly8x8_t __a, poly8x8_t __b)
17614
+ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a,
17618
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17619
vcge_s8 (int8x8_t __a, int8x8_t __b)
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)
17626
- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b);
17627
+ return __a >= __b ? -1ll : 0ll;
17630
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17631
vcge_u8 (uint8x8_t __a, uint8x8_t __b)
17633
- return (uint8x8_t) __builtin_aarch64_cmhsv8qi ((int8x8_t) __a,
17634
+ return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __a,
17638
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17639
vcge_u16 (uint16x4_t __a, uint16x4_t __b)
17641
- return (uint16x4_t) __builtin_aarch64_cmhsv4hi ((int16x4_t) __a,
17642
+ return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __a,
17646
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17647
vcge_u32 (uint32x2_t __a, uint32x2_t __b)
17649
- return (uint32x2_t) __builtin_aarch64_cmhsv2si ((int32x2_t) __a,
17650
+ return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __a,
17654
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17655
vcge_u64 (uint64x1_t __a, uint64x1_t __b)
17657
- return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __a,
17658
- (int64x1_t) __b);
17659
+ return __a >= __b ? -1ll : 0ll;
17662
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17663
+vcgeq_f32 (float32x4_t __a, float32x4_t __b)
17665
+ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b);
17668
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17669
+vcgeq_f64 (float64x2_t __a, float64x2_t __b)
17671
+ return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b);
17674
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17675
+vcgeq_p8 (poly8x16_t __a, poly8x16_t __b)
17677
+ return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __a,
17678
+ (int8x16_t) __b);
17681
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17682
vcgeq_s8 (int8x16_t __a, int8x16_t __b)
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)
17689
- return (uint8x16_t) __builtin_aarch64_cmhsv16qi ((int8x16_t) __a,
17690
+ return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __a,
17694
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
17695
vcgeq_u16 (uint16x8_t __a, uint16x8_t __b)
17697
- return (uint16x8_t) __builtin_aarch64_cmhsv8hi ((int16x8_t) __a,
17698
+ return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __a,
17702
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17703
vcgeq_u32 (uint32x4_t __a, uint32x4_t __b)
17705
- return (uint32x4_t) __builtin_aarch64_cmhsv4si ((int32x4_t) __a,
17706
+ return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __a,
17710
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17711
vcgeq_u64 (uint64x2_t __a, uint64x2_t __b)
17713
- return (uint64x2_t) __builtin_aarch64_cmhsv2di ((int64x2_t) __a,
17714
+ return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __a,
17718
+/* vcge - scalar. */
17720
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17721
+vcges_f32 (float32_t __a, float32_t __b)
17723
+ return __a >= __b ? -1 : 0;
17726
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17727
vcged_s64 (int64x1_t __a, int64x1_t __b)
17729
- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, __b);
17730
+ return __a >= __b ? -1ll : 0ll;
17733
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17734
vcged_u64 (uint64x1_t __a, uint64x1_t __b)
17736
- return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __a,
17737
- (int64x1_t) __b);
17738
+ return __a >= __b ? -1ll : 0ll;
17741
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17742
+vcged_f64 (float64_t __a, float64_t __b)
17744
+ return __a >= __b ? -1ll : 0ll;
17747
+/* vcgez - vector. */
17749
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17750
+vcgez_f32 (float32x2_t __a)
17752
+ float32x2_t __b = {0.0f, 0.0f};
17753
+ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__a, __b);
17756
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17757
+vcgez_f64 (float64x1_t __a)
17759
+ return __a >= 0.0 ? -1ll : 0ll;
17762
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17763
+vcgez_p8 (poly8x8_t __a)
17765
+ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17766
+ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __a,
17770
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17771
+vcgez_s8 (int8x8_t __a)
17773
+ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17774
+ return (uint8x8_t) __builtin_aarch64_cmgev8qi (__a, __b);
17777
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17778
+vcgez_s16 (int16x4_t __a)
17780
+ int16x4_t __b = {0, 0, 0, 0};
17781
+ return (uint16x4_t) __builtin_aarch64_cmgev4hi (__a, __b);
17784
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17785
+vcgez_s32 (int32x2_t __a)
17787
+ int32x2_t __b = {0, 0};
17788
+ return (uint32x2_t) __builtin_aarch64_cmgev2si (__a, __b);
17791
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17792
+vcgez_s64 (int64x1_t __a)
17794
+ return __a >= 0ll ? -1ll : 0ll;
17797
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17798
+vcgez_u8 (uint8x8_t __a)
17800
+ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17801
+ return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __a,
17805
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17806
+vcgez_u16 (uint16x4_t __a)
17808
+ uint16x4_t __b = {0, 0, 0, 0};
17809
+ return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __a,
17810
+ (int16x4_t) __b);
17813
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17814
+vcgez_u32 (uint32x2_t __a)
17816
+ uint32x2_t __b = {0, 0};
17817
+ return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __a,
17818
+ (int32x2_t) __b);
17821
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17822
+vcgez_u64 (uint64x1_t __a)
17824
+ return __a >= 0ll ? -1ll : 0ll;
17827
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17828
+vcgezq_f32 (float32x4_t __a)
17830
+ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
17831
+ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__a, __b);
17834
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17835
+vcgezq_f64 (float64x2_t __a)
17837
+ float64x2_t __b = {0.0, 0.0};
17838
+ return (uint64x2_t) __builtin_aarch64_cmgev2df (__a, __b);
17841
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17842
+vcgezq_p8 (poly8x16_t __a)
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);
17850
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17851
+vcgezq_s8 (int8x16_t __a)
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);
17858
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
17859
+vcgezq_s16 (int16x8_t __a)
17861
+ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
17862
+ return (uint16x8_t) __builtin_aarch64_cmgev8hi (__a, __b);
17865
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17866
+vcgezq_s32 (int32x4_t __a)
17868
+ int32x4_t __b = {0, 0, 0, 0};
17869
+ return (uint32x4_t) __builtin_aarch64_cmgev4si (__a, __b);
17872
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17873
+vcgezq_s64 (int64x2_t __a)
17875
+ int64x2_t __b = {0, 0};
17876
+ return (uint64x2_t) __builtin_aarch64_cmgev2di (__a, __b);
17879
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
17880
+vcgezq_u8 (uint8x16_t __a)
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);
17888
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
17889
+vcgezq_u16 (uint16x8_t __a)
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);
17896
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
17897
+vcgezq_u32 (uint32x4_t __a)
17899
+ uint32x4_t __b = {0, 0, 0, 0};
17900
+ return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __a,
17901
+ (int32x4_t) __b);
17904
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
17905
+vcgezq_u64 (uint64x2_t __a)
17907
+ uint64x2_t __b = {0, 0};
17908
+ return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __a,
17909
+ (int64x2_t) __b);
17912
+/* vcgez - scalar. */
17914
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
17915
+vcgezs_f32 (float32_t __a)
17917
+ return __a >= 0.0f ? -1 : 0;
17920
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17921
vcgezd_s64 (int64x1_t __a)
17923
- return (uint64x1_t) __builtin_aarch64_cmgedi (__a, 0);
17924
+ return __a >= 0 ? -1ll : 0ll;
17928
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17929
+vcgezd_u64 (int64x1_t __a)
17931
+ return __a >= 0 ? -1ll : 0ll;
17934
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
17935
+vcgezd_f64 (float64_t __a)
17937
+ return __a >= 0.0 ? -1ll : 0ll;
17940
+/* vcgt - vector. */
17942
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17943
+vcgt_f32 (float32x2_t __a, float32x2_t __b)
17945
+ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b);
17948
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17949
+vcgt_f64 (float64x1_t __a, float64x1_t __b)
17951
+ return __a > __b ? -1ll : 0ll;
17954
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17955
+vcgt_p8 (poly8x8_t __a, poly8x8_t __b)
17957
+ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a,
17961
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17962
vcgt_s8 (int8x8_t __a, int8x8_t __b)
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)
17969
- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b);
17970
+ return __a > __b ? -1ll : 0ll;
17973
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
17974
vcgt_u8 (uint8x8_t __a, uint8x8_t __b)
17976
- return (uint8x8_t) __builtin_aarch64_cmhiv8qi ((int8x8_t) __a,
17977
+ return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __a,
17981
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
17982
vcgt_u16 (uint16x4_t __a, uint16x4_t __b)
17984
- return (uint16x4_t) __builtin_aarch64_cmhiv4hi ((int16x4_t) __a,
17985
+ return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __a,
17989
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
17990
vcgt_u32 (uint32x2_t __a, uint32x2_t __b)
17992
- return (uint32x2_t) __builtin_aarch64_cmhiv2si ((int32x2_t) __a,
17993
+ return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __a,
17997
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
17998
vcgt_u64 (uint64x1_t __a, uint64x1_t __b)
18000
- return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __a,
18001
- (int64x1_t) __b);
18002
+ return __a > __b ? -1ll : 0ll;
18005
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18006
+vcgtq_f32 (float32x4_t __a, float32x4_t __b)
18008
+ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b);
18011
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18012
+vcgtq_f64 (float64x2_t __a, float64x2_t __b)
18014
+ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b);
18017
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18018
+vcgtq_p8 (poly8x16_t __a, poly8x16_t __b)
18020
+ return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __a,
18021
+ (int8x16_t) __b);
18024
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18025
vcgtq_s8 (int8x16_t __a, int8x16_t __b)
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)
18032
- return (uint8x16_t) __builtin_aarch64_cmhiv16qi ((int8x16_t) __a,
18033
+ return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __a,
18037
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18038
vcgtq_u16 (uint16x8_t __a, uint16x8_t __b)
18040
- return (uint16x8_t) __builtin_aarch64_cmhiv8hi ((int16x8_t) __a,
18041
+ return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __a,
18045
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18046
vcgtq_u32 (uint32x4_t __a, uint32x4_t __b)
18048
- return (uint32x4_t) __builtin_aarch64_cmhiv4si ((int32x4_t) __a,
18049
+ return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __a,
18053
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18054
vcgtq_u64 (uint64x2_t __a, uint64x2_t __b)
18056
- return (uint64x2_t) __builtin_aarch64_cmhiv2di ((int64x2_t) __a,
18057
+ return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __a,
18061
+/* vcgt - scalar. */
18063
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18064
+vcgts_f32 (float32_t __a, float32_t __b)
18066
+ return __a > __b ? -1 : 0;
18069
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18070
vcgtd_s64 (int64x1_t __a, int64x1_t __b)
18072
- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, __b);
18073
+ return __a > __b ? -1ll : 0ll;
18076
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18077
vcgtd_u64 (uint64x1_t __a, uint64x1_t __b)
18079
- return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __a,
18080
- (int64x1_t) __b);
18081
+ return __a > __b ? -1ll : 0ll;
18084
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18085
+vcgtd_f64 (float64_t __a, float64_t __b)
18087
+ return __a > __b ? -1ll : 0ll;
18090
+/* vcgtz - vector. */
18092
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18093
+vcgtz_f32 (float32x2_t __a)
18095
+ float32x2_t __b = {0.0f, 0.0f};
18096
+ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__a, __b);
18099
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18100
+vcgtz_f64 (float64x1_t __a)
18102
+ return __a > 0.0 ? -1ll : 0ll;
18105
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18106
+vcgtz_p8 (poly8x8_t __a)
18108
+ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18109
+ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __a,
18113
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18114
+vcgtz_s8 (int8x8_t __a)
18116
+ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18117
+ return (uint8x8_t) __builtin_aarch64_cmgtv8qi (__a, __b);
18120
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18121
+vcgtz_s16 (int16x4_t __a)
18123
+ int16x4_t __b = {0, 0, 0, 0};
18124
+ return (uint16x4_t) __builtin_aarch64_cmgtv4hi (__a, __b);
18127
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18128
+vcgtz_s32 (int32x2_t __a)
18130
+ int32x2_t __b = {0, 0};
18131
+ return (uint32x2_t) __builtin_aarch64_cmgtv2si (__a, __b);
18134
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18135
+vcgtz_s64 (int64x1_t __a)
18137
+ return __a > 0ll ? -1ll : 0ll;
18140
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18141
+vcgtz_u8 (uint8x8_t __a)
18143
+ uint8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18144
+ return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __a,
18148
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18149
+vcgtz_u16 (uint16x4_t __a)
18151
+ uint16x4_t __b = {0, 0, 0, 0};
18152
+ return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __a,
18153
+ (int16x4_t) __b);
18156
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18157
+vcgtz_u32 (uint32x2_t __a)
18159
+ uint32x2_t __b = {0, 0};
18160
+ return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __a,
18161
+ (int32x2_t) __b);
18164
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18165
+vcgtz_u64 (uint64x1_t __a)
18167
+ return __a > 0ll ? -1ll : 0ll;
18170
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18171
+vcgtzq_f32 (float32x4_t __a)
18173
+ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
18174
+ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__a, __b);
18177
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18178
+vcgtzq_f64 (float64x2_t __a)
18180
+ float64x2_t __b = {0.0, 0.0};
18181
+ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__a, __b);
18184
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18185
+vcgtzq_p8 (poly8x16_t __a)
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);
18193
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18194
+vcgtzq_s8 (int8x16_t __a)
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);
18201
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18202
+vcgtzq_s16 (int16x8_t __a)
18204
+ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18205
+ return (uint16x8_t) __builtin_aarch64_cmgtv8hi (__a, __b);
18208
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18209
+vcgtzq_s32 (int32x4_t __a)
18211
+ int32x4_t __b = {0, 0, 0, 0};
18212
+ return (uint32x4_t) __builtin_aarch64_cmgtv4si (__a, __b);
18215
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18216
+vcgtzq_s64 (int64x2_t __a)
18218
+ int64x2_t __b = {0, 0};
18219
+ return (uint64x2_t) __builtin_aarch64_cmgtv2di (__a, __b);
18222
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18223
+vcgtzq_u8 (uint8x16_t __a)
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);
18231
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18232
+vcgtzq_u16 (uint16x8_t __a)
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);
18239
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18240
+vcgtzq_u32 (uint32x4_t __a)
18242
+ uint32x4_t __b = {0, 0, 0, 0};
18243
+ return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __a,
18244
+ (int32x4_t) __b);
18247
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18248
+vcgtzq_u64 (uint64x2_t __a)
18250
+ uint64x2_t __b = {0, 0};
18251
+ return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __a,
18252
+ (int64x2_t) __b);
18255
+/* vcgtz - scalar. */
18257
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18258
+vcgtzs_f32 (float32_t __a)
18260
+ return __a > 0.0f ? -1 : 0;
18263
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18264
vcgtzd_s64 (int64x1_t __a)
18266
- return (uint64x1_t) __builtin_aarch64_cmgtdi (__a, 0);
18267
+ return __a > 0 ? -1ll : 0ll;
18271
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18272
+vcgtzd_u64 (int64x1_t __a)
18274
+ return __a > 0 ? -1ll : 0ll;
18277
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18278
+vcgtzd_f64 (float64_t __a)
18280
+ return __a > 0.0 ? -1ll : 0ll;
18283
+/* vcle - vector. */
18285
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18286
+vcle_f32 (float32x2_t __a, float32x2_t __b)
18288
+ return (uint32x2_t) __builtin_aarch64_cmgev2sf (__b, __a);
18291
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18292
+vcle_f64 (float64x1_t __a, float64x1_t __b)
18294
+ return __a <= __b ? -1ll : 0ll;
18297
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18298
+vcle_p8 (poly8x8_t __a, poly8x8_t __b)
18300
+ return (uint8x8_t) __builtin_aarch64_cmgev8qi ((int8x8_t) __b,
18304
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18305
vcle_s8 (int8x8_t __a, int8x8_t __b)
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)
18312
- return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a);
18313
+ return __a <= __b ? -1ll : 0ll;
18316
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18317
vcle_u8 (uint8x8_t __a, uint8x8_t __b)
18319
- return (uint8x8_t) __builtin_aarch64_cmhsv8qi ((int8x8_t) __b,
18320
+ return (uint8x8_t) __builtin_aarch64_cmgeuv8qi ((int8x8_t) __b,
18324
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18325
vcle_u16 (uint16x4_t __a, uint16x4_t __b)
18327
- return (uint16x4_t) __builtin_aarch64_cmhsv4hi ((int16x4_t) __b,
18328
+ return (uint16x4_t) __builtin_aarch64_cmgeuv4hi ((int16x4_t) __b,
18332
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18333
vcle_u32 (uint32x2_t __a, uint32x2_t __b)
18335
- return (uint32x2_t) __builtin_aarch64_cmhsv2si ((int32x2_t) __b,
18336
+ return (uint32x2_t) __builtin_aarch64_cmgeuv2si ((int32x2_t) __b,
18340
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18341
vcle_u64 (uint64x1_t __a, uint64x1_t __b)
18343
- return (uint64x1_t) __builtin_aarch64_cmhsdi ((int64x1_t) __b,
18344
- (int64x1_t) __a);
18345
+ return __a <= __b ? -1ll : 0ll;
18348
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18349
+vcleq_f32 (float32x4_t __a, float32x4_t __b)
18351
+ return (uint32x4_t) __builtin_aarch64_cmgev4sf (__b, __a);
18354
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18355
+vcleq_f64 (float64x2_t __a, float64x2_t __b)
18357
+ return (uint64x2_t) __builtin_aarch64_cmgev2df (__b, __a);
18360
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18361
+vcleq_p8 (poly8x16_t __a, poly8x16_t __b)
18363
+ return (uint8x16_t) __builtin_aarch64_cmgev16qi ((int8x16_t) __b,
18364
+ (int8x16_t) __a);
18367
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18368
vcleq_s8 (int8x16_t __a, int8x16_t __b)
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)
18375
- return (uint8x16_t) __builtin_aarch64_cmhsv16qi ((int8x16_t) __b,
18376
+ return (uint8x16_t) __builtin_aarch64_cmgeuv16qi ((int8x16_t) __b,
18380
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18381
vcleq_u16 (uint16x8_t __a, uint16x8_t __b)
18383
- return (uint16x8_t) __builtin_aarch64_cmhsv8hi ((int16x8_t) __b,
18384
+ return (uint16x8_t) __builtin_aarch64_cmgeuv8hi ((int16x8_t) __b,
18388
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18389
vcleq_u32 (uint32x4_t __a, uint32x4_t __b)
18391
- return (uint32x4_t) __builtin_aarch64_cmhsv4si ((int32x4_t) __b,
18392
+ return (uint32x4_t) __builtin_aarch64_cmgeuv4si ((int32x4_t) __b,
18396
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18397
vcleq_u64 (uint64x2_t __a, uint64x2_t __b)
18399
- return (uint64x2_t) __builtin_aarch64_cmhsv2di ((int64x2_t) __b,
18400
+ return (uint64x2_t) __builtin_aarch64_cmgeuv2di ((int64x2_t) __b,
18404
+/* vcle - scalar. */
18406
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18407
+vcles_f32 (float32_t __a, float32_t __b)
18409
+ return __a <= __b ? -1 : 0;
18412
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18413
vcled_s64 (int64x1_t __a, int64x1_t __b)
18415
- return (uint64x1_t) __builtin_aarch64_cmgedi (__b, __a);
18416
+ return __a <= __b ? -1ll : 0ll;
18419
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18420
+vcled_u64 (uint64x1_t __a, uint64x1_t __b)
18422
+ return __a <= __b ? -1ll : 0ll;
18425
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18426
+vcled_f64 (float64_t __a, float64_t __b)
18428
+ return __a <= __b ? -1ll : 0ll;
18431
+/* vclez - vector. */
18433
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18434
+vclez_f32 (float32x2_t __a)
18436
+ float32x2_t __b = {0.0f, 0.0f};
18437
+ return (uint32x2_t) __builtin_aarch64_cmlev2sf (__a, __b);
18440
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18441
+vclez_f64 (float64x1_t __a)
18443
+ return __a <= 0.0 ? -1ll : 0ll;
18446
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18447
+vclez_p8 (poly8x8_t __a)
18449
+ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18450
+ return (uint8x8_t) __builtin_aarch64_cmlev8qi ((int8x8_t) __a,
18454
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18455
+vclez_s8 (int8x8_t __a)
18457
+ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18458
+ return (uint8x8_t) __builtin_aarch64_cmlev8qi (__a, __b);
18461
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18462
+vclez_s16 (int16x4_t __a)
18464
+ int16x4_t __b = {0, 0, 0, 0};
18465
+ return (uint16x4_t) __builtin_aarch64_cmlev4hi (__a, __b);
18468
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18469
+vclez_s32 (int32x2_t __a)
18471
+ int32x2_t __b = {0, 0};
18472
+ return (uint32x2_t) __builtin_aarch64_cmlev2si (__a, __b);
18475
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18476
+vclez_s64 (int64x1_t __a)
18478
+ return __a <= 0ll ? -1ll : 0ll;
18481
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18482
+vclez_u64 (uint64x1_t __a)
18484
+ return __a <= 0ll ? -1ll : 0ll;
18487
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18488
+vclezq_f32 (float32x4_t __a)
18490
+ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
18491
+ return (uint32x4_t) __builtin_aarch64_cmlev4sf (__a, __b);
18494
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18495
+vclezq_f64 (float64x2_t __a)
18497
+ float64x2_t __b = {0.0, 0.0};
18498
+ return (uint64x2_t) __builtin_aarch64_cmlev2df (__a, __b);
18501
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18502
+vclezq_p8 (poly8x16_t __a)
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);
18510
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18511
+vclezq_s8 (int8x16_t __a)
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);
18518
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18519
+vclezq_s16 (int16x8_t __a)
18521
+ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18522
+ return (uint16x8_t) __builtin_aarch64_cmlev8hi (__a, __b);
18525
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18526
+vclezq_s32 (int32x4_t __a)
18528
+ int32x4_t __b = {0, 0, 0, 0};
18529
+ return (uint32x4_t) __builtin_aarch64_cmlev4si (__a, __b);
18532
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18533
+vclezq_s64 (int64x2_t __a)
18535
+ int64x2_t __b = {0, 0};
18536
+ return (uint64x2_t) __builtin_aarch64_cmlev2di (__a, __b);
18539
+/* vclez - scalar. */
18541
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18542
+vclezs_f32 (float32_t __a)
18544
+ return __a <= 0.0f ? -1 : 0;
18547
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18548
vclezd_s64 (int64x1_t __a)
18550
- return (uint64x1_t) __builtin_aarch64_cmledi (__a, 0);
18551
+ return __a <= 0 ? -1ll : 0ll;
18555
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18556
+vclezd_u64 (int64x1_t __a)
18558
+ return __a <= 0 ? -1ll : 0ll;
18561
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18562
+vclezd_f64 (float64_t __a)
18564
+ return __a <= 0.0 ? -1ll : 0ll;
18567
+/* vclt - vector. */
18569
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18570
+vclt_f32 (float32x2_t __a, float32x2_t __b)
18572
+ return (uint32x2_t) __builtin_aarch64_cmgtv2sf (__b, __a);
18575
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18576
+vclt_f64 (float64x1_t __a, float64x1_t __b)
18578
+ return __a < __b ? -1ll : 0ll;
18581
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18582
+vclt_p8 (poly8x8_t __a, poly8x8_t __b)
18584
+ return (uint8x8_t) __builtin_aarch64_cmgtv8qi ((int8x8_t) __b,
18588
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18589
vclt_s8 (int8x8_t __a, int8x8_t __b)
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)
18596
- return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a);
18597
+ return __a < __b ? -1ll : 0ll;
18600
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18601
vclt_u8 (uint8x8_t __a, uint8x8_t __b)
18603
- return (uint8x8_t) __builtin_aarch64_cmhiv8qi ((int8x8_t) __b,
18604
+ return (uint8x8_t) __builtin_aarch64_cmgtuv8qi ((int8x8_t) __b,
18608
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18609
vclt_u16 (uint16x4_t __a, uint16x4_t __b)
18611
- return (uint16x4_t) __builtin_aarch64_cmhiv4hi ((int16x4_t) __b,
18612
+ return (uint16x4_t) __builtin_aarch64_cmgtuv4hi ((int16x4_t) __b,
18616
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18617
vclt_u32 (uint32x2_t __a, uint32x2_t __b)
18619
- return (uint32x2_t) __builtin_aarch64_cmhiv2si ((int32x2_t) __b,
18620
+ return (uint32x2_t) __builtin_aarch64_cmgtuv2si ((int32x2_t) __b,
18624
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18625
vclt_u64 (uint64x1_t __a, uint64x1_t __b)
18627
- return (uint64x1_t) __builtin_aarch64_cmhidi ((int64x1_t) __b,
18628
- (int64x1_t) __a);
18629
+ return __a < __b ? -1ll : 0ll;
18632
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18633
+vcltq_f32 (float32x4_t __a, float32x4_t __b)
18635
+ return (uint32x4_t) __builtin_aarch64_cmgtv4sf (__b, __a);
18638
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18639
+vcltq_f64 (float64x2_t __a, float64x2_t __b)
18641
+ return (uint64x2_t) __builtin_aarch64_cmgtv2df (__b, __a);
18644
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18645
+vcltq_p8 (poly8x16_t __a, poly8x16_t __b)
18647
+ return (uint8x16_t) __builtin_aarch64_cmgtv16qi ((int8x16_t) __b,
18648
+ (int8x16_t) __a);
18651
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18652
vcltq_s8 (int8x16_t __a, int8x16_t __b)
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)
18659
- return (uint8x16_t) __builtin_aarch64_cmhiv16qi ((int8x16_t) __b,
18660
+ return (uint8x16_t) __builtin_aarch64_cmgtuv16qi ((int8x16_t) __b,
18664
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18665
vcltq_u16 (uint16x8_t __a, uint16x8_t __b)
18667
- return (uint16x8_t) __builtin_aarch64_cmhiv8hi ((int16x8_t) __b,
18668
+ return (uint16x8_t) __builtin_aarch64_cmgtuv8hi ((int16x8_t) __b,
18672
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18673
vcltq_u32 (uint32x4_t __a, uint32x4_t __b)
18675
- return (uint32x4_t) __builtin_aarch64_cmhiv4si ((int32x4_t) __b,
18676
+ return (uint32x4_t) __builtin_aarch64_cmgtuv4si ((int32x4_t) __b,
18680
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18681
vcltq_u64 (uint64x2_t __a, uint64x2_t __b)
18683
- return (uint64x2_t) __builtin_aarch64_cmhiv2di ((int64x2_t) __b,
18684
+ return (uint64x2_t) __builtin_aarch64_cmgtuv2di ((int64x2_t) __b,
18688
+/* vclt - scalar. */
18690
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18691
+vclts_f32 (float32_t __a, float32_t __b)
18693
+ return __a < __b ? -1 : 0;
18696
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18697
vcltd_s64 (int64x1_t __a, int64x1_t __b)
18699
- return (uint64x1_t) __builtin_aarch64_cmgtdi (__b, __a);
18700
+ return __a < __b ? -1ll : 0ll;
18703
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18704
+vcltd_u64 (uint64x1_t __a, uint64x1_t __b)
18706
+ return __a < __b ? -1ll : 0ll;
18709
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18710
+vcltd_f64 (float64_t __a, float64_t __b)
18712
+ return __a < __b ? -1ll : 0ll;
18715
+/* vcltz - vector. */
18717
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18718
+vcltz_f32 (float32x2_t __a)
18720
+ float32x2_t __b = {0.0f, 0.0f};
18721
+ return (uint32x2_t) __builtin_aarch64_cmltv2sf (__a, __b);
18724
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18725
+vcltz_f64 (float64x1_t __a)
18727
+ return __a < 0.0 ? -1ll : 0ll;
18730
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18731
+vcltz_p8 (poly8x8_t __a)
18733
+ poly8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18734
+ return (uint8x8_t) __builtin_aarch64_cmltv8qi ((int8x8_t) __a,
18738
+__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
18739
+vcltz_s8 (int8x8_t __a)
18741
+ int8x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18742
+ return (uint8x8_t) __builtin_aarch64_cmltv8qi (__a, __b);
18745
+__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
18746
+vcltz_s16 (int16x4_t __a)
18748
+ int16x4_t __b = {0, 0, 0, 0};
18749
+ return (uint16x4_t) __builtin_aarch64_cmltv4hi (__a, __b);
18752
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18753
+vcltz_s32 (int32x2_t __a)
18755
+ int32x2_t __b = {0, 0};
18756
+ return (uint32x2_t) __builtin_aarch64_cmltv2si (__a, __b);
18759
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18760
+vcltz_s64 (int64x1_t __a)
18762
+ return __a < 0ll ? -1ll : 0ll;
18765
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18766
+vcltzq_f32 (float32x4_t __a)
18768
+ float32x4_t __b = {0.0f, 0.0f, 0.0f, 0.0f};
18769
+ return (uint32x4_t) __builtin_aarch64_cmltv4sf (__a, __b);
18772
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18773
+vcltzq_f64 (float64x2_t __a)
18775
+ float64x2_t __b = {0.0, 0.0};
18776
+ return (uint64x2_t) __builtin_aarch64_cmltv2df (__a, __b);
18779
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18780
+vcltzq_p8 (poly8x16_t __a)
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);
18788
+__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
18789
+vcltzq_s8 (int8x16_t __a)
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);
18796
+__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
18797
+vcltzq_s16 (int16x8_t __a)
18799
+ int16x8_t __b = {0, 0, 0, 0, 0, 0, 0, 0};
18800
+ return (uint16x8_t) __builtin_aarch64_cmltv8hi (__a, __b);
18803
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18804
+vcltzq_s32 (int32x4_t __a)
18806
+ int32x4_t __b = {0, 0, 0, 0};
18807
+ return (uint32x4_t) __builtin_aarch64_cmltv4si (__a, __b);
18810
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18811
+vcltzq_s64 (int64x2_t __a)
18813
+ int64x2_t __b = {0, 0};
18814
+ return (uint64x2_t) __builtin_aarch64_cmltv2di (__a, __b);
18817
+/* vcltz - scalar. */
18819
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18820
+vcltzs_f32 (float32_t __a)
18822
+ return __a < 0.0f ? -1 : 0;
18825
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18826
vcltzd_s64 (int64x1_t __a)
18828
- return (uint64x1_t) __builtin_aarch64_cmltdi (__a, 0);
18829
+ return __a < 0 ? -1ll : 0ll;
18832
+__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
18833
+vcltzd_u64 (int64x1_t __a)
18835
+ return __a < 0 ? -1ll : 0ll;
18838
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18839
+vcltzd_f64 (float64_t __a)
18841
+ return __a < 0.0 ? -1ll : 0ll;
18844
+/* vcvt (double -> float). */
18846
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
18847
+vcvt_f32_f64 (float64x2_t __a)
18849
+ return __builtin_aarch64_float_truncate_lo_v2sf (__a);
18852
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
18853
+vcvt_high_f32_f64 (float32x2_t __a, float64x2_t __b)
18855
+ return __builtin_aarch64_float_truncate_hi_v4sf (__a, __b);
18858
+/* vcvt (float -> double). */
18860
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
18861
+vcvt_f64_f32 (float32x2_t __a)
18864
+ return __builtin_aarch64_float_extend_lo_v2df (__a);
18867
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
18868
+vcvt_high_f64_f32 (float32x4_t __a)
18870
+ return __builtin_aarch64_vec_unpacks_hi_v4sf (__a);
18873
+/* vcvt (<u>int -> float) */
18875
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
18876
+vcvtd_f64_s64 (int64_t __a)
18878
+ return (float64_t) __a;
18881
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
18882
+vcvtd_f64_u64 (uint64_t __a)
18884
+ return (float64_t) __a;
18887
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
18888
+vcvts_f32_s32 (int32_t __a)
18890
+ return (float32_t) __a;
18893
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
18894
+vcvts_f32_u32 (uint32_t __a)
18896
+ return (float32_t) __a;
18899
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
18900
+vcvt_f32_s32 (int32x2_t __a)
18902
+ return __builtin_aarch64_floatv2siv2sf (__a);
18905
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
18906
+vcvt_f32_u32 (uint32x2_t __a)
18908
+ return __builtin_aarch64_floatunsv2siv2sf ((int32x2_t) __a);
18911
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
18912
+vcvtq_f32_s32 (int32x4_t __a)
18914
+ return __builtin_aarch64_floatv4siv4sf (__a);
18917
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
18918
+vcvtq_f32_u32 (uint32x4_t __a)
18920
+ return __builtin_aarch64_floatunsv4siv4sf ((int32x4_t) __a);
18923
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
18924
+vcvtq_f64_s64 (int64x2_t __a)
18926
+ return __builtin_aarch64_floatv2div2df (__a);
18929
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
18930
+vcvtq_f64_u64 (uint64x2_t __a)
18932
+ return __builtin_aarch64_floatunsv2div2df ((int64x2_t) __a);
18935
+/* vcvt (float -> <u>int) */
18937
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
18938
+vcvtd_s64_f64 (float64_t __a)
18940
+ return (int64_t) __a;
18943
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
18944
+vcvtd_u64_f64 (float64_t __a)
18946
+ return (uint64_t) __a;
18949
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
18950
+vcvts_s32_f32 (float32_t __a)
18952
+ return (int32_t) __a;
18955
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
18956
+vcvts_u32_f32 (float32_t __a)
18958
+ return (uint32_t) __a;
18961
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
18962
+vcvt_s32_f32 (float32x2_t __a)
18964
+ return __builtin_aarch64_lbtruncv2sfv2si (__a);
18967
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
18968
+vcvt_u32_f32 (float32x2_t __a)
18970
+ /* TODO: This cast should go away when builtins have
18971
+ their correct types. */
18972
+ return (uint32x2_t) __builtin_aarch64_lbtruncuv2sfv2si (__a);
18975
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
18976
+vcvtq_s32_f32 (float32x4_t __a)
18978
+ return __builtin_aarch64_lbtruncv4sfv4si (__a);
18981
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
18982
+vcvtq_u32_f32 (float32x4_t __a)
18984
+ /* TODO: This cast should go away when builtins have
18985
+ their correct types. */
18986
+ return (uint32x4_t) __builtin_aarch64_lbtruncuv4sfv4si (__a);
18989
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
18990
+vcvtq_s64_f64 (float64x2_t __a)
18992
+ return __builtin_aarch64_lbtruncv2dfv2di (__a);
18995
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
18996
+vcvtq_u64_f64 (float64x2_t __a)
18998
+ /* TODO: This cast should go away when builtins have
18999
+ their correct types. */
19000
+ return (uint64x2_t) __builtin_aarch64_lbtruncuv2dfv2di (__a);
19005
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
19006
+vcvtad_s64_f64 (float64_t __a)
19008
+ return __builtin_aarch64_lrounddfdi (__a);
19011
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
19012
+vcvtad_u64_f64 (float64_t __a)
19014
+ return __builtin_aarch64_lroundudfdi (__a);
19017
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19018
+vcvtas_s32_f32 (float32_t __a)
19020
+ return __builtin_aarch64_lroundsfsi (__a);
19023
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19024
+vcvtas_u32_f32 (float32_t __a)
19026
+ return __builtin_aarch64_lroundusfsi (__a);
19029
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
19030
+vcvta_s32_f32 (float32x2_t __a)
19032
+ return __builtin_aarch64_lroundv2sfv2si (__a);
19035
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
19036
+vcvta_u32_f32 (float32x2_t __a)
19038
+ /* TODO: This cast should go away when builtins have
19039
+ their correct types. */
19040
+ return (uint32x2_t) __builtin_aarch64_lrounduv2sfv2si (__a);
19043
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
19044
+vcvtaq_s32_f32 (float32x4_t __a)
19046
+ return __builtin_aarch64_lroundv4sfv4si (__a);
19049
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
19050
+vcvtaq_u32_f32 (float32x4_t __a)
19052
+ /* TODO: This cast should go away when builtins have
19053
+ their correct types. */
19054
+ return (uint32x4_t) __builtin_aarch64_lrounduv4sfv4si (__a);
19057
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
19058
+vcvtaq_s64_f64 (float64x2_t __a)
19060
+ return __builtin_aarch64_lroundv2dfv2di (__a);
19063
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
19064
+vcvtaq_u64_f64 (float64x2_t __a)
19066
+ /* TODO: This cast should go away when builtins have
19067
+ their correct types. */
19068
+ return (uint64x2_t) __builtin_aarch64_lrounduv2dfv2di (__a);
19073
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
19074
+vcvtmd_s64_f64 (float64_t __a)
19076
+ return __builtin_lfloor (__a);
19079
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
19080
+vcvtmd_u64_f64 (float64_t __a)
19082
+ return __builtin_aarch64_lfloorudfdi (__a);
19085
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19086
+vcvtms_s32_f32 (float32_t __a)
19088
+ return __builtin_ifloorf (__a);
19091
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19092
+vcvtms_u32_f32 (float32_t __a)
19094
+ return __builtin_aarch64_lfloorusfsi (__a);
19097
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
19098
+vcvtm_s32_f32 (float32x2_t __a)
19100
+ return __builtin_aarch64_lfloorv2sfv2si (__a);
19103
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
19104
+vcvtm_u32_f32 (float32x2_t __a)
19106
+ /* TODO: This cast should go away when builtins have
19107
+ their correct types. */
19108
+ return (uint32x2_t) __builtin_aarch64_lflooruv2sfv2si (__a);
19111
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
19112
+vcvtmq_s32_f32 (float32x4_t __a)
19114
+ return __builtin_aarch64_lfloorv4sfv4si (__a);
19117
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
19118
+vcvtmq_u32_f32 (float32x4_t __a)
19120
+ /* TODO: This cast should go away when builtins have
19121
+ their correct types. */
19122
+ return (uint32x4_t) __builtin_aarch64_lflooruv4sfv4si (__a);
19125
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
19126
+vcvtmq_s64_f64 (float64x2_t __a)
19128
+ return __builtin_aarch64_lfloorv2dfv2di (__a);
19131
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
19132
+vcvtmq_u64_f64 (float64x2_t __a)
19134
+ /* TODO: This cast should go away when builtins have
19135
+ their correct types. */
19136
+ return (uint64x2_t) __builtin_aarch64_lflooruv2dfv2di (__a);
19141
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
19142
+vcvtnd_s64_f64 (float64_t __a)
19144
+ return __builtin_aarch64_lfrintndfdi (__a);
19147
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
19148
+vcvtnd_u64_f64 (float64_t __a)
19150
+ return __builtin_aarch64_lfrintnudfdi (__a);
19153
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19154
+vcvtns_s32_f32 (float32_t __a)
19156
+ return __builtin_aarch64_lfrintnsfsi (__a);
19159
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19160
+vcvtns_u32_f32 (float32_t __a)
19162
+ return __builtin_aarch64_lfrintnusfsi (__a);
19165
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
19166
+vcvtn_s32_f32 (float32x2_t __a)
19168
+ return __builtin_aarch64_lfrintnv2sfv2si (__a);
19171
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
19172
+vcvtn_u32_f32 (float32x2_t __a)
19174
+ /* TODO: This cast should go away when builtins have
19175
+ their correct types. */
19176
+ return (uint32x2_t) __builtin_aarch64_lfrintnuv2sfv2si (__a);
19179
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
19180
+vcvtnq_s32_f32 (float32x4_t __a)
19182
+ return __builtin_aarch64_lfrintnv4sfv4si (__a);
19185
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
19186
+vcvtnq_u32_f32 (float32x4_t __a)
19188
+ /* TODO: This cast should go away when builtins have
19189
+ their correct types. */
19190
+ return (uint32x4_t) __builtin_aarch64_lfrintnuv4sfv4si (__a);
19193
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
19194
+vcvtnq_s64_f64 (float64x2_t __a)
19196
+ return __builtin_aarch64_lfrintnv2dfv2di (__a);
19199
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
19200
+vcvtnq_u64_f64 (float64x2_t __a)
19202
+ /* TODO: This cast should go away when builtins have
19203
+ their correct types. */
19204
+ return (uint64x2_t) __builtin_aarch64_lfrintnuv2dfv2di (__a);
19209
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
19210
+vcvtpd_s64_f64 (float64_t __a)
19212
+ return __builtin_lceil (__a);
19215
+__extension__ static __inline uint64_t __attribute__ ((__always_inline__))
19216
+vcvtpd_u64_f64 (float64_t __a)
19218
+ return __builtin_aarch64_lceiludfdi (__a);
19221
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19222
+vcvtps_s32_f32 (float32_t __a)
19224
+ return __builtin_iceilf (__a);
19227
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19228
+vcvtps_u32_f32 (float32_t __a)
19230
+ return __builtin_aarch64_lceilusfsi (__a);
19233
+__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
19234
+vcvtp_s32_f32 (float32x2_t __a)
19236
+ return __builtin_aarch64_lceilv2sfv2si (__a);
19239
+__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
19240
+vcvtp_u32_f32 (float32x2_t __a)
19242
+ /* TODO: This cast should go away when builtins have
19243
+ their correct types. */
19244
+ return (uint32x2_t) __builtin_aarch64_lceiluv2sfv2si (__a);
19247
+__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
19248
+vcvtpq_s32_f32 (float32x4_t __a)
19250
+ return __builtin_aarch64_lceilv4sfv4si (__a);
19253
+__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
19254
+vcvtpq_u32_f32 (float32x4_t __a)
19256
+ /* TODO: This cast should go away when builtins have
19257
+ their correct types. */
19258
+ return (uint32x4_t) __builtin_aarch64_lceiluv4sfv4si (__a);
19261
+__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
19262
+vcvtpq_s64_f64 (float64x2_t __a)
19264
+ return __builtin_aarch64_lceilv2dfv2di (__a);
19267
+__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
19268
+vcvtpq_u64_f64 (float64x2_t __a)
19270
+ /* TODO: This cast should go away when builtins have
19271
+ their correct types. */
19272
+ return (uint64x2_t) __builtin_aarch64_lceiluv2dfv2di (__a);
19277
__extension__ static __inline int8x1_t __attribute__ ((__always_inline__))
19278
vdupb_lane_s8 (int8x16_t a, int const b)
19280
- return __builtin_aarch64_dup_laneqi (a, b);
19281
+ return __aarch64_vgetq_lane_s8 (a, b);
19284
__extension__ static __inline uint8x1_t __attribute__ ((__always_inline__))
19285
vdupb_lane_u8 (uint8x16_t a, int const b)
19287
- return (uint8x1_t) __builtin_aarch64_dup_laneqi ((int8x16_t) a, b);
19288
+ return __aarch64_vgetq_lane_u8 (a, b);
19291
__extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
19292
vduph_lane_s16 (int16x8_t a, int const b)
19294
- return __builtin_aarch64_dup_lanehi (a, b);
19295
+ return __aarch64_vgetq_lane_s16 (a, b);
19298
__extension__ static __inline uint16x1_t __attribute__ ((__always_inline__))
19299
vduph_lane_u16 (uint16x8_t a, int const b)
19301
- return (uint16x1_t) __builtin_aarch64_dup_lanehi ((int16x8_t) a, b);
19302
+ return __aarch64_vgetq_lane_u16 (a, b);
19305
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
19306
vdups_lane_s32 (int32x4_t a, int const b)
19308
- return __builtin_aarch64_dup_lanesi (a, b);
19309
+ return __aarch64_vgetq_lane_s32 (a, b);
19312
__extension__ static __inline uint32x1_t __attribute__ ((__always_inline__))
19313
vdups_lane_u32 (uint32x4_t a, int const b)
19315
- return (uint32x1_t) __builtin_aarch64_dup_lanesi ((int32x4_t) a, b);
19316
+ return __aarch64_vgetq_lane_u32 (a, b);
19319
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
19320
vdupd_lane_s64 (int64x2_t a, int const b)
19322
- return __builtin_aarch64_dup_lanedi (a, b);
19323
+ return __aarch64_vgetq_lane_s64 (a, b);
19326
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
19327
vdupd_lane_u64 (uint64x2_t a, int const b)
19329
- return (uint64x1_t) __builtin_aarch64_dup_lanedi ((int64x2_t) a, b);
19330
+ return __aarch64_vgetq_lane_u64 (a, b);
19334
@@ -21088,7 +20835,7 @@
19335
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19336
vmax_f32 (float32x2_t __a, float32x2_t __b)
19338
- return __builtin_aarch64_fmaxv2sf (__a, __b);
19339
+ return __builtin_aarch64_smax_nanv2sf (__a, __b);
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)
19347
- return __builtin_aarch64_fmaxv4sf (__a, __b);
19348
+ return __builtin_aarch64_smax_nanv4sf (__a, __b);
19351
__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19352
vmaxq_f64 (float64x2_t __a, float64x2_t __b)
19354
- return __builtin_aarch64_fmaxv2df (__a, __b);
19355
+ return __builtin_aarch64_smax_nanv2df (__a, __b);
19358
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
19359
@@ -21181,12 +20928,150 @@
19366
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19367
+vmaxnm_f32 (float32x2_t __a, float32x2_t __b)
19369
+ return __builtin_aarch64_smaxv2sf (__a, __b);
19372
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19373
+vmaxnmq_f32 (float32x4_t __a, float32x4_t __b)
19375
+ return __builtin_aarch64_smaxv4sf (__a, __b);
19378
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19379
+vmaxnmq_f64 (float64x2_t __a, float64x2_t __b)
19381
+ return __builtin_aarch64_smaxv2df (__a, __b);
19386
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19387
+vmaxv_f32 (float32x2_t __a)
19389
+ return vget_lane_f32 (__builtin_aarch64_reduc_smax_nan_v2sf (__a), 0);
19392
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
19393
+vmaxv_s8 (int8x8_t __a)
19395
+ return vget_lane_s8 (__builtin_aarch64_reduc_smax_v8qi (__a), 0);
19398
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
19399
+vmaxv_s16 (int16x4_t __a)
19401
+ return vget_lane_s16 (__builtin_aarch64_reduc_smax_v4hi (__a), 0);
19404
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19405
+vmaxv_s32 (int32x2_t __a)
19407
+ return vget_lane_s32 (__builtin_aarch64_reduc_smax_v2si (__a), 0);
19410
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
19411
+vmaxv_u8 (uint8x8_t __a)
19413
+ return vget_lane_u8 ((uint8x8_t)
19414
+ __builtin_aarch64_reduc_umax_v8qi ((int8x8_t) __a), 0);
19417
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
19418
+vmaxv_u16 (uint16x4_t __a)
19420
+ return vget_lane_u16 ((uint16x4_t)
19421
+ __builtin_aarch64_reduc_umax_v4hi ((int16x4_t) __a), 0);
19424
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19425
+vmaxv_u32 (uint32x2_t __a)
19427
+ return vget_lane_u32 ((uint32x2_t)
19428
+ __builtin_aarch64_reduc_umax_v2si ((int32x2_t) __a), 0);
19431
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19432
+vmaxvq_f32 (float32x4_t __a)
19434
+ return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_nan_v4sf (__a), 0);
19437
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19438
+vmaxvq_f64 (float64x2_t __a)
19440
+ return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_nan_v2df (__a), 0);
19443
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
19444
+vmaxvq_s8 (int8x16_t __a)
19446
+ return vgetq_lane_s8 (__builtin_aarch64_reduc_smax_v16qi (__a), 0);
19449
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
19450
+vmaxvq_s16 (int16x8_t __a)
19452
+ return vgetq_lane_s16 (__builtin_aarch64_reduc_smax_v8hi (__a), 0);
19455
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19456
+vmaxvq_s32 (int32x4_t __a)
19458
+ return vgetq_lane_s32 (__builtin_aarch64_reduc_smax_v4si (__a), 0);
19461
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
19462
+vmaxvq_u8 (uint8x16_t __a)
19464
+ return vgetq_lane_u8 ((uint8x16_t)
19465
+ __builtin_aarch64_reduc_umax_v16qi ((int8x16_t) __a), 0);
19468
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
19469
+vmaxvq_u16 (uint16x8_t __a)
19471
+ return vgetq_lane_u16 ((uint16x8_t)
19472
+ __builtin_aarch64_reduc_umax_v8hi ((int16x8_t) __a), 0);
19475
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19476
+vmaxvq_u32 (uint32x4_t __a)
19478
+ return vgetq_lane_u32 ((uint32x4_t)
19479
+ __builtin_aarch64_reduc_umax_v4si ((int32x4_t) __a), 0);
19484
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19485
+vmaxnmv_f32 (float32x2_t __a)
19487
+ return vget_lane_f32 (__builtin_aarch64_reduc_smax_v2sf (__a), 0);
19490
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19491
+vmaxnmvq_f32 (float32x4_t __a)
19493
+ return vgetq_lane_f32 (__builtin_aarch64_reduc_smax_v4sf (__a), 0);
19496
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19497
+vmaxnmvq_f64 (float64x2_t __a)
19499
+ return vgetq_lane_f64 (__builtin_aarch64_reduc_smax_v2df (__a), 0);
19504
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19505
vmin_f32 (float32x2_t __a, float32x2_t __b)
19507
- return __builtin_aarch64_fminv2sf (__a, __b);
19508
+ return __builtin_aarch64_smin_nanv2sf (__a, __b);
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)
19516
- return __builtin_aarch64_fminv4sf (__a, __b);
19517
+ return __builtin_aarch64_smin_nanv4sf (__a, __b);
19520
__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19521
vminq_f64 (float64x2_t __a, float64x2_t __b)
19523
- return __builtin_aarch64_fminv2df (__a, __b);
19524
+ return __builtin_aarch64_smin_nanv2df (__a, __b);
19527
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
19528
@@ -21279,6 +21164,144 @@
19534
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19535
+vminnm_f32 (float32x2_t __a, float32x2_t __b)
19537
+ return __builtin_aarch64_sminv2sf (__a, __b);
19540
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19541
+vminnmq_f32 (float32x4_t __a, float32x4_t __b)
19543
+ return __builtin_aarch64_sminv4sf (__a, __b);
19546
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19547
+vminnmq_f64 (float64x2_t __a, float64x2_t __b)
19549
+ return __builtin_aarch64_sminv2df (__a, __b);
19554
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19555
+vminv_f32 (float32x2_t __a)
19557
+ return vget_lane_f32 (__builtin_aarch64_reduc_smin_nan_v2sf (__a), 0);
19560
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
19561
+vminv_s8 (int8x8_t __a)
19563
+ return vget_lane_s8 (__builtin_aarch64_reduc_smin_v8qi (__a), 0);
19566
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
19567
+vminv_s16 (int16x4_t __a)
19569
+ return vget_lane_s16 (__builtin_aarch64_reduc_smin_v4hi (__a), 0);
19572
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19573
+vminv_s32 (int32x2_t __a)
19575
+ return vget_lane_s32 (__builtin_aarch64_reduc_smin_v2si (__a), 0);
19578
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
19579
+vminv_u8 (uint8x8_t __a)
19581
+ return vget_lane_u8 ((uint8x8_t)
19582
+ __builtin_aarch64_reduc_umin_v8qi ((int8x8_t) __a), 0);
19585
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
19586
+vminv_u16 (uint16x4_t __a)
19588
+ return vget_lane_u16 ((uint16x4_t)
19589
+ __builtin_aarch64_reduc_umin_v4hi ((int16x4_t) __a), 0);
19592
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19593
+vminv_u32 (uint32x2_t __a)
19595
+ return vget_lane_u32 ((uint32x2_t)
19596
+ __builtin_aarch64_reduc_umin_v2si ((int32x2_t) __a), 0);
19599
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19600
+vminvq_f32 (float32x4_t __a)
19602
+ return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_nan_v4sf (__a), 0);
19605
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19606
+vminvq_f64 (float64x2_t __a)
19608
+ return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_nan_v2df (__a), 0);
19611
+__extension__ static __inline int8_t __attribute__ ((__always_inline__))
19612
+vminvq_s8 (int8x16_t __a)
19614
+ return vgetq_lane_s8 (__builtin_aarch64_reduc_smin_v16qi (__a), 0);
19617
+__extension__ static __inline int16_t __attribute__ ((__always_inline__))
19618
+vminvq_s16 (int16x8_t __a)
19620
+ return vgetq_lane_s16 (__builtin_aarch64_reduc_smin_v8hi (__a), 0);
19623
+__extension__ static __inline int32_t __attribute__ ((__always_inline__))
19624
+vminvq_s32 (int32x4_t __a)
19626
+ return vgetq_lane_s32 (__builtin_aarch64_reduc_smin_v4si (__a), 0);
19629
+__extension__ static __inline uint8_t __attribute__ ((__always_inline__))
19630
+vminvq_u8 (uint8x16_t __a)
19632
+ return vgetq_lane_u8 ((uint8x16_t)
19633
+ __builtin_aarch64_reduc_umin_v16qi ((int8x16_t) __a), 0);
19636
+__extension__ static __inline uint16_t __attribute__ ((__always_inline__))
19637
+vminvq_u16 (uint16x8_t __a)
19639
+ return vgetq_lane_u16 ((uint16x8_t)
19640
+ __builtin_aarch64_reduc_umin_v8hi ((int16x8_t) __a), 0);
19643
+__extension__ static __inline uint32_t __attribute__ ((__always_inline__))
19644
+vminvq_u32 (uint32x4_t __a)
19646
+ return vgetq_lane_u32 ((uint32x4_t)
19647
+ __builtin_aarch64_reduc_umin_v4si ((int32x4_t) __a), 0);
19652
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19653
+vminnmv_f32 (float32x2_t __a)
19655
+ return vget_lane_f32 (__builtin_aarch64_reduc_smin_v2sf (__a), 0);
19658
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19659
+vminnmvq_f32 (float32x4_t __a)
19661
+ return vgetq_lane_f32 (__builtin_aarch64_reduc_smin_v4sf (__a), 0);
19664
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19665
+vminnmvq_f64 (float64x2_t __a)
19667
+ return vgetq_lane_f64 (__builtin_aarch64_reduc_smin_v2df (__a), 0);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
19727
@@ -22795,6 +22818,223 @@
19728
return (uint64x1_t) __builtin_aarch64_uqsubdi (__a, __b);
19733
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19734
+vrecpes_f32 (float32_t __a)
19736
+ return __builtin_aarch64_frecpesf (__a);
19739
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19740
+vrecped_f64 (float64_t __a)
19742
+ return __builtin_aarch64_frecpedf (__a);
19745
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19746
+vrecpe_f32 (float32x2_t __a)
19748
+ return __builtin_aarch64_frecpev2sf (__a);
19751
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19752
+vrecpeq_f32 (float32x4_t __a)
19754
+ return __builtin_aarch64_frecpev4sf (__a);
19757
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19758
+vrecpeq_f64 (float64x2_t __a)
19760
+ return __builtin_aarch64_frecpev2df (__a);
19765
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19766
+vrecpss_f32 (float32_t __a, float32_t __b)
19768
+ return __builtin_aarch64_frecpssf (__a, __b);
19771
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19772
+vrecpsd_f64 (float64_t __a, float64_t __b)
19774
+ return __builtin_aarch64_frecpsdf (__a, __b);
19777
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19778
+vrecps_f32 (float32x2_t __a, float32x2_t __b)
19780
+ return __builtin_aarch64_frecpsv2sf (__a, __b);
19783
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19784
+vrecpsq_f32 (float32x4_t __a, float32x4_t __b)
19786
+ return __builtin_aarch64_frecpsv4sf (__a, __b);
19789
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19790
+vrecpsq_f64 (float64x2_t __a, float64x2_t __b)
19792
+ return __builtin_aarch64_frecpsv2df (__a, __b);
19797
+__extension__ static __inline float32_t __attribute__ ((__always_inline__))
19798
+vrecpxs_f32 (float32_t __a)
19800
+ return __builtin_aarch64_frecpxsf (__a);
19803
+__extension__ static __inline float64_t __attribute__ ((__always_inline__))
19804
+vrecpxd_f64 (float64_t __a)
19806
+ return __builtin_aarch64_frecpxdf (__a);
19811
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19812
+vrnd_f32 (float32x2_t __a)
19814
+ return __builtin_aarch64_btruncv2sf (__a);
19817
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19818
+vrndq_f32 (float32x4_t __a)
19820
+ return __builtin_aarch64_btruncv4sf (__a);
19823
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19824
+vrndq_f64 (float64x2_t __a)
19826
+ return __builtin_aarch64_btruncv2df (__a);
19831
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19832
+vrnda_f32 (float32x2_t __a)
19834
+ return __builtin_aarch64_roundv2sf (__a);
19837
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19838
+vrndaq_f32 (float32x4_t __a)
19840
+ return __builtin_aarch64_roundv4sf (__a);
19843
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19844
+vrndaq_f64 (float64x2_t __a)
19846
+ return __builtin_aarch64_roundv2df (__a);
19851
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19852
+vrndi_f32 (float32x2_t __a)
19854
+ return __builtin_aarch64_nearbyintv2sf (__a);
19857
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19858
+vrndiq_f32 (float32x4_t __a)
19860
+ return __builtin_aarch64_nearbyintv4sf (__a);
19863
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19864
+vrndiq_f64 (float64x2_t __a)
19866
+ return __builtin_aarch64_nearbyintv2df (__a);
19871
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19872
+vrndm_f32 (float32x2_t __a)
19874
+ return __builtin_aarch64_floorv2sf (__a);
19877
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19878
+vrndmq_f32 (float32x4_t __a)
19880
+ return __builtin_aarch64_floorv4sf (__a);
19883
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19884
+vrndmq_f64 (float64x2_t __a)
19886
+ return __builtin_aarch64_floorv2df (__a);
19891
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19892
+vrndn_f32 (float32x2_t __a)
19894
+ return __builtin_aarch64_frintnv2sf (__a);
19896
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19897
+vrndnq_f32 (float32x4_t __a)
19899
+ return __builtin_aarch64_frintnv4sf (__a);
19902
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19903
+vrndnq_f64 (float64x2_t __a)
19905
+ return __builtin_aarch64_frintnv2df (__a);
19910
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19911
+vrndp_f32 (float32x2_t __a)
19913
+ return __builtin_aarch64_ceilv2sf (__a);
19916
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19917
+vrndpq_f32 (float32x4_t __a)
19919
+ return __builtin_aarch64_ceilv4sf (__a);
19922
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19923
+vrndpq_f64 (float64x2_t __a)
19925
+ return __builtin_aarch64_ceilv2df (__a);
19930
+__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
19931
+vrndx_f32 (float32x2_t __a)
19933
+ return __builtin_aarch64_rintv2sf (__a);
19936
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
19937
+vrndxq_f32 (float32x4_t __a)
19939
+ return __builtin_aarch64_rintv4sf (__a);
19942
+__extension__ static __inline float64x2_t __attribute__ ((__always_inline__))
19943
+vrndxq_f64 (float64x2_t __a)
19945
+ return __builtin_aarch64_rintv2df (__a);
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)
19955
- return (int8x8_t) __builtin_aarch64_sshl_nv8qi (__a, __b);
19956
+ return (int8x8_t) __builtin_aarch64_ashlv8qi (__a, __b);
19959
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
19960
vshl_n_s16 (int16x4_t __a, const int __b)
19962
- return (int16x4_t) __builtin_aarch64_sshl_nv4hi (__a, __b);
19963
+ return (int16x4_t) __builtin_aarch64_ashlv4hi (__a, __b);
19966
__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
19967
vshl_n_s32 (int32x2_t __a, const int __b)
19969
- return (int32x2_t) __builtin_aarch64_sshl_nv2si (__a, __b);
19970
+ return (int32x2_t) __builtin_aarch64_ashlv2si (__a, __b);
19973
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
19974
vshl_n_s64 (int64x1_t __a, const int __b)
19976
- return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b);
19977
+ return (int64x1_t) __builtin_aarch64_ashldi (__a, __b);
19980
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
19981
vshl_n_u8 (uint8x8_t __a, const int __b)
19983
- return (uint8x8_t) __builtin_aarch64_ushl_nv8qi ((int8x8_t) __a, __b);
19984
+ return (uint8x8_t) __builtin_aarch64_ashlv8qi ((int8x8_t) __a, __b);
19987
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
19988
vshl_n_u16 (uint16x4_t __a, const int __b)
19990
- return (uint16x4_t) __builtin_aarch64_ushl_nv4hi ((int16x4_t) __a, __b);
19991
+ return (uint16x4_t) __builtin_aarch64_ashlv4hi ((int16x4_t) __a, __b);
19994
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
19995
vshl_n_u32 (uint32x2_t __a, const int __b)
19997
- return (uint32x2_t) __builtin_aarch64_ushl_nv2si ((int32x2_t) __a, __b);
19998
+ return (uint32x2_t) __builtin_aarch64_ashlv2si ((int32x2_t) __a, __b);
20001
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
20002
vshl_n_u64 (uint64x1_t __a, const int __b)
20004
- return (uint64x1_t) __builtin_aarch64_ushl_ndi ((int64x1_t) __a, __b);
20005
+ return (uint64x1_t) __builtin_aarch64_ashldi ((int64x1_t) __a, __b);
20008
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
20009
vshlq_n_s8 (int8x16_t __a, const int __b)
20011
- return (int8x16_t) __builtin_aarch64_sshl_nv16qi (__a, __b);
20012
+ return (int8x16_t) __builtin_aarch64_ashlv16qi (__a, __b);
20015
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
20016
vshlq_n_s16 (int16x8_t __a, const int __b)
20018
- return (int16x8_t) __builtin_aarch64_sshl_nv8hi (__a, __b);
20019
+ return (int16x8_t) __builtin_aarch64_ashlv8hi (__a, __b);
20022
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
20023
vshlq_n_s32 (int32x4_t __a, const int __b)
20025
- return (int32x4_t) __builtin_aarch64_sshl_nv4si (__a, __b);
20026
+ return (int32x4_t) __builtin_aarch64_ashlv4si (__a, __b);
20029
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
20030
vshlq_n_s64 (int64x2_t __a, const int __b)
20032
- return (int64x2_t) __builtin_aarch64_sshl_nv2di (__a, __b);
20033
+ return (int64x2_t) __builtin_aarch64_ashlv2di (__a, __b);
20036
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
20037
vshlq_n_u8 (uint8x16_t __a, const int __b)
20039
- return (uint8x16_t) __builtin_aarch64_ushl_nv16qi ((int8x16_t) __a, __b);
20040
+ return (uint8x16_t) __builtin_aarch64_ashlv16qi ((int8x16_t) __a, __b);
20043
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
20044
vshlq_n_u16 (uint16x8_t __a, const int __b)
20046
- return (uint16x8_t) __builtin_aarch64_ushl_nv8hi ((int16x8_t) __a, __b);
20047
+ return (uint16x8_t) __builtin_aarch64_ashlv8hi ((int16x8_t) __a, __b);
20050
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
20051
vshlq_n_u32 (uint32x4_t __a, const int __b)
20053
- return (uint32x4_t) __builtin_aarch64_ushl_nv4si ((int32x4_t) __a, __b);
20054
+ return (uint32x4_t) __builtin_aarch64_ashlv4si ((int32x4_t) __a, __b);
20057
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
20058
vshlq_n_u64 (uint64x2_t __a, const int __b)
20060
- return (uint64x2_t) __builtin_aarch64_ushl_nv2di ((int64x2_t) __a, __b);
20061
+ return (uint64x2_t) __builtin_aarch64_ashlv2di ((int64x2_t) __a, __b);
20064
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
20065
vshld_n_s64 (int64x1_t __a, const int __b)
20067
- return (int64x1_t) __builtin_aarch64_sshl_ndi (__a, __b);
20068
+ return (int64x1_t) __builtin_aarch64_ashldi (__a, __b);
20071
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
20072
vshld_n_u64 (uint64x1_t __a, const int __b)
20074
- return (uint64x1_t) __builtin_aarch64_ushl_ndi (__a, __b);
20075
+ return (uint64x1_t) __builtin_aarch64_ashldi (__a, __b);
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)
20083
- return (int8x8_t) __builtin_aarch64_sshr_nv8qi (__a, __b);
20084
+ return (int8x8_t) __builtin_aarch64_ashrv8qi (__a, __b);
20087
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
20088
vshr_n_s16 (int16x4_t __a, const int __b)
20090
- return (int16x4_t) __builtin_aarch64_sshr_nv4hi (__a, __b);
20091
+ return (int16x4_t) __builtin_aarch64_ashrv4hi (__a, __b);
20094
__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
20095
vshr_n_s32 (int32x2_t __a, const int __b)
20097
- return (int32x2_t) __builtin_aarch64_sshr_nv2si (__a, __b);
20098
+ return (int32x2_t) __builtin_aarch64_ashrv2si (__a, __b);
20101
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
20102
vshr_n_s64 (int64x1_t __a, const int __b)
20104
- return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b);
20105
+ return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b);
20108
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
20109
vshr_n_u8 (uint8x8_t __a, const int __b)
20111
- return (uint8x8_t) __builtin_aarch64_ushr_nv8qi ((int8x8_t) __a, __b);
20112
+ return (uint8x8_t) __builtin_aarch64_lshrv8qi ((int8x8_t) __a, __b);
20115
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
20116
vshr_n_u16 (uint16x4_t __a, const int __b)
20118
- return (uint16x4_t) __builtin_aarch64_ushr_nv4hi ((int16x4_t) __a, __b);
20119
+ return (uint16x4_t) __builtin_aarch64_lshrv4hi ((int16x4_t) __a, __b);
20122
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
20123
vshr_n_u32 (uint32x2_t __a, const int __b)
20125
- return (uint32x2_t) __builtin_aarch64_ushr_nv2si ((int32x2_t) __a, __b);
20126
+ return (uint32x2_t) __builtin_aarch64_lshrv2si ((int32x2_t) __a, __b);
20129
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
20130
vshr_n_u64 (uint64x1_t __a, const int __b)
20132
- return (uint64x1_t) __builtin_aarch64_ushr_ndi ((int64x1_t) __a, __b);
20133
+ return (uint64x1_t) __builtin_aarch64_lshrdi ((int64x1_t) __a, __b);
20136
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
20137
vshrq_n_s8 (int8x16_t __a, const int __b)
20139
- return (int8x16_t) __builtin_aarch64_sshr_nv16qi (__a, __b);
20140
+ return (int8x16_t) __builtin_aarch64_ashrv16qi (__a, __b);
20143
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
20144
vshrq_n_s16 (int16x8_t __a, const int __b)
20146
- return (int16x8_t) __builtin_aarch64_sshr_nv8hi (__a, __b);
20147
+ return (int16x8_t) __builtin_aarch64_ashrv8hi (__a, __b);
20150
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
20151
vshrq_n_s32 (int32x4_t __a, const int __b)
20153
- return (int32x4_t) __builtin_aarch64_sshr_nv4si (__a, __b);
20154
+ return (int32x4_t) __builtin_aarch64_ashrv4si (__a, __b);
20157
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
20158
vshrq_n_s64 (int64x2_t __a, const int __b)
20160
- return (int64x2_t) __builtin_aarch64_sshr_nv2di (__a, __b);
20161
+ return (int64x2_t) __builtin_aarch64_ashrv2di (__a, __b);
20164
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
20165
vshrq_n_u8 (uint8x16_t __a, const int __b)
20167
- return (uint8x16_t) __builtin_aarch64_ushr_nv16qi ((int8x16_t) __a, __b);
20168
+ return (uint8x16_t) __builtin_aarch64_lshrv16qi ((int8x16_t) __a, __b);
20171
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
20172
vshrq_n_u16 (uint16x8_t __a, const int __b)
20174
- return (uint16x8_t) __builtin_aarch64_ushr_nv8hi ((int16x8_t) __a, __b);
20175
+ return (uint16x8_t) __builtin_aarch64_lshrv8hi ((int16x8_t) __a, __b);
20178
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
20179
vshrq_n_u32 (uint32x4_t __a, const int __b)
20181
- return (uint32x4_t) __builtin_aarch64_ushr_nv4si ((int32x4_t) __a, __b);
20182
+ return (uint32x4_t) __builtin_aarch64_lshrv4si ((int32x4_t) __a, __b);
20185
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
20186
vshrq_n_u64 (uint64x2_t __a, const int __b)
20188
- return (uint64x2_t) __builtin_aarch64_ushr_nv2di ((int64x2_t) __a, __b);
20189
+ return (uint64x2_t) __builtin_aarch64_lshrv2di ((int64x2_t) __a, __b);
20192
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
20193
vshrd_n_s64 (int64x1_t __a, const int __b)
20195
- return (int64x1_t) __builtin_aarch64_sshr_ndi (__a, __b);
20196
+ return (int64x1_t) __builtin_aarch64_ashrdi (__a, __b);
20199
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
20200
vshrd_n_u64 (uint64x1_t __a, const int __b)
20202
- return (uint64x1_t) __builtin_aarch64_ushr_ndi (__a, __b);
20203
+ return (uint64x1_t) __builtin_aarch64_lshrdi (__a, __b);
20207
@@ -24153,8 +24393,8 @@
20209
__builtin_aarch64_simd_oi __o;
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 @@
20220
__builtin_aarch64_simd_oi __o;
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 @@
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 @@
20242
__builtin_aarch64_simd_oi __o;
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 @@
20253
__builtin_aarch64_simd_oi __o;
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 @@
20264
__builtin_aarch64_simd_oi __o;
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 @@
20275
__builtin_aarch64_simd_oi __o;
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 @@
20286
__builtin_aarch64_simd_oi __o;
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 @@
20297
__builtin_aarch64_simd_oi __o;
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 @@
20308
__builtin_aarch64_simd_oi __o;
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 @@
20319
__builtin_aarch64_simd_oi __o;
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 @@
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 @@
20341
__builtin_aarch64_simd_ci __o;
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 @@
20354
__builtin_aarch64_simd_ci __o;
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 @@
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 @@
20380
__builtin_aarch64_simd_ci __o;
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 @@
20393
__builtin_aarch64_simd_ci __o;
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 @@
20406
__builtin_aarch64_simd_ci __o;
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 @@
20419
__builtin_aarch64_simd_ci __o;
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 @@
20432
__builtin_aarch64_simd_ci __o;
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 @@
20445
__builtin_aarch64_simd_ci __o;
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 @@
20458
__builtin_aarch64_simd_ci __o;
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 @@
20471
__builtin_aarch64_simd_ci __o;
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 @@
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 @@
20497
__builtin_aarch64_simd_xi __o;
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 @@
20512
__builtin_aarch64_simd_xi __o;
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 @@
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 @@
20542
__builtin_aarch64_simd_xi __o;
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 @@
20557
__builtin_aarch64_simd_xi __o;
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 @@
20572
__builtin_aarch64_simd_xi __o;
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 @@
20587
__builtin_aarch64_simd_xi __o;
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 @@
20602
__builtin_aarch64_simd_xi __o;
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 @@
20617
__builtin_aarch64_simd_xi __o;
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 @@
20632
__builtin_aarch64_simd_xi __o;
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 @@
20647
__builtin_aarch64_simd_xi __o;
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 @@
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)
20679
- return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b);
20680
+ return (__a & __b) ? -1ll : 0ll;
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)
20688
- return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a,
20689
- (int64x1_t) __b);
20690
+ return (__a & __b) ? -1ll : 0ll;
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)
20698
- return (uint64x1_t) __builtin_aarch64_cmtstdi (__a, __b);
20699
+ return (__a & __b) ? -1ll : 0ll;
20702
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
20703
vtstd_u64 (uint64x1_t __a, uint64x1_t __b)
20705
- return (uint64x1_t) __builtin_aarch64_cmtstdi ((int64x1_t) __a,
20706
- (int64x1_t) __b);
20707
+ return (__a & __b) ? -1ll : 0ll;
20711
@@ -25371,4 +25609,31 @@
20713
/* End of optimal implementations in approved order. */
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
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
20743
--- a/src/gcc/config/aarch64/aarch64.md
20744
+++ b/src/gcc/config/aarch64/aarch64.md
20746
(define_c_enum "unspec" [
20759
@@ -230,6 +234,9 @@
20769
@@ -763,19 +770,41 @@
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))"
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")
20789
+ switch (which_alternative)
20792
+ return "mov\t%w0, %w1";
20794
+ return "mov\t%w0, %1";
20796
+ return aarch64_output_scalar_simd_mov_immediate (operands[1],
20799
+ return "ldr<size>\t%w0, %1";
20801
+ return "ldr\t%<size>0, %1";
20803
+ return "str<size>\t%w1, %0";
20805
+ return "str\t%<size>1, %0";
20807
+ return "umov\t%w0, %1.<v>[0]";
20809
+ return "dup\t%0.<Vallxd>, %w1";
20811
+ return "dup\t%0, %1.<v>[0]";
20813
+ gcc_unreachable ();
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>")]
20822
@@ -797,26 +826,28 @@
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))"
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")]
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))"
20857
@@ -825,17 +856,19 @@
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")]
20879
(define_insn "insv_imm<mode>"
20880
@@ -843,9 +876,8 @@
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))"
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]
20905
@@ -998,6 +1030,17 @@
20906
(set_attr "simd" "yes,*,*,*,yes,*,*,*,*,*")]
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])"
20915
+ aarch64_split_128bit_move (operands[0], operands[1]);
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 @@
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")))]
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>")]
20942
@@ -1287,6 +1331,112 @@
20943
(set_attr "mode" "SI")]
20946
+(define_insn "*adds_mul_imm_<mode>"
20947
+ [(set (reg:CC_NZ CC_REGNUM)
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"))
20954
+ (set (match_operand:GPI 0 "register_operand" "=r")
20955
+ (plus:GPI (mult:GPI (match_dup 1) (match_dup 2))
20958
+ "adds\\t%<w>0, %<w>3, %<w>1, lsl %p2"
20959
+ [(set_attr "v8type" "alus_shift")
20960
+ (set_attr "mode" "<MODE>")]
20963
+(define_insn "*subs_mul_imm_<mode>"
20964
+ [(set (reg:CC_NZ CC_REGNUM)
20966
+ (minus:GPI (match_operand:GPI 1 "register_operand" "rk")
20968
+ (match_operand:GPI 2 "register_operand" "r")
20969
+ (match_operand:QI 3 "aarch64_pwr_2_<mode>" "n")))
20971
+ (set (match_operand:GPI 0 "register_operand" "=r")
20972
+ (minus:GPI (match_dup 1)
20973
+ (mult:GPI (match_dup 2) (match_dup 3))))]
20975
+ "subs\\t%<w>0, %<w>1, %<w>2, lsl %p3"
20976
+ [(set_attr "v8type" "alus_shift")
20977
+ (set_attr "mode" "<MODE>")]
20980
+(define_insn "*adds_<optab><ALLX:mode>_<GPI:mode>"
20981
+ [(set (reg:CC_NZ CC_REGNUM)
20984
+ (ANY_EXTEND:GPI (match_operand:ALLX 1 "register_operand" "r"))
20985
+ (match_operand:GPI 2 "register_operand" "r"))
20987
+ (set (match_operand:GPI 0 "register_operand" "=r")
20988
+ (plus:GPI (ANY_EXTEND:GPI (match_dup 1)) (match_dup 2)))]
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>")]
20995
+(define_insn "*subs_<optab><ALLX:mode>_<GPI:mode>"
20996
+ [(set (reg:CC_NZ CC_REGNUM)
20998
+ (minus:GPI (match_operand:GPI 1 "register_operand" "r")
21000
+ (match_operand:ALLX 2 "register_operand" "r")))
21002
+ (set (match_operand:GPI 0 "register_operand" "=r")
21003
+ (minus:GPI (match_dup 1) (ANY_EXTEND:GPI (match_dup 2))))]
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>")]
21010
+(define_insn "*adds_<optab><mode>_multp2"
21011
+ [(set (reg:CC_NZ CC_REGNUM)
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")
21018
+ (match_operand:GPI 4 "register_operand" "r"))
21020
+ (set (match_operand:GPI 0 "register_operand" "=r")
21021
+ (plus:GPI (ANY_EXTRACT:GPI (mult:GPI (match_dup 1) (match_dup 2))
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>")]
21031
+(define_insn "*subs_<optab><mode>_multp2"
21032
+ [(set (reg:CC_NZ CC_REGNUM)
21034
+ (minus:GPI (match_operand:GPI 4 "register_operand" "r")
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")
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))
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>")]
21052
(define_insn "*add<mode>3nr_compare0"
21053
[(set (reg:CC_NZ CC_REGNUM)
21055
@@ -1302,12 +1452,12 @@
21058
(define_insn "*compare_neg<mode>"
21059
- [(set (reg:CC CC_REGNUM)
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)
21065
+ (neg:GPI (match_operand:GPI 0 "register_operand" "r"))
21066
+ (match_operand:GPI 1 "register_operand" "r")))]
21068
- "cmn\\t%<w>0, %<w>1"
21069
+ "cmn\\t%<w>1, %<w>0"
21070
[(set_attr "v8type" "alus")
21071
(set_attr "mode" "<MODE>")]
21073
@@ -1791,6 +1941,34 @@
21074
(set_attr "mode" "SI")]
21077
+(define_insn "*sub<mode>3_carryin"
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")))]
21085
+ "sbc\\t%<w>0, %<w>1, %<w>2"
21086
+ [(set_attr "v8type" "adc")
21087
+ (set_attr "mode" "<MODE>")]
21090
+;; zero_extend version of the above
21091
+(define_insn "*subsi3_carryin_uxtw"
21093
+ (match_operand:DI 0 "register_operand" "=r")
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"))))]
21100
+ "sbc\\t%w0, %w1, %w2"
21101
+ [(set_attr "v8type" "adc")
21102
+ (set_attr "mode" "SI")]
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")]
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"))]
21120
+ "reload_completed
21121
+ && GP_REGNUM_P (REGNO (operands[0]))
21122
+ && GP_REGNUM_P (REGNO (operands[1]))"
21125
+ emit_insn (gen_rtx_SET (VOIDmode, operands[2],
21126
+ gen_rtx_XOR (DImode,
21127
+ gen_rtx_ASHIFTRT (DImode,
21131
+ emit_insn (gen_rtx_SET (VOIDmode,
21133
+ gen_rtx_MINUS (DImode,
21135
+ gen_rtx_ASHIFTRT (DImode,
21137
+ GEN_INT (63)))));
21140
+ [(set_attr "v8type" "alu")
21141
+ (set_attr "mode" "DI")]
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")]
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")))]
21156
+ "ngc\\t%<w>0, %<w>1"
21157
+ [(set_attr "v8type" "adc")
21158
+ (set_attr "mode" "<MODE>")]
21161
+(define_insn "*ngcsi_uxtw"
21162
+ [(set (match_operand:DI 0 "register_operand" "=r")
21164
+ (minus:SI (neg:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0)))
21165
+ (match_operand:SI 1 "register_operand" "r"))))]
21168
+ [(set_attr "v8type" "adc")
21169
+ (set_attr "mode" "SI")]
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")]
21179
+(define_insn "*neg_<shift><mode>3_compare0"
21180
+ [(set (reg:CC_NZ CC_REGNUM)
21182
+ (neg:GPI (ASHIFT:GPI
21183
+ (match_operand:GPI 1 "register_operand" "r")
21184
+ (match_operand:QI 2 "aarch64_shift_imm_<mode>" "n")))
21186
+ (set (match_operand:GPI 0 "register_operand" "=r")
21187
+ (neg:GPI (ASHIFT:GPI (match_dup 1) (match_dup 2))))]
21189
+ "negs\\t%<w>0, %<w>1, <shift> %2"
21190
+ [(set_attr "v8type" "alus_shift")
21191
+ (set_attr "mode" "<MODE>")]
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>")]
21201
+(define_insn "*cmp_swp_<optab><ALLX:mode>_shft_<GPI:mode>"
21202
+ [(set (reg:CC_SWP CC_REGNUM)
21203
+ (compare:CC_SWP (ashift:GPI
21205
+ (match_operand:ALLX 0 "register_operand" "r"))
21206
+ (match_operand 1 "aarch64_imm3" "Ui3"))
21207
+ (match_operand:GPI 2 "register_operand" "r")))]
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>")]
21214
;; -------------------------------------------------------------------
21215
;; Store-flag and conditional select insns
21216
@@ -2211,7 +2469,7 @@
21217
(set_attr "mode" "SI")]
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")])
21229
+(define_insn "*and<mode>3_compare0"
21230
+ [(set (reg:CC_NZ CC_REGNUM)
21232
+ (and:GPI (match_operand:GPI 1 "register_operand" "%r,r")
21233
+ (match_operand:GPI 2 "aarch64_logical_operand" "r,<lconst>"))
21235
+ (set (match_operand:GPI 0 "register_operand" "=r,r")
21236
+ (and:GPI (match_dup 1) (match_dup 2)))]
21238
+ "ands\\t%<w>0, %<w>1, %<w>2"
21239
+ [(set_attr "v8type" "logics,logics_imm")
21240
+ (set_attr "mode" "<MODE>")]
21243
+;; zero_extend version of above
21244
+(define_insn "*andsi3_compare0_uxtw"
21245
+ [(set (reg:CC_NZ CC_REGNUM)
21247
+ (and:SI (match_operand:SI 1 "register_operand" "%r,r")
21248
+ (match_operand:SI 2 "aarch64_logical_operand" "r,K"))
21250
+ (set (match_operand:DI 0 "register_operand" "=r,r")
21251
+ (zero_extend:DI (and:SI (match_dup 1) (match_dup 2))))]
21253
+ "ands\\t%w0, %w1, %w2"
21254
+ [(set_attr "v8type" "logics,logics_imm")
21255
+ (set_attr "mode" "SI")]
21258
+(define_insn "*and_<SHIFT:optab><mode>3_compare0"
21259
+ [(set (reg:CC_NZ CC_REGNUM)
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"))
21266
+ (set (match_operand:GPI 0 "register_operand" "=r")
21267
+ (and:GPI (SHIFT:GPI (match_dup 1) (match_dup 2)) (match_dup 3)))]
21269
+ "ands\\t%<w>0, %<w>3, %<w>1, <SHIFT:shift> %2"
21270
+ [(set_attr "v8type" "logics_shift")
21271
+ (set_attr "mode" "<MODE>")]
21274
+;; zero_extend version of above
21275
+(define_insn "*and_<SHIFT:optab>si3_compare0_uxtw"
21276
+ [(set (reg:CC_NZ CC_REGNUM)
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"))
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))))]
21287
+ "ands\\t%w0, %w3, %w1, <SHIFT:shift> %2"
21288
+ [(set_attr "v8type" "logics_shift")
21289
+ (set_attr "mode" "SI")]
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>")])
21299
+(define_insn "*and_one_cmpl<mode>3_compare0"
21300
+ [(set (reg:CC_NZ CC_REGNUM)
21302
+ (and:GPI (not:GPI
21303
+ (match_operand:GPI 1 "register_operand" "r"))
21304
+ (match_operand:GPI 2 "register_operand" "r"))
21306
+ (set (match_operand:GPI 0 "register_operand" "=r")
21307
+ (and:GPI (not:GPI (match_dup 1)) (match_dup 2)))]
21309
+ "bics\\t%<w>0, %<w>2, %<w>1"
21310
+ [(set_attr "v8type" "logics")
21311
+ (set_attr "mode" "<MODE>")])
21313
+;; zero_extend version of above
21314
+(define_insn "*and_one_cmplsi3_compare0_uxtw"
21315
+ [(set (reg:CC_NZ CC_REGNUM)
21318
+ (match_operand:SI 1 "register_operand" "r"))
21319
+ (match_operand:SI 2 "register_operand" "r"))
21321
+ (set (match_operand:DI 0 "register_operand" "=r")
21322
+ (zero_extend:DI (and:SI (not:SI (match_dup 1)) (match_dup 2))))]
21324
+ "bics\\t%w0, %w2, %w1"
21325
+ [(set_attr "v8type" "logics")
21326
+ (set_attr "mode" "SI")])
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>")])
21335
+(define_insn "*and_one_cmpl_<SHIFT:optab><mode>3_compare0"
21336
+ [(set (reg:CC_NZ CC_REGNUM)
21338
+ (and:GPI (not: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"))
21344
+ (set (match_operand:GPI 0 "register_operand" "=r")
21345
+ (and:GPI (not:GPI
21347
+ (match_dup 1) (match_dup 2))) (match_dup 3)))]
21349
+ "bics\\t%<w>0, %<w>3, %<w>1, <SHIFT:shift> %2"
21350
+ [(set_attr "v8type" "logics_shift")
21351
+ (set_attr "mode" "<MODE>")])
21353
+;; zero_extend version of above
21354
+(define_insn "*and_one_cmpl_<SHIFT:optab>si3_compare0_uxtw"
21355
+ [(set (reg:CC_NZ CC_REGNUM)
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"))
21363
+ (set (match_operand:DI 0 "register_operand" "=r")
21364
+ (zero_extend:DI (and:SI
21366
+ (SHIFT:SI (match_dup 1) (match_dup 2))) (match_dup 3))))]
21368
+ "bics\\t%w0, %w3, %w1, <SHIFT:shift> %2"
21369
+ [(set_attr "v8type" "logics_shift")
21370
+ (set_attr "mode" "SI")])
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>")]
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>")]
21392
+;; zero_extend version of the above
21393
+(define_insn "*extrsi5_insn_uxtw"
21394
+ [(set (match_operand:DI 0 "register_operand" "=r")
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")]
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)"
21413
+ operands[3] = GEN_INT (<sizen> - UINTVAL (operands[2]));
21414
+ return "ror\\t%<w>0, %<w>1, %3";
21416
+ [(set_attr "v8type" "shift")
21417
+ (set_attr "mode" "<MODE>")]
21420
+;; zero_extend version of the above
21421
+(define_insn "*rorsi3_insn_uxtw"
21422
+ [(set (match_operand:DI 0 "register_operand" "=r")
21424
+ (rotate:SI (match_operand:SI 1 "register_operand" "r")
21425
+ (match_operand 2 "const_int_operand" "n"))))]
21426
+ "UINTVAL (operands[2]) < 32"
21428
+ operands[3] = GEN_INT (32 - UINTVAL (operands[2]));
21429
+ return "ror\\t%w0, %w1, %3";
21431
+ [(set_attr "v8type" "shift")
21432
+ (set_attr "mode" "SI")]
21435
(define_insn "*<ANY_EXTEND:optab><GPI:mode>_ashl<SHORT:mode>"
21436
[(set (match_operand:GPI 0 "register_operand" "=r")
21438
@@ -2770,6 +3213,65 @@
21439
(set_attr "mode" "<MODE>")]
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"))]
21450
+ unsigned HOST_WIDE_INT width = UINTVAL (operands[1]);
21451
+ unsigned HOST_WIDE_INT pos = UINTVAL (operands[2]);
21452
+ rtx value = operands[3];
21454
+ if (width == 0 || (pos + width) > GET_MODE_BITSIZE (<MODE>mode))
21457
+ if (CONST_INT_P (value))
21459
+ unsigned HOST_WIDE_INT mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
21461
+ /* Prefer AND/OR for inserting all zeros or all ones. */
21462
+ if ((UINTVAL (value) & mask) == 0
21463
+ || (UINTVAL (value) & mask) == mask)
21466
+ /* 16-bit aligned 16-bit wide insert is handled by insv_imm. */
21467
+ if (width == 16 && (pos % 16) == 0)
21470
+ operands[3] = force_reg (<MODE>mode, value);
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>")]
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")
21490
+ (zero_extract:GPI (match_operand:GPI 2 "register_operand" "+r")
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>")]
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>")]
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")]
21513
+ "frecp<FRECP:frecp_suffix>\\t%<s>0, %<s>1"
21514
+ [(set_attr "v8type" "frecp<FRECP:frecp_suffix>")
21515
+ (set_attr "mode" "<MODE>")]
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")]
21524
+ "frecps\\t%<s>0, %<s>1, %<s>2"
21525
+ [(set_attr "v8type" "frecps")
21526
+ (set_attr "mode" "<MODE>")]
21529
;; -------------------------------------------------------------------
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.
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"
21543
[(set_attr "v8type" "fmovf2i")
21544
@@ -3156,10 +3679,10 @@
21545
(set_attr "length" "4")
21548
-(define_insn "aarch64_movdi_tihigh"
21549
+(define_insn "aarch64_movdi_<mode>high"
21550
[(set (match_operand:DI 0 "register_operand" "=r")
21552
- (lshiftrt:TI (match_operand:TI 1 "register_operand" "w")
21553
+ (lshiftrt:TX (match_operand:TX 1 "register_operand" "w")
21555
"reload_completed || reload_in_progress"
21556
"fmov\\t%x0, %1.d[1]"
21557
@@ -3168,24 +3691,22 @@
21558
(set_attr "length" "4")
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"
21571
[(set_attr "v8type" "fmovi2f")
21572
(set_attr "mode" "DI")
21573
(set_attr "length" "4")
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"
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"
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
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
21606
#include "langhooks.h"
21607
#include "diagnostic-core.h"
21608
#include "optabs.h"
21609
+#include "gimple.h"
21611
enum aarch64_simd_builtin_type_mode
21625
+#define sf_UP T_SF
21629
@@ -128,123 +131,136 @@
21630
unsigned int fcode;
21631
} aarch64_simd_builtin_datum;
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
21641
-#define VAR1(T, N, A) \
21642
- {#N, AARCH64_SIMD_##T, UP (A), CF (N, A), 0},
21643
-#define VAR2(T, N, A, B) \
21646
-#define VAR3(T, N, A, B, C) \
21647
- VAR2 (T, N, A, B) \
21649
-#define VAR4(T, N, A, B, C, D) \
21650
- VAR3 (T, N, A, B, C) \
21652
-#define VAR5(T, N, A, B, C, D, E) \
21653
- VAR4 (T, N, A, B, C, D) \
21655
-#define VAR6(T, N, A, B, C, D, E, F) \
21656
- VAR5 (T, N, A, B, C, D, E) \
21658
-#define VAR7(T, N, A, B, C, D, E, F, G) \
21659
- VAR6 (T, N, A, B, C, D, E, F) \
21661
-#define VAR8(T, N, A, B, C, D, E, F, G, H) \
21662
- VAR7 (T, N, A, B, C, D, E, F, G) \
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) \
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) \
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) \
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) \
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)
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. */
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)
21861
static aarch64_simd_builtin_datum aarch64_simd_builtin_data[] = {
21862
#include "aarch64-simd-builtins.def"
21866
-#define VAR1(T, N, A) \
21867
+#define VAR1(T, N, MAP, A) \
21868
AARCH64_SIMD_BUILTIN_##N##A,
21870
enum aarch64_builtins
21871
@@ -257,53 +273,6 @@
21872
AARCH64_BUILTIN_MAX
21876
-#undef BUILTIN_SDQ_I
21877
-#undef BUILTIN_SD_HSI
21878
-#undef BUILTIN_V2F
21879
-#undef BUILTIN_VALL
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
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
21922
static GTY(()) tree aarch64_builtin_decls[AARCH64_BUILTIN_MAX];
21924
#define NUM_DREG_TYPES 6
21925
@@ -609,7 +578,7 @@
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"
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:
21965
+ if (AARCH64_CHECK_BUILTIN_MODE (4, S))
21966
+ return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_clzv4si];
21967
+ return NULL_TREE;
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:
21977
+ tree new_tree = NULL_TREE;
21978
+ if (AARCH64_CHECK_BUILTIN_MODE (2, D))
21980
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv2dfv2di];
21981
+ else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
21983
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv4sfv4si];
21984
+ else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
21986
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lfloorv2sfv2si];
21989
case BUILT_IN_LCEIL:
21990
- return AARCH64_FIND_FRINT_VARIANT (fcvtps);
21991
+ case BUILT_IN_ICEILF:
21993
+ tree new_tree = NULL_TREE;
21994
+ if (AARCH64_CHECK_BUILTIN_MODE (2, D))
21996
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv2dfv2di];
21997
+ else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
21999
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv4sfv4si];
22000
+ else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
22002
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lceilv2sfv2si];
22005
+ case BUILT_IN_LROUND:
22006
+ case BUILT_IN_IROUNDF:
22008
+ tree new_tree = NULL_TREE;
22009
+ if (AARCH64_CHECK_BUILTIN_MODE (2, D))
22011
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2dfv2di];
22012
+ else if (AARCH64_CHECK_BUILTIN_MODE (4, S))
22014
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv4sfv4si];
22015
+ else if (AARCH64_CHECK_BUILTIN_MODE (2, S))
22017
+ aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_lroundv2sfv2si];
22024
@@ -1290,5 +1311,160 @@
22030
+#define VAR1(T, N, MAP, A) \
22031
+ case AARCH64_SIMD_BUILTIN_##N##A:
22034
+aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args,
22035
+ bool ignore ATTRIBUTE_UNUSED)
22037
+ int fcode = DECL_FUNCTION_CODE (fndecl);
22038
+ tree type = TREE_TYPE (TREE_TYPE (fndecl));
22042
+ BUILTIN_VALLDI (UNOP, abs, 2)
22043
+ return fold_build1 (ABS_EXPR, type, args[0]);
22045
+ BUILTIN_VALLDI (BINOP, cmge, 0)
22046
+ return fold_build2 (GE_EXPR, type, args[0], args[1]);
22048
+ BUILTIN_VALLDI (BINOP, cmgt, 0)
22049
+ return fold_build2 (GT_EXPR, type, args[0], args[1]);
22051
+ BUILTIN_VALLDI (BINOP, cmeq, 0)
22052
+ return fold_build2 (EQ_EXPR, type, args[0], args[1]);
22054
+ BUILTIN_VSDQ_I_DI (BINOP, cmtst, 0)
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);
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]);
22069
+ return NULL_TREE;
22073
+aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi)
22075
+ bool changed = false;
22076
+ gimple stmt = gsi_stmt (*gsi);
22077
+ tree call = gimple_call_fn (stmt);
22079
+ gimple new_stmt = NULL;
22082
+ fndecl = gimple_call_fndecl (stmt);
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);
22093
+ BUILTIN_VALL (UNOP, reduc_splus_, 10)
22094
+ new_stmt = gimple_build_assign_with_ops (
22096
+ gimple_call_lhs (stmt),
22100
+ BUILTIN_VDQIF (UNOP, reduc_smax_, 10)
22101
+ new_stmt = gimple_build_assign_with_ops (
22103
+ gimple_call_lhs (stmt),
22107
+ BUILTIN_VDQIF (UNOP, reduc_smin_, 10)
22108
+ new_stmt = gimple_build_assign_with_ops (
22110
+ gimple_call_lhs (stmt),
22123
+ gsi_replace (gsi, new_stmt, true);
22130
#undef AARCH64_CHECK_BUILTIN_MODE
22131
#undef AARCH64_FIND_FRINT_VARIANT
22133
+#undef BUILTIN_SDQ_I
22134
+#undef BUILTIN_SD_HSI
22135
+#undef BUILTIN_V2F
22136
+#undef BUILTIN_VALL
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
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
22185
--- a/src/gcc/config/aarch64/aarch64-protos.h
22186
+++ b/src/gcc/config/aarch64/aarch64-protos.h
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.
22191
+ SYMBOL_TINY_ABSOLUTE
22193
+ Generate symbol accesses as a PC relative address using a single
22194
+ instruction. To compute the address of symbol foo, we generate:
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
22202
SYMBOL_SMALL_TLSDESC,
22203
SYMBOL_SMALL_GOTTPREL,
22204
SYMBOL_SMALL_TPREL,
22205
+ SYMBOL_TINY_ABSOLUTE,
22206
SYMBOL_FORCE_TO_MEM
22209
@@ -126,35 +134,66 @@
22213
+/* Cost for vector insn classes. */
22214
+struct cpu_vector_cost
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
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. */
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;
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 *,
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 @@
22298
bool aarch64_split_128bit_move_p (rtx, rtx);
22300
+void aarch64_split_simd_combine (rtx, rtx, rtx);
22302
+void aarch64_split_simd_move (rtx, rtx);
22304
/* Check for a legitimate floating point constant for FMOV. */
22305
bool aarch64_float_const_representable_p (rtx);
22307
@@ -249,6 +290,4 @@
22308
extern void aarch64_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
22310
aarch64_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
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/>. */
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
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.
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.
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>. */
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)
22378
+ BUILTIN_VALL (GETLANE, get_lane, 0)
22379
+ VAR1 (GETLANE, get_lane, 0, di)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
22755
+ VAR1 (UNOP, lbtruncuv2sf, 2, v2si)
22756
+ VAR1 (UNOP, lbtruncuv4sf, 2, v4si)
22757
+ VAR1 (UNOP, lbtruncuv2df, 2, v2di)
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)
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)
22772
+ VAR1 (UNOP, lceilv2sf, 2, v2si)
22773
+ VAR1 (UNOP, lceilv4sf, 2, v4si)
22774
+ VAR1 (UNOP, lceilv2df, 2, v2di)
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)
22782
+ VAR1 (UNOP, lfloorv2sf, 2, v2si)
22783
+ VAR1 (UNOP, lfloorv4sf, 2, v4si)
22784
+ VAR1 (UNOP, lfloorv2df, 2, v2di)
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)
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)
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)
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)
22809
+ VAR1 (UNOP, floatunsv2si, 2, v2sf)
22810
+ VAR1 (UNOP, floatunsv4si, 2, v4sf)
22811
+ VAR1 (UNOP, floatunsv2di, 2, v2df)
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)
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)
22834
+ BUILTIN_VDQF (UNOP, frecpe, 0)
22835
+ BUILTIN_VDQF (BINOP, frecps, 0)
22837
+ BUILTIN_VALLDI (UNOP, abs, 2)
22839
+ VAR1 (UNOP, vec_unpacks_hi_, 10, v4sf)
22840
+ VAR1 (BINOP, float_truncate_hi_, 0, v4sf)
22842
+ VAR1 (UNOP, float_extend_lo_, 0, v2df)
22843
+ VAR1 (UNOP, float_truncate_lo_, 0, v2sf)
22845
/* Implemented by aarch64_ld1<VALL:mode>. */
22846
- BUILTIN_VALL (LOAD1, ld1)
22847
+ BUILTIN_VALL (LOAD1, ld1, 0)
22849
/* Implemented by aarch64_st1<VALL:mode>. */
22850
- BUILTIN_VALL (STORE1, st1)
22851
+ BUILTIN_VALL (STORE1, st1, 0)
22853
--- a/src/gcc/config/aarch64/constraints.md
22854
+++ b/src/gcc/config/aarch64/constraints.md
22856
"Integer constant zero."
22857
(match_test "op == const0_rtx"))
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)")))
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 @@
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),
22877
+(define_constraint "Dh"
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,
22885
+(define_constraint "Dq"
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,
22893
(define_constraint "Dl"
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
22899
#include "gimple.h"
22900
#include "optabs.h"
22901
#include "dwarf2.h"
22902
+#include "cfgloop.h"
22903
+#include "tree-vectorizer.h"
22905
/* Classifies an address.
22908
enum aarch64_symbol_type symbol_type;
22911
+struct simd_immediate_info
22915
+ int element_width;
22920
/* The current code model. */
22921
enum aarch64_code_model aarch64_cmodel;
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)
22936
+/* Generic costs for vector insn classes. */
22937
#if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007
22940
+static const struct cpu_vector_cost generic_vector_cost =
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)
22956
+#if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007
22959
static const struct tune_params generic_tunings =
22961
&generic_rtx_cost_table,
22962
&generic_addrcost_table,
22963
&generic_regmove_cost,
22964
+ &generic_vector_cost,
22965
NAMED_PARAM (memmov_cost, 4)
22968
@@ -524,13 +554,15 @@
22972
+ case SYMBOL_TINY_ABSOLUTE:
22973
+ emit_insn (gen_rtx_SET (Pmode, dest, imm));
22976
case SYMBOL_SMALL_GOT:
22978
rtx tmp_reg = dest;
22979
if (can_create_pseudo_p ())
22981
- tmp_reg = gen_reg_rtx (Pmode);
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));
22987
@@ -604,49 +636,85 @@
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);
22997
+ gcc_assert (dst_mode == TImode || dst_mode == TFmode);
22999
if (REG_P (dst) && REG_P (src))
23001
- int src_regno = REGNO (src);
23002
- int dst_regno = REGNO (dst);
23003
+ gcc_assert (src_mode == TImode || src_mode == TFmode);
23005
- gcc_assert (GET_MODE (src) == TImode);
23007
/* Handle r -> w, w -> r. */
23008
if (FP_REGNUM_P (dst_regno) && GP_REGNUM_P (src_regno))
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)));
23015
+ switch (src_mode) {
23018
+ (gen_aarch64_movtilow_di (dst, gen_lowpart (word_mode, src)));
23020
+ (gen_aarch64_movtihigh_di (dst, gen_highpart (word_mode, src)));
23024
+ (gen_aarch64_movtflow_di (dst, gen_lowpart (word_mode, src)));
23026
+ (gen_aarch64_movtfhigh_di (dst, gen_highpart (word_mode, src)));
23029
+ gcc_unreachable ();
23032
else if (GP_REGNUM_P (dst_regno) && FP_REGNUM_P (src_regno))
23034
- emit_insn (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst),
23036
- emit_insn (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst),
23039
+ switch (src_mode) {
23042
+ (gen_aarch64_movdi_tilow (gen_lowpart (word_mode, dst), src));
23044
+ (gen_aarch64_movdi_tihigh (gen_highpart (word_mode, dst), src));
23048
+ (gen_aarch64_movdi_tflow (gen_lowpart (word_mode, dst), src));
23050
+ (gen_aarch64_movdi_tfhigh (gen_highpart (word_mode, dst), src));
23053
+ gcc_unreachable ();
23056
/* Fall through to r -> r cases. */
23059
- low_dst = gen_lowpart (word_mode, dst);
23060
- if (REG_P (low_dst)
23061
- && reg_overlap_mentioned_p (low_dst, src))
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));
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));
23073
+ switch (dst_mode) {
23075
+ low_dst = gen_lowpart (word_mode, dst);
23076
+ if (REG_P (low_dst)
23077
+ && reg_overlap_mentioned_p (low_dst, src))
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));
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));
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));
23097
+ gcc_unreachable ();
23102
@@ -656,11 +724,99 @@
23103
|| ! (FP_REGNUM_P (REGNO (dst)) && FP_REGNUM_P (REGNO (src))));
23106
+/* Split a complex SIMD combine. */
23109
+aarch64_split_simd_combine (rtx dst, rtx src1, rtx src2)
23111
+ enum machine_mode src_mode = GET_MODE (src1);
23112
+ enum machine_mode dst_mode = GET_MODE (dst);
23114
+ gcc_assert (VECTOR_MODE_P (dst_mode));
23116
+ if (REG_P (dst) && REG_P (src1) && REG_P (src2))
23118
+ rtx (*gen) (rtx, rtx, rtx);
23120
+ switch (src_mode)
23123
+ gen = gen_aarch64_simd_combinev8qi;
23126
+ gen = gen_aarch64_simd_combinev4hi;
23129
+ gen = gen_aarch64_simd_combinev2si;
23132
+ gen = gen_aarch64_simd_combinev2sf;
23135
+ gen = gen_aarch64_simd_combinedi;
23138
+ gen = gen_aarch64_simd_combinedf;
23141
+ gcc_unreachable ();
23144
+ emit_insn (gen (dst, src1, src2));
23149
+/* Split a complex SIMD move. */
23152
+aarch64_split_simd_move (rtx dst, rtx src)
23154
+ enum machine_mode src_mode = GET_MODE (src);
23155
+ enum machine_mode dst_mode = GET_MODE (dst);
23157
+ gcc_assert (VECTOR_MODE_P (dst_mode));
23159
+ if (REG_P (dst) && REG_P (src))
23161
+ rtx (*gen) (rtx, rtx);
23163
+ gcc_assert (VECTOR_MODE_P (src_mode));
23165
+ switch (src_mode)
23168
+ gen = gen_aarch64_split_simd_movv16qi;
23171
+ gen = gen_aarch64_split_simd_movv8hi;
23174
+ gen = gen_aarch64_split_simd_movv4si;
23177
+ gen = gen_aarch64_split_simd_movv2di;
23180
+ gen = gen_aarch64_split_simd_movv4sf;
23183
+ gen = gen_aarch64_split_simd_movv2df;
23186
+ gcc_unreachable ();
23189
+ emit_insn (gen (dst, src));
23195
-aarch64_force_temporary (rtx x, rtx value)
23196
+aarch64_force_temporary (enum machine_mode mode, rtx x, rtx value)
23198
if (can_create_pseudo_p ())
23199
- return force_reg (Pmode, value);
23200
+ return force_reg (mode, value);
23203
x = aarch64_emit_move (x, value);
23204
@@ -672,15 +828,16 @@
23206
aarch64_add_offset (enum machine_mode mode, rtx temp, rtx reg, HOST_WIDE_INT offset)
23208
- if (!aarch64_plus_immediate (GEN_INT (offset), DImode))
23209
+ if (!aarch64_plus_immediate (GEN_INT (offset), mode))
23212
/* Load the full offset into a register. This
23213
might be improvable in the future. */
23214
high = GEN_INT (offset);
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));
23222
return plus_constant (mode, reg, offset);
23224
@@ -719,7 +876,7 @@
23225
&& targetm.cannot_force_const_mem (mode, imm))
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);
23233
@@ -736,7 +893,7 @@
23234
if (offset != const0_rtx)
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);
23242
@@ -745,6 +902,7 @@
23244
case SYMBOL_SMALL_TPREL:
23245
case SYMBOL_SMALL_ABSOLUTE:
23246
+ case SYMBOL_TINY_ABSOLUTE:
23247
aarch64_load_symref_appropriately (dest, imm, sty);
23250
@@ -2553,12 +2711,14 @@
23251
aarch64_cannot_force_const_mem (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
23255
if (GET_CODE (x) == HIGH)
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);
23264
return aarch64_tls_referenced_p (x);
23266
@@ -2996,10 +3156,13 @@
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)
23273
+enum aarch64_symbol_type
23274
+aarch64_classify_symbolic_expression (rtx x,
23275
+ enum aarch64_symbol_context context)
23279
split_const (x, &x, &offset);
23280
return aarch64_classify_symbol (x, context);
23282
@@ -3087,17 +3250,19 @@
23283
if ((GET_MODE (x) == SImode || GET_MODE (x) == DImode)
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))
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
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))
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]);
23310
- /* Print the least significant register of a pair (TImode) of regs. */
23311
- if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1))
23313
- output_operand_lossage ("invalid operand for '%%%c'", code);
23316
- asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 1 : 0)]);
23320
- /* Print the most significant register of a pair (TImode) of regs. */
23321
- if (GET_CODE (x) != REG || !GP_REGNUM_P (REGNO (x) + 1))
23323
- output_operand_lossage ("invalid operand for '%%%c'", code);
23326
- asm_fprintf (f, "%s", reg_names [REGNO (x) + (WORDS_BIG_ENDIAN ? 0 : 1)]);
23330
/* Print a condition (eq, ne, etc). */
23332
@@ -3349,7 +3494,7 @@
23333
output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code);
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);
23341
@@ -3362,18 +3507,17 @@
23342
output_operand_lossage ("incompatible floating point / vector register operand for '%%%c'", code);
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'));
23351
- /* Print integer constant in hex. */
23352
+ /* Print bottom 16 bits of integer constant in hex. */
23353
if (GET_CODE (x) != CONST_INT)
23355
output_operand_lossage ("invalid operand for '%%%c'", code);
23358
- asm_fprintf (f, "0x%wx", UINTVAL (x));
23359
+ asm_fprintf (f, "0x%wx", UINTVAL (x) & 0xffff);
23363
@@ -3383,20 +3527,19 @@
23364
if (x == const0_rtx
23365
|| (CONST_DOUBLE_P (x) && aarch64_float_const_zero_rtx_p (x)))
23367
- asm_fprintf (f, "%s%czr", REGISTER_PREFIX, code);
23368
+ asm_fprintf (f, "%czr", code);
23372
if (REG_P (x) && GP_REGNUM_P (REGNO (x)))
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);
23380
if (REG_P (x) && REGNO (x) == SP_REGNUM)
23382
- asm_fprintf (f, "%s%ssp", REGISTER_PREFIX, code == 'w' ? "w" : "");
23383
+ asm_fprintf (f, "%ssp", code == 'w' ? "w" : "");
23387
@@ -3647,13 +3790,6 @@
23388
output_addr_const (f, x);
23392
-aarch64_function_profiler (FILE *f ATTRIBUTE_UNUSED,
23393
- int labelno ATTRIBUTE_UNUSED)
23395
- sorry ("function profiling");
23399
aarch64_label_mentioned_p (rtx x)
23401
@@ -4601,6 +4737,101 @@
23402
return aarch64_tune_params->memmov_cost;
23405
+/* Vectorizer cost model target hooks. */
23407
+/* Implement targetm.vectorize.builtin_vectorization_cost. */
23409
+aarch64_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
23411
+ int misalign ATTRIBUTE_UNUSED)
23413
+ unsigned elements;
23415
+ switch (type_of_cost)
23417
+ case scalar_stmt:
23418
+ return aarch64_tune_params->vec_costs->scalar_stmt_cost;
23420
+ case scalar_load:
23421
+ return aarch64_tune_params->vec_costs->scalar_load_cost;
23423
+ case scalar_store:
23424
+ return aarch64_tune_params->vec_costs->scalar_store_cost;
23426
+ case vector_stmt:
23427
+ return aarch64_tune_params->vec_costs->vec_stmt_cost;
23429
+ case vector_load:
23430
+ return aarch64_tune_params->vec_costs->vec_align_load_cost;
23432
+ case vector_store:
23433
+ return aarch64_tune_params->vec_costs->vec_store_cost;
23435
+ case vec_to_scalar:
23436
+ return aarch64_tune_params->vec_costs->vec_to_scalar_cost;
23438
+ case scalar_to_vec:
23439
+ return aarch64_tune_params->vec_costs->scalar_to_vec_cost;
23441
+ case unaligned_load:
23442
+ return aarch64_tune_params->vec_costs->vec_unalign_load_cost;
23444
+ case unaligned_store:
23445
+ return aarch64_tune_params->vec_costs->vec_unalign_store_cost;
23447
+ case cond_branch_taken:
23448
+ return aarch64_tune_params->vec_costs->cond_taken_branch_cost;
23450
+ case cond_branch_not_taken:
23451
+ return aarch64_tune_params->vec_costs->cond_not_taken_branch_cost;
23454
+ case vec_promote_demote:
23455
+ return aarch64_tune_params->vec_costs->vec_stmt_cost;
23457
+ case vec_construct:
23458
+ elements = TYPE_VECTOR_SUBPARTS (vectype);
23459
+ return elements / 2 + 1;
23462
+ gcc_unreachable ();
23466
+/* Implement targetm.vectorize.add_stmt_cost. */
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)
23472
+ unsigned *cost = (unsigned *) data;
23473
+ unsigned retval = 0;
23475
+ if (flag_vect_cost_model)
23477
+ tree vectype = stmt_info ? stmt_vectype (stmt_info) : NULL_TREE;
23479
+ aarch64_builtin_vectorization_cost (kind, vectype, misalign);
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))
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);
23490
+ count *= nest_level;
23493
+ retval = (unsigned) (count * stmt_cost);
23494
+ cost[where] += retval;
23500
static void initialize_aarch64_code_model (void);
23502
/* Parse the architecture extension string. */
23503
@@ -4956,6 +5187,7 @@
23505
/* Return the method that should be used to access SYMBOL_REF or
23506
LABEL_REF X in context CONTEXT. */
23508
enum aarch64_symbol_type
23509
aarch64_classify_symbol (rtx x,
23510
enum aarch64_symbol_context context ATTRIBUTE_UNUSED)
23511
@@ -4969,6 +5201,8 @@
23513
case AARCH64_CMODEL_TINY_PIC:
23514
case AARCH64_CMODEL_TINY:
23515
+ return SYMBOL_TINY_ABSOLUTE;
23517
case AARCH64_CMODEL_SMALL_PIC:
23518
case AARCH64_CMODEL_SMALL:
23519
return SYMBOL_SMALL_ABSOLUTE;
23520
@@ -4978,71 +5212,47 @@
23524
- gcc_assert (GET_CODE (x) == SYMBOL_REF);
23526
- switch (aarch64_cmodel)
23527
+ if (GET_CODE (x) == SYMBOL_REF)
23529
- case AARCH64_CMODEL_LARGE:
23530
- return SYMBOL_FORCE_TO_MEM;
23532
- case AARCH64_CMODEL_TINY:
23533
- case AARCH64_CMODEL_SMALL:
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;
23544
if (aarch64_tls_symbol_p (x))
23545
return aarch64_classify_tls_symbol (x);
23547
- if (SYMBOL_REF_WEAK (x))
23548
- return SYMBOL_FORCE_TO_MEM;
23549
+ switch (aarch64_cmodel)
23551
+ case AARCH64_CMODEL_TINY:
23552
+ if (SYMBOL_REF_WEAK (x))
23553
+ return SYMBOL_FORCE_TO_MEM;
23554
+ return SYMBOL_TINY_ABSOLUTE;
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;
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;
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;
23576
- if (aarch64_tls_symbol_p (x))
23577
- return aarch64_classify_tls_symbol (x);
23579
+ gcc_unreachable ();
23583
- if (!aarch64_symbol_binds_local_p (x))
23584
- return SYMBOL_SMALL_GOT;
23586
- return SYMBOL_SMALL_ABSOLUTE;
23589
- gcc_unreachable ();
23591
/* By default push everything into the constant pool. */
23592
return SYMBOL_FORCE_TO_MEM;
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. */
23599
-aarch64_symbolic_constant_p (rtx x, enum aarch64_symbol_context context,
23600
- enum aarch64_symbol_type *symbol_type)
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);
23609
- /* No checking of offset at this point. */
23614
aarch64_constant_address_p (rtx x)
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);
23627
@@ -5924,32 +6133,57 @@
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)
23638
+ gcc_assert (width == 64 || width == 128);
23651
- return V16QImode;
23659
+ if (width == 128)
23671
+ return V16QImode;
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)
23699
+ return aarch64_simd_container_mode (mode, 128);
23702
/* Return the bitmask of possible vector sizes for the vectorizer
23703
to iterate over. */
23704
static unsigned int
23705
@@ -6037,7 +6271,7 @@
23708
/* Return the equivalent letter for size. */
23709
-static unsigned char
23711
sizetochar (int size)
23714
@@ -6084,15 +6318,10 @@
23715
return aarch64_float_const_representable_p (x0);
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. */
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. */
23729
+aarch64_simd_valid_immediate (rtx op, enum machine_mode mode, bool inverse,
23730
+ struct simd_immediate_info *info)
23732
#define CHECK(STRIDE, ELSIZE, CLASS, TEST, SHIFT, NEG) \
23734
@@ -6103,7 +6332,6 @@
23736
immtype = (CLASS); \
23737
elsize = (ELSIZE); \
23738
- elchar = sizetochar (elsize); \
23739
eshift = (SHIFT); \
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;
23751
if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
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)))
23759
- if (!(simd_imm_zero
23760
- || aarch64_vect_float_const_representable_p (op)))
23764
+ info->value = CONST_VECTOR_ELT (op, 0);
23765
+ info->element_width = GET_MODE_BITSIZE (GET_MODE (info->value));
23766
+ info->mvn = false;
23771
- *modconst = CONST_VECTOR_ELT (op, 0);
23773
- if (elementwidth)
23774
- *elementwidth = elem_width;
23777
- *elementchar = sizetochar (elem_width);
23782
- if (simd_imm_zero)
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);
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);
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);
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);
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);
23809
CHECK (1, 8, 16, bytes[i] == bytes[0], 0, 0);
23811
@@ -6233,31 +6450,20 @@
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)
23822
+ if (immtype == -1)
23827
+ info->element_width = elsize;
23828
+ info->mvn = emvn != 0;
23829
+ info->shift = eshift;
23831
- if (elementwidth)
23832
- *elementwidth = elsize;
23833
+ unsigned HOST_WIDE_INT imm = 0;
23836
- *elementchar = elchar;
23837
+ if (immtype >= 12 && immtype <= 15)
23838
+ info->msl = true;
23848
- unsigned HOST_WIDE_INT imm = 0;
23850
/* Un-invert bytes of recognized vector, if necessary. */
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);
23857
- *modconst = GEN_INT (imm);
23860
+ info->value = GEN_INT (imm);
23864
- unsigned HOST_WIDE_INT imm = 0;
23866
+ for (i = 0; i < elsize / BITS_PER_UNIT; i++)
23867
+ imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT);
23869
- for (i = 0; i < elsize / BITS_PER_UNIT; i++)
23870
- imm |= (unsigned HOST_WIDE_INT) bytes[i] << (i * BITS_PER_UNIT);
23872
/* Construct 'abcdefgh' because the assembler cannot handle
23873
- generic constants. */
23874
- gcc_assert (shift != NULL && mvn != NULL);
23876
+ generic constants. */
23879
- imm = (imm >> *shift) & 0xff;
23880
- *modconst = GEN_INT (imm);
23882
+ imm = (imm >> info->shift) & 0xff;
23883
+ info->value = GEN_INT (imm);
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. */
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)
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);
23910
- if (retval == -1)
23914
- *modconst = tmpconst;
23916
- if (elementwidth)
23917
- *elementwidth = tmpwidth;
23920
- *elementchar = tmpwidthc;
23926
- *shift = tmpshift;
23932
aarch64_const_vec_all_same_int_p (rtx x,
23933
HOST_WIDE_INT minval,
23934
@@ -6395,6 +6560,25 @@
23939
+aarch64_mov_operand_p (rtx x,
23940
+ enum aarch64_symbol_context context,
23941
+ enum machine_mode mode)
23943
+ if (GET_CODE (x) == HIGH
23944
+ && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
23947
+ if (CONST_INT_P (x) && aarch64_move_imm (INTVAL (x), mode))
23950
+ if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
23953
+ return aarch64_classify_symbolic_expression (x, context)
23954
+ == SYMBOL_TINY_ABSOLUTE;
23957
/* Return a const_int vector of VAL. */
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);
23964
+/* Check OP is a legal scalar immediate for the MOVI instruction. */
23967
+aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode)
23969
+ enum machine_mode vmode;
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);
23977
/* Construct and return a PARALLEL RTX vector. */
23979
aarch64_simd_vect_par_cnst_half (enum machine_mode mode, bool high)
23980
@@ -6634,8 +6831,7 @@
23981
gcc_unreachable ();
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. */
23989
else if ((const_dup = aarch64_simd_dup_constant (vals)) != NULL_RTX)
23990
@@ -7193,49 +7389,80 @@
23994
-aarch64_output_simd_mov_immediate (rtx *const_vector,
23995
+aarch64_output_simd_mov_immediate (rtx const_vector,
23996
enum machine_mode mode,
24000
- unsigned char widthc;
24001
- int lane_width_bits;
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;
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 };
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);
24022
+ element_char = sizetochar (info.element_width);
24023
+ lane_count = width / info.element_width;
24025
mode = GET_MODE_INNER (mode);
24026
if (mode == SFmode || mode == DFmode)
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);
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);
24044
+ if (lane_count == 1)
24045
+ snprintf (templ, sizeof (templ), "fmov\t%%d0, %s", float_buf);
24047
+ snprintf (templ, sizeof (templ), "fmov\t%%0.%d%c, %s",
24048
+ lane_count, element_char, float_buf);
24053
- mnemonic = mvn ? "mvni" : "movi";
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";
24060
if (lane_count == 1)
24061
- snprintf (templ, sizeof (templ), "%s\t%%d0, %%1", mnemonic);
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);
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));
24080
+aarch64_output_scalar_simd_mov_immediate (rtx immediate,
24081
+ enum machine_mode mode)
24083
+ enum machine_mode vmode;
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);
24091
/* Split operands into moves from op[1] + op[2] into op[0]. */
24094
@@ -7860,6 +8087,9 @@
24095
#undef TARGET_EXPAND_BUILTIN_VA_START
24096
#define TARGET_EXPAND_BUILTIN_VA_START aarch64_expand_builtin_va_start
24098
+#undef TARGET_FOLD_BUILTIN
24099
+#define TARGET_FOLD_BUILTIN aarch64_fold_builtin
24101
#undef TARGET_FUNCTION_ARG
24102
#define TARGET_FUNCTION_ARG aarch64_function_arg
24104
@@ -7881,6 +8111,9 @@
24105
#undef TARGET_FRAME_POINTER_REQUIRED
24106
#define TARGET_FRAME_POINTER_REQUIRED aarch64_frame_pointer_required
24108
+#undef TARGET_GIMPLE_FOLD_BUILTIN
24109
+#define TARGET_GIMPLE_FOLD_BUILTIN aarch64_gimple_fold_builtin
24111
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
24112
#define TARGET_GIMPLIFY_VA_ARG_EXPR aarch64_gimplify_va_arg_expr
24114
@@ -7960,6 +8193,13 @@
24115
#undef TARGET_ARRAY_MODE_SUPPORTED_P
24116
#define TARGET_ARRAY_MODE_SUPPORTED_P aarch64_array_mode_supported_p
24118
+#undef TARGET_VECTORIZE_ADD_STMT_COST
24119
+#define TARGET_VECTORIZE_ADD_STMT_COST aarch64_add_stmt_cost
24121
+#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
24122
+#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
24123
+ aarch64_builtin_vectorization_cost
24125
#undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
24126
#define TARGET_VECTORIZE_PREFERRED_SIMD_MODE aarch64_preferred_simd_mode
24128
--- a/src/gcc/config/aarch64/iterators.md
24129
+++ b/src/gcc/config/aarch64/iterators.md
24131
;; Vector Float modes.
24132
(define_mode_iterator VDQF [V2SF V4SF V2DF])
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])
24137
+;; All Float modes.
24138
+(define_mode_iterator VALLF [V2SF V4SF V2DF SF DF])
24140
;; Vector Float modes with 2 elements.
24141
(define_mode_iterator V2F [V2SF V2DF])
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])
24147
+;; Vector modes for Q and H types.
24148
+(define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI])
24150
;; Vector modes for H and S types.
24151
(define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI])
24153
+;; Vector modes for Q, H and S types.
24154
+(define_mode_iterator VDQQHS [V8QI V16QI V4HI V8HI V2SI V4SI])
24156
;; Vector and scalar integer modes for H and S
24157
(define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI])
24159
@@ -160,10 +172,15 @@
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")])
24205
+;; For constraints used in scalar immediate vector moves
24206
+(define_mode_attr hq [(HI "h") (QI "q")])
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")
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")
24232
;; Narrowed modes for VDN.
24233
(define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI")
24234
@@ -435,6 +447,15 @@
24235
(V2SF "s") (V4SF "s")
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")
24247
;; Double vector types for ALLX.
24248
(define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")])
24250
@@ -444,7 +465,8 @@
24251
(V2SI "V2SI") (V4SI "V4SI")
24252
(DI "DI") (V2DI "V2DI")
24253
(V2SF "V2SI") (V4SF "V4SI")
24255
+ (V2DF "V2DI") (DF "DI")
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")
24265
+ (V2DF "v2di") (DF "di")
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])
24274
+;; Iterator for float conversions
24275
+(define_code_iterator FLOATUORS [float unsigned_float])
24277
;; Code iterator for variants of vector max and min.
24278
(define_code_iterator MAXMIN [smax smin umax umin])
24280
+(define_code_iterator FMAXMIN [smax smin])
24282
;; Code iterator for variants of vector max and min.
24283
(define_code_iterator ADDSUB [plus minus])
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])
24289
+;; Comparison operators for <F>CM.
24290
+(define_code_iterator COMPARISONS [lt le eq ge gt])
24292
+;; Unsigned comparison operators.
24293
+(define_code_iterator UCOMPARISONS [ltu leu geu gtu])
24295
+;; Unsigned comparison operators.
24296
+(define_code_iterator FAC_COMPARISONS [lt le ge gt])
24298
;; -------------------------------------------------------------------
24300
;; -------------------------------------------------------------------
24301
@@ -555,6 +592,10 @@
24302
(zero_extend "zero_extend")
24303
(sign_extract "extv")
24304
(zero_extract "extzv")
24306
+ (unsigned_fix "fixuns")
24308
+ (unsigned_float "floatuns")
24312
@@ -571,12 +612,37 @@
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.
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")])
24337
+(define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT")
24338
+ (ltu "LTU") (leu "LEU") (geu "GEU") (gtu "GTU")])
24340
+(define_code_attr fix_trunc_optab [(fix "fix_trunc")
24341
+ (unsigned_fix "fixuns_trunc")])
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")])
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")])
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")])
24365
;; Max/min attributes.
24366
-(define_code_attr maxmin [(smax "smax")
24370
+(define_code_attr maxmin [(smax "max")
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])
24381
-(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV])
24382
+(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV
24383
+ UNSPEC_FMAXNMV UNSPEC_FMINNMV])
24385
+(define_int_iterator SUADDV [UNSPEC_SADDV UNSPEC_UADDV])
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])
24394
-(define_int_iterator FMAXMIN [UNSPEC_FMAX UNSPEC_FMIN])
24395
+(define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN])
24397
(define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH])
24399
@@ -680,35 +751,44 @@
24400
UNSPEC_SQSHRN UNSPEC_UQSHRN
24401
UNSPEC_SQRSHRN UNSPEC_UQRSHRN])
24403
-(define_int_iterator VCMP_S [UNSPEC_CMEQ UNSPEC_CMGE UNSPEC_CMGT
24404
- UNSPEC_CMLE UNSPEC_CMLT])
24406
-(define_int_iterator VCMP_U [UNSPEC_CMHS UNSPEC_CMHI UNSPEC_CMTST])
24408
(define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2
24409
UNSPEC_TRN1 UNSPEC_TRN2
24410
UNSPEC_UZP1 UNSPEC_UZP2])
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
24417
(define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
24419
+ UNSPEC_FRINTA UNSPEC_FRINTN])
24421
+(define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX])
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")])
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")])
24454
-(define_int_attr fmaxmin [(UNSPEC_FMAX "fmax")
24455
- (UNSPEC_FMIN "fmin")])
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")])
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")])
24478
(define_int_attr offsetlr [(UNSPEC_SSLI "1") (UNSPEC_USLI "1")
24479
(UNSPEC_SSRI "0") (UNSPEC_USRI "0")])
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")])
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")])
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")])
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")])
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. */
24517
/* Has FP and SIMD. */
24518
#define AARCH64_FL_FPSIMD (AARCH64_FL_FP | AARCH64_FL_SIMD)
24519
@@ -163,6 +164,7 @@
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 @@
24531
-/* Which ABI to use. */
24539
ARM_PCS_AAPCS64, /* Base standard AAPCS for 64 bit. */
24540
@@ -534,11 +530,7 @@
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
24550
#ifndef ARM_DEFAULT_PCS
24551
#define ARM_DEFAULT_PCS ARM_PCS_AAPCS64
24552
@@ -709,6 +701,8 @@
24554
#define SELECT_CC_MODE(OP, X, Y) aarch64_select_cc_mode (OP, X, Y)
24556
+#define REVERSIBLE_CC_MODE(MODE) 1
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)
24565
-#define FUNCTION_PROFILER(STREAM, LABELNO) \
24566
- aarch64_function_profiler (STREAM, LABELNO)
24567
+#define MCOUNT_NAME "_mcount"
24569
+#define NO_PROFILE_COUNTERS 1
24571
+/* Emit rtl for profiling. Output assembler code to FILE
24572
+ to call "_mcount" for profiling a function entry. */
24573
+#define PROFILE_HOOK(LABEL) \
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); \
24581
+/* All the work done in PROFILE_HOOK, but still required. */
24582
+#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0)
24584
/* For some reason, the Linux headers think they know how to define
24585
these macros. They don't!!! */
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")
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")
24605
;; ALU operations with a shift-by-register operand
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")
24614
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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")
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")
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")
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")
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")
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")
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)")
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)")
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")
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")
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")
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")
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)
24740
+Enum(processor_type) String(cortex-a53) Value(cortexa53)
24743
Enum(processor_type) String(cortex-r4) Value(cortexr4)
24746
@@ -259,6 +262,9 @@
24747
Enum(processor_type) String(cortex-r5) Value(cortexr5)
24750
+Enum(processor_type) String(cortex-r7) Value(cortexr7)
24753
Enum(processor_type) String(cortex-m4) Value(cortexm4)
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"))
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"))
24774
;; ALU operations with a shift-by-register operand
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"))
24783
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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"))
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"))
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"))
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"))
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"))
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"))
24837
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24838
--- a/src/gcc/config/arm/linux-elf.h
24839
+++ b/src/gcc/config/arm/linux-elf.h
24842
#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
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" }
24850
/* Now we define the strings used to build the spec file. */
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")
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")
24870
;; ALU operations with a shift-by-register operand
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")
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")
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")
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")
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")
24911
(define_bypass 4 "11_mult3,11_mult4"
24912
@@ -190,7 +191,8 @@
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")
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")
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")
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 @@
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)")
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)")
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)")
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)")
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)")
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)")
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)")
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)")
25011
(define_bypass 2 "pj4_alu_shift,pj4_shift"
25012
"pj4_ir_mul,pj4_ir_div,pj4_core_to_vfp")
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")
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")
25026
;; Branches and calls.
25028
--- a/src/gcc/config/arm/thumb2.md
25029
+++ b/src/gcc/config/arm/thumb2.md
25030
@@ -60,105 +60,230 @@
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")]
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))]
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"
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)
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")]
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))]
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"
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)
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")]
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))]
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"
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)
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")]
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))]
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"
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)
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")]
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))]
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)
25176
+ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
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]);
25183
[(set_attr "conds" "clob")
25184
(set_attr "length" "8")]
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))]
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,*")
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"
25206
+ if (REGNO(operands[0]) == REGNO(operands[1]))
25208
+ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
25210
+ emit_insn (gen_rtx_SET (VOIDmode,
25212
+ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
25213
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25214
+ (gen_rtx_LT (SImode,
25217
+ (gen_rtx_SET (VOIDmode,
25219
+ (gen_rtx_MINUS (SImode,
25221
+ operands[1]))))));
25225
+ emit_insn (gen_rtx_SET (VOIDmode,
25227
+ gen_rtx_XOR (SImode,
25228
+ gen_rtx_ASHIFTRT (SImode,
25232
+ emit_insn (gen_rtx_SET (VOIDmode,
25234
+ gen_rtx_MINUS (SImode,
25236
+ gen_rtx_ASHIFTRT (SImode,
25238
+ GEN_INT (31)))));
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")]
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))]
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,*")
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"
25272
+ if (REGNO(operands[0]) == REGNO(operands[1]))
25274
+ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
25276
+ emit_insn (gen_rtx_SET (VOIDmode,
25278
+ gen_rtx_COMPARE (CCmode, operands[0], const0_rtx)));
25279
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25280
+ (gen_rtx_GT (SImode,
25283
+ (gen_rtx_SET (VOIDmode,
25285
+ (gen_rtx_MINUS (SImode,
25287
+ operands[1]))))));
25291
+ emit_insn (gen_rtx_SET (VOIDmode,
25293
+ gen_rtx_XOR (SImode,
25294
+ gen_rtx_ASHIFTRT (SImode,
25298
+ emit_insn (gen_rtx_SET (VOIDmode,
25300
+ gen_rtx_MINUS (SImode,
25301
+ gen_rtx_ASHIFTRT (SImode,
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")]
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 @@
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,*,*")]
25353
(define_insn "tls_load_dot_plus_four"
25354
@@ -223,6 +351,21 @@
25355
(set_attr "neg_pool_range" "*,*,*,250")]
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"))]
25368
+ && INTVAL (operands[5]) == INTVAL (operands[2]) + 4"
25369
+ "strd\\t%3, %4, [%0, %2]!"
25370
+ [(set_attr "type" "store2")]
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")]
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)]))]
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"
25394
+ [(set (match_dup 0)
25395
+ (if_then_else:SI (match_dup 1)
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")]
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"
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)
25419
+ operands[3] = GEN_INT (~0);
25421
[(set_attr "conds" "use")
25422
(set_attr "length" "10")]
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)
25435
+ (cond_exec (match_dup 4)
25436
+ (set (match_dup 0)
25439
+ operands[3] = GEN_INT (~0);
25440
+ enum machine_mode mode = GET_MODE (operands[2]);
25441
+ enum rtx_code rc = GET_CODE (operands[1]);
25443
+ if (mode == CCFPmode || mode == CCFPEmode)
25444
+ rc = reverse_condition_maybe_unordered (rc);
25446
+ rc = reverse_condition (rc);
25447
+ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
25450
+ [(set_attr "conds" "use")
25451
+ (set_attr "length" "8")]
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"
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)
25467
+ operands[3] = GEN_INT (~1);
25468
+ operands[4] = GEN_INT (~0);
25470
[(set_attr "conds" "use")
25471
(set_attr "length" "10")]
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)
25485
+ (cond_exec (match_dup 4)
25486
+ (set (match_dup 0)
25487
+ (ashift:SI (match_dup 0)
25488
+ (const_int 1))))]
25490
+ operands[3] = GEN_INT (~0);
25491
+ operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]),
25492
+ VOIDmode, operands[2], const0_rtx);
25494
+ [(set_attr "conds" "use")
25495
+ (set_attr "length" "8")]
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")
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")))]
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")
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"
25533
+ enum rtx_code rev_code;
25534
+ enum machine_mode mode;
25537
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25539
+ gen_rtx_SET (VOIDmode,
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);
25547
+ rev_code = reverse_condition (rev_code);
25549
+ rev_cond = gen_rtx_fmt_ee (rev_code,
25551
+ gen_rtx_REG (mode, CC_REGNUM),
25553
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25555
+ gen_rtx_SET (VOIDmode,
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")]
25565
@@ -333,28 +589,74 @@
25566
;; addresses will have the thumb bit set correctly.
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")))]
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)))]
25586
+ enum machine_mode mode = GET_MODE (operands[2]);
25587
+ enum rtx_code rc = GET_CODE (operands[1]);
25589
+ if (mode == CCFPmode || mode == CCFPEmode)
25590
+ rc = reverse_condition_maybe_unordered (rc);
25592
+ rc = reverse_condition (rc);
25593
+ operands[4] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
25595
[(set_attr "conds" "use")
25596
- (set_attr "length" "10")]
25597
+ (set (attr "length") (if_then_else (match_test "arm_restrict_it")
25599
+ (const_int 10)))]
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"
25610
+ it\\t%d1\;orr%d1\\t%0, %3, #1
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))))]
25619
+ enum machine_mode mode = GET_MODE (operands[2]);
25620
+ enum rtx_code rc = GET_CODE (operands[1]);
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);
25626
+ rc = reverse_condition (rc);
25627
+ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
25629
+ [(set_attr "conds" "use")
25630
+ (set_attr "length" "6,10")]
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")))]
25639
+ (match_operand:SI 1 "s_register_operand" "0,?l")))]
25640
+ "TARGET_THUMB2 && arm_restrict_it"
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")]
25651
(define_insn "*thumb2_cond_move"
25652
@@ -384,13 +686,20 @@
25653
output_asm_insn (\"it\\t%D4\", operands);
25656
- output_asm_insn (\"ite\\t%D4\", operands);
25657
+ if (arm_restrict_it)
25658
+ output_asm_insn (\"it\\t%D4\", operands);
25660
+ output_asm_insn (\"ite\\t%D4\", operands);
25665
if (which_alternative != 0)
25666
- output_asm_insn (\"mov%D4\\t%0, %1\", operands);
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);
25672
if (which_alternative != 1)
25673
output_asm_insn (\"mov%d4\\t%0, %2\", operands);
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))]
25680
+ "TARGET_THUMB2 && !arm_restrict_it"
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")]
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"
25698
+ "&& reload_completed"
25701
+ if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx)
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;
25707
+ switch (GET_CODE (operands[5]))
25710
+ op = gen_rtx_AND (SImode, shifted_op, operands[1]);
25713
+ op = gen_rtx_PLUS (SImode, shifted_op, operands[1]);
25715
+ default: gcc_unreachable ();
25717
+ emit_insn (gen_rtx_SET (VOIDmode, operands[0], op));
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])));
25726
+ if (GET_CODE (operands[5]) == AND)
25728
+ /* %i5 %0, %1, #1
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)));
25741
+ %i5%d4\\t%0, %1, #1 */
25742
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode, gen_rtx_fmt_ee (GET_CODE (operands[4]),
25744
+ gen_rtx_REG (CCmode, CC_REGNUM), const0_rtx),
25745
+ gen_rtx_SET(VOIDmode, operands[0],
25746
+ gen_rtx_PLUS (SImode,
25753
+ [(set_attr "conds" "clob")
25754
+ (set_attr "length" "12")]
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)
25769
- output_asm_insn (\"ite\\t%D4\", operands);
25770
- output_asm_insn (\"mov%D4\\t%0, %1\", operands);
25771
+ if (arm_restrict_it)
25773
+ output_asm_insn (\"mov\\t%0, %1\", operands);
25774
+ output_asm_insn (\"it\\t%d4\", operands);
25778
+ output_asm_insn (\"ite\\t%D4\", operands);
25779
+ output_asm_insn (\"mov%D4\\t%0, %1\", operands);
25783
output_asm_insn (\"it\\t%d4\", operands);
25784
@@ -459,37 +845,82 @@
25785
(set_attr "length" "10,14")]
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))]
25798
- if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
25799
- return \"asr\\t%0, %1, #31\";
25801
+ "&& reload_completed"
25804
+ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
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)
25810
+ /* Emit asr\\t%0, %1, #31 */
25811
+ emit_insn (gen_rtx_SET (VOIDmode,
25813
+ gen_rtx_ASHIFTRT (SImode,
25818
+ else if (GET_CODE (operands[3]) == NE && !arm_restrict_it)
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]))));
25825
+ emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2]));
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\";
25832
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25833
+ gen_rtx_NE (SImode,
25836
+ gen_rtx_SET (SImode,
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);
25848
+ emit_insn (gen_rtx_SET (VOIDmode,
25850
+ gen_rtx_COMPARE (CCmode, operands[1], operands[2])));
25852
+ emit_insn (gen_rtx_SET (VOIDmode, operands[0], GEN_INT (~0)));
25854
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
25855
+ gen_rtx_fmt_ee (rc,
25859
+ gen_rtx_SET (VOIDmode, operands[0], const0_rtx)));
25864
[(set_attr "conds" "clob")
25865
(set_attr "length" "14")]
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")
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))]
25882
@@ -544,12 +975,18 @@
25883
output_asm_insn (\"it\\t%d5\", operands);
25886
- output_asm_insn (\"ite\\t%d5\", operands);
25887
+ if (arm_restrict_it)
25889
+ output_asm_insn (\"mov\\t%0, %1\", operands);
25890
+ output_asm_insn (\"it\\t%D5\", operands);
25893
+ output_asm_insn (\"ite\\t%d5\", operands);
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 @@
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")]
25914
@@ -583,8 +1021,9 @@
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")]
25925
@@ -596,8 +1035,9 @@
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")]
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")))]
25946
(define_insn "*thumb2_mov<mode>_shortim"
25947
@@ -811,7 +1251,7 @@
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,*")]
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")])
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")])
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")])
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")))]
25986
"orn%?\\t%0, %1, %2"
25987
- [(set_attr "predicable" "yes")]
25988
+ [(set_attr "predicable" "yes")
25989
+ (set_attr "predicable_short_it" "no")]
25992
(define_insn "*orsi_not_shiftsi_si"
25993
@@ -934,8 +1375,9 @@
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")]
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,
26013
static rtx arm_function_arg (cumulative_args_t, enum machine_mode,
26014
@@ -280,6 +281,7 @@
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);
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
26026
+#undef TARGET_VECTORIZE_BUILTINS
26027
+#define TARGET_VECTORIZE_BUILTINS
26029
+#undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
26030
+#define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
26031
+ arm_builtin_vectorized_function
26033
#undef TARGET_VECTOR_ALIGNMENT
26034
#define TARGET_VECTOR_ALIGNMENT arm_vector_alignment
26036
@@ -649,6 +658,13 @@
26037
#define TARGET_CANONICALIZE_COMPARISON \
26038
arm_canonicalize_comparison
26040
+#undef TARGET_ASAN_SHADOW_OFFSET
26041
+#define TARGET_ASAN_SHADOW_OFFSET arm_asan_shadow_offset
26043
+#undef MAX_INSN_PER_IT_BLOCK
26044
+#define MAX_INSN_PER_IT_BLOCK (arm_restrict_it ? 1 : 4)
26047
struct gcc_target targetm = TARGET_INITIALIZER;
26049
/* Obstack for minipool constant handling. */
26050
@@ -839,6 +855,10 @@
26051
int arm_arch_arm_hwdiv;
26052
int arm_arch_thumb_hwdiv;
26054
+/* Nonzero if we should use Neon to handle 64-bits operations rather
26055
+ than core registers. */
26056
+int prefer_neon_for_64bits = 0;
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. */
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. */
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. */
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. */
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. */
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. */
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. */
26116
const struct tune_params arm_cortex_a15_tune =
26117
@@ -1031,13 +1058,14 @@
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. */
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. */
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. */
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. */
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. */
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;
26172
+ if (!TARGET_THUMB2)
26173
+ arm_restrict_it = 0;
26175
/* If we are not using the default (ARM mode) section anchor offset
26176
ranges, then set the correct ranges now. */
26178
@@ -2129,11 +2166,25 @@
26179
global_options.x_param_values,
26180
global_options_set.x_param_values);
26182
+ /* Use Neon to perform 64-bits operations rather than core
26184
+ prefer_neon_for_64bits = current_tune->prefer_neon_for_64bits;
26185
+ if (use_neon_for_64bits == 1)
26186
+ prefer_neon_for_64bits = true;
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);
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;
26201
/* Register global variables with the garbage collector. */
26202
arm_add_gc_roots ();
26204
@@ -2382,6 +2433,10 @@
26205
if (IS_INTERRUPT (func_type) && (frame_pointer_needed || TARGET_THUMB))
26208
+ if (TARGET_LDRD && current_tune->prefer_ldrd_strd
26209
+ && !optimize_function_for_size_p (cfun))
26212
offsets = arm_get_frame_offsets ();
26213
stack_adjust = offsets->outgoing_args - offsets->saved_regs;
26215
@@ -2479,6 +2534,18 @@
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. */
26223
+use_simple_return_p (void)
26225
+ arm_stack_offsets *offsets;
26227
+ offsets = arm_get_frame_offsets ();
26228
+ return offsets->outgoing_args != 0;
26231
/* Return TRUE if int I is a valid immediate ARM constant. */
26234
@@ -2617,6 +2684,11 @@
26241
+ return (const_ok_for_op (hi_val, code) || hi_val == 0xFFFFFFFF)
26242
+ && (const_ok_for_op (lo_val, code) || lo_val == 0xFFFFFFFF);
26244
return arm_not_operand (hi, SImode) && arm_add_operand (lo, SImode);
26246
@@ -5337,9 +5409,8 @@
26247
if (cfun->machine->sibcall_blocked)
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)
26257
/* The PIC register is live on entry to VxWorks PLT entries, so we
26258
@@ -5349,13 +5420,14 @@
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))
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))
26274
func_type = arm_current_func_type ();
26275
@@ -5387,6 +5459,7 @@
26277
if (TARGET_AAPCS_BASED
26278
&& arm_abi == ARM_ABI_AAPCS
26280
&& DECL_WEAK (decl))
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))
26295
rtx shifted_operand;
26297
@@ -8859,12 +8937,12 @@
26298
if (recog_memoized (insn) < 0)
26301
- if (get_attr_insn (insn) == INSN_MOV)
26304
switch (get_attr_type (insn))
26306
- case TYPE_ALU_REG:
26307
+ case TYPE_ARLO_REG:
26308
+ case TYPE_MVN_REG:
26310
+ case TYPE_SHIFT_REG:
26311
case TYPE_LOAD_BYTE:
26314
@@ -8905,13 +8983,15 @@
26318
- if (get_attr_insn (insn) == INSN_MOV)
26321
switch (get_attr_type (insn))
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:
26335
@@ -9070,6 +9150,12 @@
26340
+arm_max_conditional_execute (void)
26342
+ return max_insns_skipped;
26346
arm_default_branch_cost (bool speed_p, bool predictable_p ATTRIBUTE_UNUSED)
26348
@@ -11825,6 +11911,142 @@
26352
+/* Helper for gen_movmem_ldrd_strd. Increase the address of memory rtx
26355
+next_consecutive_mem (rtx mem)
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);
26361
+ return adjust_automodify_address (mem, mode, addr, offset);
26364
+/* Copy using LDRD/STRD instructions whenever possible.
26365
+ Returns true upon success. */
26367
+gen_movmem_ldrd_strd (rtx *operands)
26369
+ unsigned HOST_WIDE_INT len;
26370
+ HOST_WIDE_INT align;
26371
+ rtx src, dst, base;
26373
+ bool src_aligned, dst_aligned;
26374
+ bool src_volatile, dst_volatile;
26376
+ gcc_assert (CONST_INT_P (operands[2]));
26377
+ gcc_assert (CONST_INT_P (operands[3]));
26379
+ len = UINTVAL (operands[2]);
26383
+ /* Maximum alignment we can assume for both src and dst buffers. */
26384
+ align = INTVAL (operands[3]);
26386
+ if ((!unaligned_access) && (len >= 4) && ((align & 3) != 0))
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);
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);
26403
+ if (!unaligned_access && !(src_aligned && dst_aligned))
26406
+ if (src_volatile || dst_volatile)
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);
26413
+ src = adjust_address (src, DImode, 0);
26414
+ dst = adjust_address (dst, DImode, 0);
26418
+ reg0 = gen_reg_rtx (DImode);
26420
+ emit_move_insn (reg0, src);
26422
+ emit_insn (gen_unaligned_loaddi (reg0, src));
26425
+ emit_move_insn (dst, reg0);
26427
+ emit_insn (gen_unaligned_storedi (dst, reg0));
26429
+ src = next_consecutive_mem (src);
26430
+ dst = next_consecutive_mem (dst);
26433
+ gcc_assert (len < 8);
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);
26441
+ emit_move_insn (reg0, src);
26443
+ emit_insn (gen_unaligned_loadsi (reg0, src));
26446
+ emit_move_insn (dst, reg0);
26448
+ emit_insn (gen_unaligned_storesi (dst, reg0));
26450
+ src = next_consecutive_mem (src);
26451
+ dst = next_consecutive_mem (dst);
26458
+ /* Copy the remaining bytes. */
26461
+ dst = adjust_address (dst, HImode, 0);
26462
+ src = adjust_address (src, HImode, 0);
26463
+ reg0 = gen_reg_rtx (SImode);
26465
+ emit_insn (gen_zero_extendhisi2 (reg0, src));
26467
+ emit_insn (gen_unaligned_loadhiu (reg0, src));
26470
+ emit_insn (gen_movhi (dst, gen_lowpart(HImode, reg0)));
26472
+ emit_insn (gen_unaligned_storehi (dst, gen_lowpart (HImode, reg0)));
26474
+ src = next_consecutive_mem (src);
26475
+ dst = next_consecutive_mem (dst);
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);
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 @@
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
26500
+mem_ok_for_ldrd_strd (rtx addr, rtx *base, rtx *offset)
26502
+ /* TODO: Handle more general memory operand patterns, such as
26503
+ PRE_DEC and PRE_INC. */
26505
+ /* Convert a subreg of mem into mem itself. */
26506
+ if (GET_CODE (addr) == SUBREG)
26507
+ addr = alter_subreg (&addr, true);
26509
+ gcc_assert (MEM_P (addr));
26511
+ /* Don't modify volatile memory accesses. */
26512
+ if (MEM_VOLATILE_P (addr))
26515
+ *offset = const0_rtx;
26517
+ addr = XEXP (addr, 0);
26518
+ if (REG_P (addr))
26523
+ else if (GET_CODE (addr) == PLUS || GET_CODE (addr) == MINUS)
26525
+ *base = XEXP (addr, 0);
26526
+ *offset = XEXP (addr, 1);
26527
+ return (REG_P (*base) && CONST_INT_P (*offset));
26533
+#define SWAP_RTX(x,y) do { rtx tmp = x; x = y; y = tmp; } while (0)
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. */
26548
+gen_operands_ldrd_strd (rtx *operands, bool load,
26549
+ bool const_store, bool commute)
26552
+ HOST_WIDE_INT offsets[2], offset;
26553
+ rtx base = NULL_RTX;
26554
+ rtx cur_base, cur_offset, tmp;
26556
+ HARD_REG_SET regset;
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++)
26564
+ if (!mem_ok_for_ldrd_strd (operands[nops+i], &cur_base, &cur_offset))
26569
+ else if (REGNO (base) != REGNO (cur_base))
26572
+ offsets[i] = INTVAL (cur_offset);
26573
+ if (GET_CODE (operands[i]) == SUBREG)
26575
+ tmp = SUBREG_REG (operands[i]);
26576
+ gcc_assert (GET_MODE (operands[i]) == GET_MODE (tmp));
26577
+ operands[i] = tmp;
26581
+ /* Make sure there is no dependency between the individual loads. */
26582
+ if (load && REGNO (operands[0]) == REGNO (base))
26583
+ return false; /* RAW */
26585
+ if (load && REGNO (operands[0]) == REGNO (operands[1]))
26586
+ return false; /* WAW */
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
26595
+ can be transformed into
26597
+ strd r1, r0, [r2]
26598
+ in Thumb mode assuming that r1 is free. */
26600
+ && REGNO (operands[0]) == REGNO (operands[1])
26601
+ && INTVAL (operands[4]) != INTVAL (operands[5]))
26603
+ if (TARGET_THUMB2)
26605
+ CLEAR_HARD_REG_SET (regset);
26606
+ tmp = peep2_find_free_register (0, 4, "r", SImode, ®set);
26607
+ if (tmp == NULL_RTX)
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;
26615
+ else if (TARGET_ARM)
26618
+ int regno = REGNO (operands[0]);
26619
+ if (!peep2_reg_dead_p (4, operands[0]))
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
26625
+ if (regno % 2 == 0)
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, ®set);
26632
+ if (tmp == NULL_RTX)
26635
+ operands[0] = tmp;
26639
+ /* Find a DImode register. */
26640
+ CLEAR_HARD_REG_SET (regset);
26641
+ tmp = peep2_find_free_register (0, 4, "r", DImode, ®set);
26642
+ if (tmp != NULL_RTX)
26644
+ operands[0] = simplify_gen_subreg (SImode, tmp, DImode, 0);
26645
+ operands[1] = simplify_gen_subreg (SImode, tmp, DImode, 4);
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, ®set);
26654
+ if (tmp == NULL_RTX)
26656
+ operands[regno % 2 == 1 ? 0 : 1] = tmp;
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);
26667
+ /* Make sure the instructions are ordered with lower memory access first. */
26668
+ if (offsets[0] > offsets[1])
26670
+ gap = offsets[0] - offsets[1];
26671
+ offset = offsets[1];
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]);
26677
+ SWAP_RTX (operands[4], operands[5]);
26681
+ gap = offsets[1] - offsets[0];
26682
+ offset = offsets[0];
26685
+ /* Make sure accesses are to consecutive memory locations. */
26689
+ /* Make sure we generate legal instructions. */
26690
+ if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset,
26694
+ /* In Thumb state, where registers are almost unconstrained, there
26695
+ is little hope to fix it. */
26696
+ if (TARGET_THUMB2)
26699
+ if (load && commute)
26701
+ /* Try reordering registers. */
26702
+ SWAP_RTX (operands[0], operands[1]);
26703
+ if (operands_ok_ldrd_strd (operands[0], operands[1], base, offset,
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]))
26717
+ /* Try to reorder the input registers. */
26718
+ /* For example, the code
26723
+ can be transformed into
26728
+ if (operands_ok_ldrd_strd (operands[1], operands[0], base, offset,
26731
+ SWAP_RTX (operands[0], operands[1]);
26735
+ /* Try to find a free DI register. */
26736
+ CLEAR_HARD_REG_SET (regset);
26737
+ add_to_hard_reg_set (®set, SImode, REGNO (operands[0]));
26738
+ add_to_hard_reg_set (®set, SImode, REGNO (operands[1]));
26741
+ tmp = peep2_find_free_register (0, 4, "r", DImode, ®set);
26742
+ if (tmp == NULL_RTX)
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]));
26754
+ return (operands_ok_ldrd_strd (operands[0], operands[1],
26767
/* Print a symbolic form of X to the debug file, F. */
26769
@@ -13858,6 +14351,16 @@
26770
&& IN_RANGE (INTVAL (op1), -7, 7))
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),
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)
26786
@@ -14816,7 +15319,8 @@
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));
26794
switch (GET_CODE (XEXP (operands[0], 0)))
26796
@@ -16289,124 +16793,308 @@
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. */
26812
thumb2_emit_strd_push (unsigned long saved_regs_mask)
26818
rtx par = NULL_RTX;
26819
- rtx insn = NULL_RTX;
26820
rtx dwarf = NULL_RTX;
26821
- rtx tmp, reg, tmp1;
26823
+ bool first = true;
26825
+ num_regs = bit_count (saved_regs_mask);
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)));
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));
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;
26843
+ /* Find the first register. */
26844
+ for (regno = 0; (saved_regs_mask & (1 << regno)) == 0; regno++)
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)
26855
+ rtx reg, mem, insn;
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));
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)));
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),
26875
+ RTX_FRAME_RELATED_P (tmp) = 1;
26878
+ XVECEXP (dwarf, 0, i) = tmp;
26882
+ while (i < num_regs)
26883
+ if (saved_regs_mask & (1 << regno))
26885
+ rtx reg1, reg2, mem1, mem2;
26886
+ rtx tmp0, tmp1, tmp2;
26889
+ /* Find the register to pair with this one. */
26890
+ for (regno2 = regno + 1; (saved_regs_mask & (1 << regno2)) == 0;
26894
+ reg1 = gen_rtx_REG (SImode, regno);
26895
+ reg2 = gen_rtx_REG (SImode, regno2);
26902
+ mem1 = gen_frame_mem (Pmode, plus_constant (Pmode,
26903
+ stack_pointer_rtx,
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);
26926
+ mem1 = gen_frame_mem (Pmode, plus_constant (Pmode,
26927
+ stack_pointer_rtx,
26929
+ mem2 = gen_frame_mem (Pmode, plus_constant (Pmode,
26930
+ stack_pointer_rtx,
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;
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,
26949
+ tmp2 = gen_rtx_SET (VOIDmode,
26950
+ gen_frame_mem (Pmode,
26951
+ plus_constant (Pmode,
26952
+ stack_pointer_rtx,
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;
26961
+ regno = regno2 + 1;
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. */
26977
+arm_emit_strd_push (unsigned long saved_regs_mask)
26979
+ int num_regs = 0;
26980
+ int i, j, dwarf_index = 0;
26982
+ rtx dwarf = NULL_RTX;
26983
+ rtx insn = NULL_RTX;
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))
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);
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);
27006
/* Create sequence for DWARF info. */
27007
dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (num_regs + 1));
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,
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;
27020
- gcc_assert (!(saved_regs_mask & (1 << SP_REGNUM)));
27021
- gcc_assert (!(saved_regs_mask & (1 << PC_REGNUM)));
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;
27034
+ while (j <= LAST_ARM_REGNUM)
27035
if (saved_regs_mask & (1 << j))
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,
27043
- plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
27046
+ && (saved_regs_mask & (1 << (j + 1))))
27048
+ /* Current register and previous register form register pair for
27049
+ which STRD can be generated. */
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);
27058
+ else if (offset > 0)
27059
+ mem = gen_frame_mem (DImode,
27060
+ plus_constant (Pmode,
27061
+ stack_pointer_rtx,
27064
+ mem = gen_frame_mem (DImode, stack_pointer_rtx);
27066
- tmp1 = gen_rtx_SET (SImode,
27069
- plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
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);
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
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)
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,
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;
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. */
27108
+ mem = gen_frame_mem (SImode,
27109
+ plus_constant (Pmode,
27110
+ stack_pointer_rtx,
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;
27123
+ /* Emit a single word store. */
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);
27132
+ else if (offset > 0)
27133
+ mem = gen_frame_mem (SImode,
27134
+ plus_constant (Pmode,
27135
+ stack_pointer_rtx,
27138
+ mem = gen_frame_mem (SImode, stack_pointer_rtx);
27140
- if ((num_regs % 2) == 1)
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);
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)
27159
+ /* Generate dwarf info. */
27160
+ mem = gen_frame_mem (SImode,
27161
+ plus_constant(Pmode,
27162
+ stack_pointer_rtx,
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;
27168
- tmp1 = gen_rtx_SET (SImode,
27171
- plus_constant (Pmode, stack_pointer_rtx, 4 * i)),
27173
- RTX_FRAME_RELATED_P (tmp1) = 1;
27174
- XVECEXP (dwarf, 0, (i + 1)) = tmp1;
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;
27190
/* Generate and emit an insn that we will recognize as a push_multi.
27191
@@ -16551,6 +17239,19 @@
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. */
27199
+arm_add_cfa_adjust_cfa_note (rtx insn, int size, rtx dest, rtx src)
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);
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.
27211
@@ -16608,6 +17309,17 @@
27212
if (saved_regs_mask & (1 << i))
27214
reg = gen_rtx_REG (SImode, i);
27215
+ if ((num_regs == 1) && emit_update && !return_in_pc)
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);
27226
tmp = gen_rtx_SET (VOIDmode,
27229
@@ -16630,6 +17342,9 @@
27230
par = emit_insn (par);
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);
27238
/* Generate and emit an insn pattern that we will recognize as a pop_multi
27239
@@ -16700,6 +17415,9 @@
27241
par = emit_insn (par);
27242
REG_NOTES (par) = dwarf;
27244
+ arm_add_cfa_adjust_cfa_note (par, 2 * UNITS_PER_WORD * num_regs,
27245
+ base_reg, base_reg);
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;
27257
@@ -16791,7 +17510,12 @@
27259
plus_constant (Pmode, stack_pointer_rtx, 4 * i));
27260
RTX_FRAME_RELATED_P (tmp) = 1;
27262
+ tmp = emit_insn (tmp);
27263
+ if (!return_in_pc)
27265
+ arm_add_cfa_adjust_cfa_note (tmp, UNITS_PER_WORD * i,
27266
+ stack_pointer_rtx, stack_pointer_rtx);
27271
@@ -16825,9 +17549,11 @@
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);
27280
- REG_NOTES (par) = dwarf;
27282
else if ((num_regs % 2) == 1 && return_in_pc)
27284
@@ -16839,6 +17565,129 @@
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. */
27300
+arm_emit_ldrd_pop (unsigned long saved_regs_mask)
27304
+ rtx par = NULL_RTX;
27305
+ rtx dwarf = NULL_RTX;
27308
+ /* Restore saved registers. */
27309
+ gcc_assert (!((saved_regs_mask & (1 << SP_REGNUM))));
27311
+ while (j <= LAST_ARM_REGNUM)
27312
+ if (saved_regs_mask & (1 << j))
27315
+ && (saved_regs_mask & (1 << (j + 1)))
27316
+ && (j + 1) != PC_REGNUM)
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. */
27322
+ mem = gen_frame_mem (DImode,
27323
+ plus_constant (Pmode,
27324
+ stack_pointer_rtx,
27327
+ mem = gen_frame_mem (DImode, stack_pointer_rtx);
27329
+ tmp = gen_rtx_SET (DImode, gen_rtx_REG (DImode, j), mem);
27330
+ RTX_FRAME_RELATED_P (tmp) = 1;
27331
+ tmp = emit_insn (tmp);
27333
+ /* Generate dwarf info. */
27335
+ dwarf = alloc_reg_note (REG_CFA_RESTORE,
27336
+ gen_rtx_REG (SImode, j),
27338
+ dwarf = alloc_reg_note (REG_CFA_RESTORE,
27339
+ gen_rtx_REG (SImode, j + 1),
27342
+ REG_NOTES (tmp) = dwarf;
27347
+ else if (j != PC_REGNUM)
27349
+ /* Emit a single word load. */
27351
+ mem = gen_frame_mem (SImode,
27352
+ plus_constant (Pmode,
27353
+ stack_pointer_rtx,
27356
+ mem = gen_frame_mem (SImode, stack_pointer_rtx);
27358
+ tmp = gen_rtx_SET (SImode, gen_rtx_REG (SImode, j), mem);
27359
+ RTX_FRAME_RELATED_P (tmp) = 1;
27360
+ tmp = emit_insn (tmp);
27362
+ /* Generate dwarf info. */
27363
+ REG_NOTES (tmp) = alloc_reg_note (REG_CFA_RESTORE,
27364
+ gen_rtx_REG (SImode, j),
27370
+ else /* j == PC_REGNUM */
27376
+ /* Update the stack. */
27379
+ tmp = gen_rtx_SET (Pmode,
27380
+ stack_pointer_rtx,
27381
+ plus_constant (Pmode,
27382
+ stack_pointer_rtx,
27384
+ RTX_FRAME_RELATED_P (tmp) = 1;
27389
+ if (saved_regs_mask & (1 << PC_REGNUM))
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);
27403
+ /* Generate dwarf info. */
27404
+ dwarf = alloc_reg_note (REG_CFA_RESTORE,
27405
+ gen_rtx_REG (SImode, PC_REGNUM),
27407
+ REG_NOTES (par) = dwarf;
27411
/* Calculate the size of the return value that is passed in registers. */
27413
arm_size_return_regs (void)
27414
@@ -16863,11 +17712,27 @@
27415
|| df_regs_ever_live_p (LR_REGNUM));
27418
+/* We do not know if r3 will be available because
27419
+ we do have an indirect tailcall happening in this
27420
+ particular case. */
27422
+is_indirect_tailcall_p (rtx call)
27424
+ rtx pat = PATTERN (call);
27426
+ /* Indirect tail call. */
27427
+ pat = XVECEXP (pat, 0, 0);
27428
+ if (GET_CODE (pat) == SET)
27429
+ pat = SET_SRC (pat);
27431
+ pat = XEXP (XEXP (pat, 0), 0);
27432
+ return REG_P (pat);
27435
/* Return true if r3 is used by any of the tail call insns in the
27436
current function. */
27438
-any_sibcall_uses_r3 (void)
27439
+any_sibcall_could_use_r3 (void)
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))
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)))
27467
@@ -17483,6 +18351,12 @@
27469
thumb2_emit_strd_push (live_regs_mask);
27471
+ else if (TARGET_ARM
27472
+ && !TARGET_APCS_FRAME
27473
+ && !IS_INTERRUPT (func_type))
27475
+ arm_emit_strd_push (live_regs_mask);
27479
insn = emit_multi_reg_push (live_regs_mask);
27480
@@ -18760,7 +19634,14 @@
27481
enum arm_cond_code code;
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;
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)
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)
27506
predicate = COND_EXEC_TEST (body);
27507
@@ -19362,6 +20243,7 @@
27515
@@ -19379,14 +20261,15 @@
27516
#define TYPE_MODE_BIT(X) (1 << (X))
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))
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
27533
@@ -19422,6 +20305,8 @@
27537
+ NEON_FLOAT_WIDEN,
27538
+ NEON_FLOAT_NARROW,
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}
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 @@
27554
static neon_builtin_datum neon_builtin_data[] =
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"
27750
@@ -19696,9 +20393,36 @@
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).
27757
+#define CF(N,X) ARM_BUILTIN_NEON_##N##X
27758
+#define VAR1(T, N, A) \
27760
+#define VAR2(T, N, A, B) \
27761
+ VAR1 (T, N, A), \
27763
+#define VAR3(T, N, A, B, C) \
27764
+ VAR2 (T, N, A, B), \
27766
+#define VAR4(T, N, A, B, C, D) \
27767
+ VAR3 (T, N, A, B, C), \
27769
+#define VAR5(T, N, A, B, C, D, E) \
27770
+ VAR4 (T, N, A, B, C, D), \
27772
+#define VAR6(T, N, A, B, C, D, E, F) \
27773
+ VAR5 (T, N, A, B, C, D, E), \
27775
+#define VAR7(T, N, A, B, C, D, E, F, G) \
27776
+ VAR6 (T, N, A, B, C, D, E, F), \
27778
+#define VAR8(T, N, A, B, C, D, E, F, G, H) \
27779
+ VAR7 (T, N, A, B, C, D, E, F, G), \
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), \
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), \
27789
ARM_BUILTIN_GETWCGR0,
27790
@@ -19947,11 +20671,25 @@
27792
ARM_BUILTIN_WMERGE,
27794
- ARM_BUILTIN_NEON_BASE,
27795
+#include "arm_neon_builtins.def"
27797
- ARM_BUILTIN_MAX = ARM_BUILTIN_NEON_BASE + ARRAY_SIZE (neon_builtin_data)
27801
+#define ARM_BUILTIN_NEON_BASE (ARM_BUILTIN_MAX - ARRAY_SIZE (neon_builtin_data))
27815
static GTY(()) tree arm_builtin_decls[ARM_BUILTIN_MAX];
27818
@@ -19962,6 +20700,7 @@
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 @@
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);
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);
27856
build_vector_type_for_mode (neon_intHI_type_node, V4HImode);
27858
+ build_vector_type_for_mode (neon_floatHF_type_node, V4HFmode);
27860
build_vector_type_for_mode (neon_intSI_type_node, V2SImode);
27862
@@ -20213,7 +20960,7 @@
27863
neon_builtin_datum *d = &neon_builtin_data[i];
27865
const char* const modenames[] = {
27866
- "v8qi", "v4hi", "v2si", "v2sf", "di",
27867
+ "v8qi", "v4hi", "v4hf", "v2si", "v2sf", "di",
27868
"v16qi", "v8hi", "v4si", "v4sf", "v2di",
27871
@@ -20416,8 +21163,9 @@
27872
case NEON_REINTERP:
27874
/* We iterate over 5 doubleword types, then 5 quadword
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)
27882
case V8QImode: ftype = reinterp_ftype_dreg[0][rhs]; break;
27883
@@ -20434,7 +21182,38 @@
27887
+ case NEON_FLOAT_WIDEN:
27889
+ tree eltype = NULL_TREE;
27890
+ tree return_type = NULL_TREE;
27892
+ switch (insn_data[d->code].operand[1].mode)
27895
+ eltype = V4HF_type_node;
27896
+ return_type = V4SF_type_node;
27898
+ default: gcc_unreachable ();
27900
+ ftype = build_function_type_list (return_type, eltype, NULL);
27903
+ case NEON_FLOAT_NARROW:
27905
+ tree eltype = NULL_TREE;
27906
+ tree return_type = NULL_TREE;
27908
+ switch (insn_data[d->code].operand[1].mode)
27911
+ eltype = V4SF_type_node;
27912
+ return_type = V4HF_type_node;
27914
+ default: gcc_unreachable ();
27916
+ ftype = build_function_type_list (return_type, eltype, NULL);
27920
gcc_unreachable ();
27922
@@ -21431,6 +22210,8 @@
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 @@
27935
- int fcode = DECL_FUNCTION_CODE (fndecl);
27936
+ unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
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. */
27944
-thumb2_expand_return (void)
27945
+thumb2_expand_return (bool simple_return)
27948
unsigned long saved_regs_mask;
27949
@@ -23358,7 +24139,7 @@
27950
if (saved_regs_mask & (1 << i))
27953
- if (saved_regs_mask)
27954
+ if (!simple_return && saved_regs_mask)
27958
@@ -23636,6 +24417,7 @@
27960
if (frame_pointer_needed)
27963
/* Restore stack pointer if necessary. */
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);
27980
/* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not
27982
@@ -23658,16 +24443,25 @@
27984
/* In Thumb-2 mode, the frame pointer points to the last saved
27986
- amount = offsets->locals_base - offsets->saved_regs;
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;
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);
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
28013
emit_insn (gen_force_register_use (stack_pointer_rtx));
28014
@@ -23680,12 +24474,15 @@
28015
amount = offsets->outgoing_args - offsets->saved_regs;
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
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),
28037
+ arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD,
28038
+ stack_pointer_rtx, stack_pointer_rtx);
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),
28046
+ arm_add_cfa_adjust_cfa_note (insn, UNITS_PER_WORD,
28047
+ stack_pointer_rtx,
28048
+ stack_pointer_rtx);
28052
@@ -23796,6 +24598,8 @@
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);
28059
arm_emit_multi_reg_pop (saved_regs_mask);
28061
@@ -23808,10 +24612,34 @@
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)));
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)));
28075
+ RTX_FRAME_RELATED_P (tmp) = 1;
28077
+ if (cfun->machine->uses_anonymous_args)
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))
28086
+ rtx reg = gen_rtx_REG (SImode, i);
28087
+ dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
28090
+ REG_NOTES (tmp) = dwarf;
28092
+ arm_add_cfa_adjust_cfa_note (tmp, crtl->args.pretend_args_size,
28093
+ stack_pointer_rtx, stack_pointer_rtx);
28096
if (!really_return)
28099
@@ -25064,7 +25892,7 @@
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))
28107
if ((TARGET_NEON || TARGET_IWMMXT)
28108
@@ -25227,9 +26055,8 @@
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);
28119
@@ -25479,9 +26306,17 @@
28120
handled_one = true;
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
28128
+ case REG_CFA_ADJUST_CFA:
28129
+ case REG_CFA_RESTORE:
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 @@
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;
28159
+arm_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
28161
+ enum machine_mode in_mode, out_mode;
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;
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);
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)
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) \
28190
+ if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
28192
+ enum built_in_function fn = DECL_FUNCTION_CODE (fndecl);
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);
28204
+ return NULL_TREE;
28207
+ return NULL_TREE;
28209
+#undef ARM_CHECK_BUILTIN_MODE
28210
+#undef ARM_FIND_VRINT_VARIANT
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 ());
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. */
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)
28227
rtx (*gen) (rtx, rtx);
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;
28237
- gcc_unreachable ();
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;
28245
+ gcc_unreachable ();
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;
28257
+ gcc_unreachable ();
28261
emit_insn (gen (rval, mem));
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)
28269
rtx (*gen) (rtx, rtx, rtx);
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;
28279
- gcc_unreachable ();
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;
28287
+ gcc_unreachable ();
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;
28299
+ gcc_unreachable ();
28303
emit_insn (gen (bval, rval, mem));
28305
@@ -26303,6 +27226,15 @@
28306
mod_f = operands[7];
28307
mode = GET_MODE (mem);
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. */
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);
28321
@@ -26377,8 +27309,20 @@
28322
scratch = operands[7];
28323
mode = GET_MODE (mem);
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);
28331
+ bool use_release = TARGET_HAVE_LDACQ
28332
+ && !(mod_s == MEMMODEL_RELAXED
28333
+ || mod_s == MEMMODEL_CONSUME
28334
+ || mod_s == MEMMODEL_ACQUIRE);
28336
+ /* Checks whether a barrier is needed and emits one accordingly. */
28337
+ if (!(use_acquire || use_release))
28338
+ arm_pre_atomic_barrier (mod_s);
28343
@@ -26387,7 +27331,7 @@
28345
label2 = gen_label_rtx ();
28347
- arm_emit_load_exclusive (mode, rval, mem);
28348
+ arm_emit_load_exclusive (mode, rval, mem, use_acquire);
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));
28356
- arm_emit_store_exclusive (mode, scratch, mem, newval);
28357
+ arm_emit_store_exclusive (mode, scratch, mem, newval, use_release);
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);
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);
28370
if (mod_f == MEMMODEL_RELAXED)
28371
emit_label (label2);
28372
@@ -26429,8 +27375,20 @@
28373
enum machine_mode wmode = (mode == DImode ? DImode : SImode);
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);
28382
+ bool use_release = TARGET_HAVE_LDACQ
28383
+ && !(model == MEMMODEL_RELAXED
28384
+ || model == MEMMODEL_CONSUME
28385
+ || model == MEMMODEL_ACQUIRE);
28387
+ /* Checks whether a barrier is needed and emits one accordingly. */
28388
+ if (!(use_acquire || use_release))
28389
+ arm_pre_atomic_barrier (model);
28391
label = gen_label_rtx ();
28392
emit_label (label);
28394
@@ -26442,7 +27400,7 @@
28396
value = simplify_gen_subreg (wmode, value, mode, 0);
28398
- arm_emit_load_exclusive (mode, old_out, mem);
28399
+ arm_emit_load_exclusive (mode, old_out, mem, use_acquire);
28403
@@ -26490,12 +27448,15 @@
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),
28411
x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
28412
emit_unlikely_jump (gen_cbranchsi4 (x, cond, const0_rtx, label));
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);
28420
#define MAX_VECT_LEN 16
28421
@@ -27435,4 +28396,12 @@
28425
+/* Implement the TARGET_ASAN_SHADOW_OFFSET hook. */
28427
+static unsigned HOST_WIDE_INT
28428
+arm_asan_shadow_offset (void)
28430
+ return (unsigned HOST_WIDE_INT) 1 << 29;
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 @@
28438
#define ARM_INVERSE_CONDITION_CODE(X) ((arm_cc) (((int)X) ^ 1))
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 ()
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) \
28452
+/* Nonzero if this chip supports load-acquire and store-release. */
28453
+#define TARGET_HAVE_LDACQ (TARGET_ARM_ARCH >= 8)
28455
/* Nonzero if integer division instructions supported. */
28456
#define TARGET_IDIV ((TARGET_ARM && arm_arch_arm_hwdiv) \
28457
|| (TARGET_THUMB2 && arm_arch_thumb_hwdiv))
28459
+/* Should NEON be used for 64-bits bitops. */
28460
+#define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits)
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;
28469
+/* Nonzero if we should use Neon to handle 64-bits operations rather
28470
+ than core registers. */
28471
+extern int prefer_neon_for_64bits;
28473
#ifndef TARGET_DEFAULT
28474
#define TARGET_DEFAULT (MASK_APCS_FRAME)
28476
@@ -630,6 +645,8 @@
28478
#define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
28480
+#define MALLOC_ABI_ALIGNMENT BIGGEST_ALIGNMENT
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)
28492
/* Modes valid for Neon Q registers. */
28493
#define VALID_NEON_QREG_MODE(MODE) \
28494
@@ -1130,6 +1147,7 @@
28498
+ CALLER_SAVE_REGS,
28502
@@ -1156,6 +1174,7 @@
28506
+ "CALLER_SAVE_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 @@
28520
#define EXIT_IGNORE_STACK 1
28522
-#define EPILOGUE_USES(REGNO) ((REGNO) == LR_REGNUM)
28523
+#define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == LR_REGNUM)
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")
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")
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")
28556
;; Move instructions.
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")
28566
;; Exceptions to the default latencies for data processing instructions.
28567
@@ -139,22 +136,22 @@
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")
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")
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")
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")
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")
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.
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")))]
28616
"add%?\\t%0, %1, %2"
28617
- [(set_attr "predicable" "yes")])
28618
+ [(set_attr "predicable" "yes")
28619
+ (set_attr "predicable_short_it" "yes,no")])
28621
(define_insn "add<mode>3"
28622
[(set (match_operand:ADDSUB 0 "s_register_operand" "=r")
28624
(match_operand:ADDSUB 2 "s_register_operand" "r")))]
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")])
28631
(define_insn "usadd<mode>3"
28632
[(set (match_operand:UQADDSUB 0 "s_register_operand" "=r")
28634
(match_operand:UQADDSUB 2 "s_register_operand" "r")))]
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")])
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")))]
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")])
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")))]
28659
"sub%?\\t%0, %1, %2"
28660
- [(set_attr "predicable" "yes")])
28661
+ [(set_attr "predicable" "yes")
28662
+ (set_attr "predicable_short_it" "yes,no")])
28664
(define_insn "sub<mode>3"
28665
[(set (match_operand:ADDSUB 0 "s_register_operand" "=r")
28667
(match_operand:ADDSUB 2 "s_register_operand" "r")))]
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")])
28674
(define_insn "ussub<mode>3"
28675
[(set (match_operand:UQADDSUB 0 "s_register_operand" "=r")
28677
(match_operand:UQADDSUB 2 "s_register_operand" "r")))]
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")])
28684
(define_insn "sssub<mode>3"
28685
[(set (match_operand:QADDSUB 0 "s_register_operand" "=r")
28687
(match_operand:QADDSUB 2 "s_register_operand" "r")))]
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")])
28694
;; Fractional multiplies.
28697
rtx tmp1 = gen_reg_rtx (HImode);
28698
rtx tmp2 = gen_reg_rtx (HImode);
28699
rtx tmp3 = gen_reg_rtx (SImode);
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);
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);
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);
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));
28739
@@ -209,7 +217,7 @@
28743
- 31 high word 0 31 low word 0
28744
+ 31 high word 0 31 low word 0
28746
[ S i i .... i i i ] [ i f f f ... f f ]
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)
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);
28763
+ if (TARGET_THUMB2)
28764
+ output_asm_insn ("it\\tne", operands);
28765
+ output_asm_insn ("mvnne\\t%Q3, %R3, asr #32", operands);
28767
output_asm_insn ("mov\\t%0, %Q3, lsr #15", operands);
28768
output_asm_insn ("orr\\t%0, %0, %R3, asl #17", operands);
28770
@@ -231,7 +248,9 @@
28771
[(set_attr "conds" "clob")
28772
(set (attr "length")
28773
(if_then_else (eq_attr "is_thumb" "yes")
28775
+ (if_then_else (match_test "arm_restrict_it")
28780
;; Same goes for this.
28781
@@ -257,7 +276,7 @@
28785
- 31 high word 0 31 low word 0
28786
+ 31 high word 0 31 low word 0
28788
[ i i i .... i i i ] [ f f f f ... f f ]
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)
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);
28805
+ if (TARGET_THUMB2)
28806
+ output_asm_insn ("it\\tne", operands);
28807
+ output_asm_insn ("sbfxne\\t%Q3, %R3, #15, #1", operands);
28809
output_asm_insn ("lsr\\t%0, %Q3, #16", operands);
28810
output_asm_insn ("orr\\t%0, %0, %R3, asl #16", operands);
28812
@@ -279,7 +307,9 @@
28813
[(set_attr "conds" "clob")
28814
(set (attr "length")
28815
(if_then_else (eq_attr "is_thumb" "yes")
28817
+ (if_then_else (match_test "arm_restrict_it")
28822
(define_expand "mulha3"
28823
@@ -289,7 +319,7 @@
28824
"TARGET_DSP_MULTIPLY && arm_arch_thumb2"
28826
rtx tmp = gen_reg_rtx (SImode);
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);
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 @@
28843
rtx tmp = gen_reg_rtx (SImode);
28847
emit_insn (gen_mulhisi3 (tmp, gen_lowpart (HImode, operands[1]),
28848
gen_lowpart (HImode, operands[2])));
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);
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])));
28862
emit_insn (gen_mulsi3 (tmp3, tmp1, tmp2));
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")])
28875
(define_insn "arm_usatsihi"
28876
[(set (match_operand:HI 0 "s_register_operand" "=r")
28877
@@ -384,4 +414,5 @@
28879
"usat%?\\t%0, #16, %1"
28880
[(set_attr "predicable" "yes")
28881
- (set_attr "insn" "sat")])
28882
+ (set_attr "predicable_short_it" "no")]
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.
28896
;; Enumerators for NEON unspecs.
28897
--- a/src/gcc/config/arm/cortex-m4.md
28898
+++ b/src/gcc/config/arm/cortex-m4.md
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"))))
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)
28919
+#undef ASAN_CC1_SPEC
28920
+#define ASAN_CC1_SPEC "%{fsanitize=*:-funwind-tables}"
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)
28930
#define CC1PLUS_SPEC \
28931
LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_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)
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"))
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"))
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"))
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")
28985
;; An ALU instruction followed by an ALU instruction with no early dep.
28986
@@ -128,32 +126,32 @@
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"))
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"))
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"))
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"))
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"))
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"))
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"))
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")
29039
;; Branches. We assume correct prediction.
29040
--- a/src/gcc/config/arm/arm-tune.md
29041
+++ b/src/gcc/config/arm/arm-tune.md
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 @@
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 *);
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,
29084
@@ -224,6 +228,8 @@
29086
extern void arm_order_regs_for_local_alloc (void);
29088
+extern int arm_max_conditional_execute ();
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;
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;
29111
extern const struct tune_params *current_tune;
29112
--- a/src/gcc/config/arm/vfp.md
29113
+++ b/src/gcc/config/arm/vfp.md
29115
;; along with GCC; see the file COPYING3. If not see
29116
;; <http://www.gnu.org/licenses/>. */
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
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 @@
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,*")]
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))"
29172
switch (which_alternative)
29178
return \"mov%?\\t%0, %1\";
29181
return \"mvn%?\\t%0, #%B1\";
29184
return \"movw%?\\t%0, %1\";
29188
return \"ldr%?\\t%0, %1\";
29192
return \"str%?\\t%1, %0\";
29195
return \"fmsr%?\\t%0, %1\\t%@ int\";
29198
return \"fmrs%?\\t%0, %1\\t%@ int\";
29201
return \"fcpys%?\\t%0, %1\\t%@ int\";
29202
- case 11: case 12:
29203
+ case 12: case 13:
29204
return output_move_vfp (operands);
29206
gcc_unreachable ();
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,*")]
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 @@
29236
[(set_attr "predicable" "yes")
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,*,*,*")]
29245
@@ -412,15 +391,14 @@
29248
[(set_attr "predicable" "yes")
29249
+ (set_attr "predicable_short_it" "no")
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,*,*,*")]
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"
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"
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"
29284
[(set_attr "predicable" "yes")
29285
+ (set_attr "predicable_short_it" "no")
29286
(set_attr "type" "ffariths")]
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")]
29297
@@ -644,6 +624,7 @@
29299
eor%?\\t%0, %1, #-2147483648"
29300
[(set_attr "predicable" "yes")
29301
+ (set_attr "predicable_short_it" "no")
29302
(set_attr "type" "ffariths")]
29305
@@ -689,6 +670,7 @@
29308
[(set_attr "predicable" "yes")
29309
+ (set_attr "predicable_short_it" "no")
29310
(set_attr "length" "4,4,8")
29311
(set_attr "type" "ffarithd")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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>")]
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>")]
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>")]
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>")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
29601
@@ -1168,6 +1186,7 @@
29604
[(set_attr "predicable" "yes")
29605
+ (set_attr "predicable_short_it" "no")
29606
(set_attr "type" "fcmps")]
29609
@@ -1180,6 +1199,7 @@
29612
[(set_attr "predicable" "yes")
29613
+ (set_attr "predicable_short_it" "no")
29614
(set_attr "type" "fcmps")]
29617
@@ -1192,6 +1212,7 @@
29620
[(set_attr "predicable" "yes")
29621
+ (set_attr "predicable_short_it" "no")
29622
(set_attr "type" "fcmpd")]
29625
@@ -1204,6 +1225,7 @@
29626
fcmped%?\\t%P0, %P1
29628
[(set_attr "predicable" "yes")
29629
+ (set_attr "predicable_short_it" "no")
29630
(set_attr "type" "fcmpd")]
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>")]
29641
--- a/src/gcc/config/arm/t-linux-eabi
29642
+++ b/src/gcc/config/arm/t-linux-eabi
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.
29650
MULTILIB_DIRNAMES =
29652
--- a/src/gcc/config/arm/neon.md
29653
+++ b/src/gcc/config/arm/neon.md
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 @@
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,*,*,*")]
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")]
29691
(define_insn "*mul<mode>3_neon"
29692
@@ -679,29 +677,6 @@
29693
[(set_attr "neon_type" "neon_int_1")]
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")))]
29702
- switch (which_alternative)
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 ();
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")]
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")]
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")))]
29732
- switch (which_alternative)
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 ();
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")]
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")]
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")))]
29762
- veor\t%P0, %P1, %P2
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")]
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 @@
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,*,*")]
29783
@@ -1263,7 +1200,7 @@
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,*,*")]
29792
@@ -3305,6 +3242,24 @@
29793
(const_string "neon_fp_vadd_qqq_vabs_qq")))]
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")]
29800
+ "TARGET_NEON && TARGET_FP16"
29801
+ "vcvt.f32.f16\t%q0, %P1"
29802
+ [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")]
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")]
29809
+ "TARGET_NEON && TARGET_FP16"
29810
+ "vcvt.f16.f32\t%P0, %q1"
29811
+ [(set_attr "neon_type" "neon_fp_vadd_ddd_vabs_dd")]
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 @@
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")))]
29827
- if (GET_MODE_NUNITS (<MODE>mode) > 1)
29828
- return "vld1.<V_sz_elem>\t{%P0[]}, %A1";
29830
- return "vld1.<V_sz_elem>\t%h0, %A1";
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")]
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" "")]
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" "")]
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]));
29861
@@ -5646,7 +5602,7 @@
29862
(match_operand:SI 3 "immediate_operand" "")]
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]));
29870
@@ -5657,7 +5613,7 @@
29871
(match_operand:SI 3 "immediate_operand" "")]
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]));
29879
--- a/src/gcc/config/arm/ldmstm.md
29880
+++ b/src/gcc/config/arm/ldmstm.md
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")])
29889
(define_insn "*thumb_ldm4_ia"
29890
[(match_parallel 0 "load_multiple_operation"
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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
30124
+/* NEON builtin definitions for ARM.
30125
+ Copyright (C) 2013
30126
+ Free Software Foundation, Inc.
30127
+ Contributed by ARM Ltd.
30129
+ This file is part of GCC.
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.
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.
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/>. */
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),
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),
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
30339
<http://www.gnu.org/licenses/>. *)
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
30348
| T_uint16x4 | T_uint16x8
30349
| T_uint32x2 | T_uint32x4
30350
| T_uint64x1 | T_uint64x2
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
30364
| T_intHI | T_intSI
30365
- | T_intDI | T_floatSF
30366
+ | T_intDI | T_floatHF
30369
(* The meanings of the following are:
30370
TImode : "Tetra", two registers (four words).
30372
| Arity3 of vectype * vectype * vectype * vectype
30373
| Arity4 of vectype * vectype * vectype * vectype * vectype
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
30380
@@ -284,18 +287,22 @@
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
30388
+ | Requires_FP_bit of int
30390
exception MixedMode of elts * elts
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
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"
30405
@@ -303,7 +310,7 @@
30406
S8 | S16 | S32 | S64 -> Signed
30407
| U8 | U16 | U32 | U64 -> Unsigned
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
30420
| Unsigned, 8 -> U8
30421
| Unsigned, 16 -> U16
30422
@@ -384,7 +392,12 @@
30424
scan ((Array.length operands) - 1)
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. *)
30432
+let rec mode_of_elt ?argpos elt shape =
30433
let flt = match elt_class elt with
30434
Float | ConvClass(_, Float) -> true | _ -> false in
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)
30442
+ [| V8QI; V4HF; V2SF; DI |].(idx)
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 @@
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)))
30458
| _ -> failwith "invalid shape"
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
30468
| P16 -> T_poly16x4
30469
- | _ -> failwith "Bad elt type"
30470
+ | _ -> failwith "Bad elt type for Dreg"
30473
begin match elt with
30474
@@ -472,7 +493,7 @@
30475
| F32 -> T_float32x4
30477
| P16 -> T_poly16x8
30478
- | _ -> failwith "Bad elt type"
30479
+ | _ -> failwith "Bad elt type for Qreg"
30482
begin match elt with
30483
@@ -487,7 +508,7 @@
30487
- | _ -> failwith "Bad elt type"
30488
+ | _ -> failwith "Bad elt type for Corereg"
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"
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"
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"
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"
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"
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
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.
30572
(define_register_constraint "k" "STACK_REG"
30573
"@internal The stack register.")
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.")
30578
(define_register_constraint "b" "TARGET_THUMB ? BASE_REGS : NO_REGS"
30580
Thumb only. The union of the low registers and the stack register.")
30582
(define_register_constraint "c" "CC_REG"
30583
"@internal The condition code register.")
30585
+(define_register_constraint "Cs" "CALLER_SAVE_REGS"
30586
+ "@internal The caller save registers. Useful for sibcalls.")
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")))
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")))
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")))
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)")))
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)")))
30619
+(define_constraint "De"
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)")))
30625
+(define_constraint "Df"
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)")))
30631
+(define_constraint "Dg"
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)")))
30637
(define_constraint "Di"
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)")))
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.")
30647
(define_memory_constraint "Ua"
30649
An address valid for loading/storing register exclusive"
30650
@@ -385,9 +417,16 @@
30652
&& GET_CODE (XEXP (op, 0)) != POST_INC")))
30654
+(define_constraint "US"
30656
+ US is a symbol reference."
30657
+ (match_code "symbol_ref")
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.
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.
30667
--- a/src/gcc/config/arm/cortex-a7.md
30668
+++ b/src/gcc/config/arm/cortex-a7.md
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")))
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")))
30700
@@ -127,8 +129,9 @@
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"))))
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")
30720
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30721
--- a/src/gcc/config/arm/arm-arches.def
30722
+++ b/src/gcc/config/arm/arm-arches.def
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
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 \
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 \
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
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.
30766
+Target Report Var(arm_restrict_it) Init(2)
30767
+Generate IT blocks appropriate for ARMv8.
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 @@
30774
Target Report Var(unaligned_access) Init(2)
30775
Enable unaligned word and halfword accesses to packed data.
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
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"))
30792
;; ALU operations with a shift-by-register operand
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"))
30801
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30802
@@ -81,32 +83,32 @@
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"))
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"))
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"))
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"))
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"))
30834
(define_insn_reservation "9_mult6" 3
30835
(and (eq_attr "tune" "arm926ejs")
30836
- (eq_attr "insn" "smlalxy"))
30837
+ (eq_attr "type" "smlalxy"))
30840
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30841
--- a/src/gcc/config/arm/ldrdstrd.md
30842
+++ b/src/gcc/config/arm/ldrdstrd.md
30844
+;; ARM ldrd/strd peephole optimizations.
30846
+;; Copyright (C) 2013 Free Software Foundation, Inc.
30848
+;; Written by Greta Yorsh <greta.yorsh@arm.com>
30850
+;; This file is part of GCC.
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.
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.
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/>.
30866
+;; The following peephole optimizations identify consecutive memory
30867
+;; accesses, and try to rearrange the operands to enable generation of
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" ""))]
30876
+ && current_tune->prefer_ldrd_strd
30877
+ && !optimize_function_for_size_p (cfun)"
30880
+ if (!gen_operands_ldrd_strd (operands, true, false, false))
30882
+ else if (TARGET_ARM)
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]));
30892
+ else if (TARGET_THUMB2)
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)));
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" ""))]
30910
+ && current_tune->prefer_ldrd_strd
30911
+ && !optimize_function_for_size_p (cfun)"
30914
+ if (!gen_operands_ldrd_strd (operands, false, false, false))
30916
+ else if (TARGET_ARM)
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]));
30926
+ else if (TARGET_THUMB2)
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)));
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" "")
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" "")
30949
+ && current_tune->prefer_ldrd_strd
30950
+ && !optimize_function_for_size_p (cfun)"
30953
+ if (!gen_operands_ldrd_strd (operands, false, true, false))
30955
+ else if (TARGET_ARM)
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));
30968
+ else if (TARGET_THUMB2)
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)));
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" "")
30991
+ (set (match_operand:SI 3 "memory_operand" "")
30994
+ && current_tune->prefer_ldrd_strd
30995
+ && !optimize_function_for_size_p (cfun)"
30998
+ if (!gen_operands_ldrd_strd (operands, false, true, false))
31000
+ else if (TARGET_ARM)
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));
31013
+ else if (TARGET_THUMB2)
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)));
31029
+;; The following two peephole optimizations are only relevant for ARM
31030
+;; mode where LDRD/STRD require consecutive registers.
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)]))]
31052
+ if (!gen_operands_ldrd_strd (operands, true, false, true))
31058
+ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
31059
+ operands[2] = adjust_address (operands[2], DImode, 0);
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" ""))
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))
31085
+ [(set (match_dup 4)
31086
+ (match_op_dup 5 [(match_dup 6) (match_dup 7)]))
31087
+ (clobber (reg:CC CC_REGNUM))])]
31089
+ if (!gen_operands_ldrd_strd (operands, true, false, true))
31095
+ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
31096
+ operands[2] = adjust_address (operands[2], DImode, 0);
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
31107
|| REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
31110
+(define_predicate "imm_for_neon_inv_logic_operand"
31111
+ (match_code "const_vector")
31113
+ return (TARGET_NEON
31114
+ && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL));
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")))
31121
+(define_predicate "imm_for_neon_logic_operand"
31122
+ (match_code "const_vector")
31124
+ return (TARGET_NEON
31125
+ && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL));
31128
+(define_predicate "neon_logic_op2"
31129
+ (ior (match_operand 0 "imm_for_neon_logic_operand")
31130
+ (match_operand 0 "s_register_operand")))
31132
;; Any hard register.
31133
(define_predicate "arm_hard_register_operand"
31135
@@ -145,6 +167,23 @@
31136
(ior (match_operand 0 "arm_rhs_operand")
31137
(match_operand 0 "arm_neg_immediate_operand")))
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")))
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")))
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)"))))
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)")))
31163
+(define_special_predicate "shiftable_operator_strict_it"
31164
+ (and (match_code "plus,and")
31165
+ (match_test "mode == GET_MODE (op)")))
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"))
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")))
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")))
31192
(define_special_predicate "noov_comparison_operator"
31193
(match_code "lt,ge,eq,ne"))
31195
@@ -506,28 +567,6 @@
31196
(ior (match_operand 0 "s_register_operand")
31197
(match_operand 0 "imm_for_neon_rshift_operand")))
31199
-(define_predicate "imm_for_neon_logic_operand"
31200
- (match_code "const_vector")
31202
- return (TARGET_NEON
31203
- && neon_immediate_valid_for_logic (op, mode, 0, NULL, NULL));
31206
-(define_predicate "imm_for_neon_inv_logic_operand"
31207
- (match_code "const_vector")
31209
- return (TARGET_NEON
31210
- && neon_immediate_valid_for_logic (op, mode, 1, NULL, NULL));
31213
-(define_predicate "neon_logic_op2"
31214
- (ior (match_operand 0 "imm_for_neon_logic_operand")
31215
- (match_operand 0 "s_register_operand")))
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")))
31221
;; Predicates for named expanders that overlap multiple ISAs.
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")))
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
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);
31246
+#if ((__ARM_FP & 0x2) != 0)
31247
+__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
31248
+vcvt_f16_f32 (float32x4_t __a)
31250
+ return (float16x4_t)__builtin_neon_vcvtv4hfv4sf (__a);
31254
+#if ((__ARM_FP & 0x2) != 0)
31255
+__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
31256
+vcvt_f32_f16 (float16x4_t __a)
31258
+ return (float32x4_t)__builtin_neon_vcvtv4sfv4hf (__a);
31262
__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
31263
vcvt_n_s32_f32 (float32x2_t __a, const int __b)
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
31271
+exception InvalidAddrMode of string;;
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.")
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 @@
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\")";
31293
Printf.printf "])\n\n"
31295
--- a/src/gcc/config/arm/iwmmxt.md
31296
+++ b/src/gcc/config/arm/iwmmxt.md
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")]
31305
(define_insn "tbcstv4hi"
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")]
31314
(define_insn "tbcstv2si"
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")]
31323
(define_insn "iwmmxt_iordi3"
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,*,*")]
31332
(define_insn "iwmmxt_xordi3"
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,*,*")]
31341
(define_insn "iwmmxt_anddi3"
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,*,*")]
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")]
31359
(define_insn "*iwmmxt_arm_movdi"
31360
@@ -155,10 +155,9 @@
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,*")]
31372
(define_insn "*iwmmxt_movsi_insn"
31373
@@ -188,7 +187,7 @@
31375
gcc_unreachable ();
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
31386
- (set_attr "conds" "clob")
31387
- (set_attr "wtype" "*,*,*,*,*,*,tmcr,tmrc,wldr,wstr,*,*,*,*,*")]
31388
+ (set_attr "conds" "clob")]
31391
;; Because iwmmxt_movsi_insn is not predicable, we provide the
31392
@@ -249,10 +247,9 @@
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,*")]
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")]
31413
(define_insn "*ior<mode>3_iwmmxt"
31414
@@ -328,7 +325,7 @@
31415
"TARGET_REALLY_IWMMXT"
31417
[(set_attr "predicable" "yes")
31418
- (set_attr "wtype" "wor")]
31419
+ (set_attr "type" "wmmx_wor")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
31692
;; Insert/extract/shuffle
31693
@@ -690,7 +687,7 @@
31696
[(set_attr "predicable" "yes")
31697
- (set_attr "wtype" "tinsr")]
31698
+ (set_attr "type" "wmmx_tinsr")]
31701
(define_insn "iwmmxt_tinsrh"
31702
@@ -707,7 +704,7 @@
31705
[(set_attr "predicable" "yes")
31706
- (set_attr "wtype" "tinsr")]
31707
+ (set_attr "type" "wmmx_tinsr")]
31710
(define_insn "iwmmxt_tinsrw"
31711
@@ -724,7 +721,7 @@
31714
[(set_attr "predicable" "yes")
31715
- (set_attr "wtype" "tinsr")]
31716
+ (set_attr "type" "wmmx_tinsr")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
32107
@@ -1298,7 +1295,7 @@
32109
[(set_attr "predicable" "yes")
32110
(set_attr "arch" "*, iwmmxt2")
32111
- (set_attr "wtype" "wror, wror")]
32112
+ (set_attr "type" "wmmx_wror, wmmx_wror")]
32115
(define_insn "ashr<mode>3_iwmmxt"
32116
@@ -1319,7 +1316,7 @@
32118
[(set_attr "predicable" "yes")
32119
(set_attr "arch" "*, iwmmxt2")
32120
- (set_attr "wtype" "wsra, wsra")]
32121
+ (set_attr "type" "wmmx_wsra, wmmx_wsra")]
32124
(define_insn "lshr<mode>3_iwmmxt"
32125
@@ -1340,7 +1337,7 @@
32127
[(set_attr "predicable" "yes")
32128
(set_attr "arch" "*, iwmmxt2")
32129
- (set_attr "wtype" "wsrl, wsrl")]
32130
+ (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
32133
(define_insn "ashl<mode>3_iwmmxt"
32134
@@ -1361,7 +1358,7 @@
32136
[(set_attr "predicable" "yes")
32137
(set_attr "arch" "*, iwmmxt2")
32138
- (set_attr "wtype" "wsll, wsll")]
32139
+ (set_attr "type" "wmmx_wsll, wmmx_wsll")]
32142
(define_insn "ror<mode>3_di"
32143
@@ -1382,7 +1379,7 @@
32145
[(set_attr "predicable" "yes")
32146
(set_attr "arch" "*, iwmmxt2")
32147
- (set_attr "wtype" "wror, wror")]
32148
+ (set_attr "type" "wmmx_wror, wmmx_wror")]
32151
(define_insn "ashr<mode>3_di"
32152
@@ -1403,7 +1400,7 @@
32154
[(set_attr "predicable" "yes")
32155
(set_attr "arch" "*, iwmmxt2")
32156
- (set_attr "wtype" "wsra, wsra")]
32157
+ (set_attr "type" "wmmx_wsra, wmmx_wsra")]
32160
(define_insn "lshr<mode>3_di"
32161
@@ -1424,7 +1421,7 @@
32163
[(set_attr "predicable" "yes")
32164
(set_attr "arch" "*, iwmmxt2")
32165
- (set_attr "wtype" "wsrl, wsrl")]
32166
+ (set_attr "type" "wmmx_wsrl, wmmx_wsrl")]
32169
(define_insn "ashl<mode>3_di"
32170
@@ -1445,7 +1442,7 @@
32172
[(set_attr "predicable" "yes")
32173
(set_attr "arch" "*, iwmmxt2")
32174
- (set_attr "wtype" "wsll, wsll")]
32175
+ (set_attr "type" "wmmx_wsll, wmmx_wsll")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
32277
(define_insn "iwmmxt_waccb"
32278
@@ -1616,7 +1613,7 @@
32279
"TARGET_REALLY_IWMMXT"
32281
[(set_attr "predicable" "yes")
32282
- (set_attr "wtype" "wacc")]
32283
+ (set_attr "type" "wmmx_wacc")]
32286
(define_insn "iwmmxt_wacch"
32287
@@ -1625,7 +1622,7 @@
32288
"TARGET_REALLY_IWMMXT"
32290
[(set_attr "predicable" "yes")
32291
- (set_attr "wtype" "wacc")]
32292
+ (set_attr "type" "wmmx_wacc")]
32295
(define_insn "iwmmxt_waccw"
32296
@@ -1634,7 +1631,7 @@
32297
"TARGET_REALLY_IWMMXT"
32299
[(set_attr "predicable" "yes")
32300
- (set_attr "wtype" "wacc")]
32301
+ (set_attr "type" "wmmx_wacc")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
32394
(include "iwmmxt2.md")
32395
--- a/src/gcc/config/arm/cortex-a53.md
32396
+++ b/src/gcc/config/arm/cortex-a53.md
32398
+;; ARM Cortex-A53 pipeline description
32399
+;; Copyright (C) 2013 Free Software Foundation, Inc.
32401
+;; Contributed by ARM Ltd.
32403
+;; This file is part of GCC.
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.
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.
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/>.
32419
+(define_automaton "cortex_a53")
32421
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32422
+;; Functional units.
32423
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32425
+;; There are two main integer execution pipelines, described as
32426
+;; slot 0 and issue slot 1.
32428
+(define_cpu_unit "cortex_a53_slot0" "cortex_a53")
32429
+(define_cpu_unit "cortex_a53_slot1" "cortex_a53")
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")
32434
+;; The load/store pipeline. Load/store instructions can dual-issue from
32435
+;; either pipeline, but two load/stores cannot simultaneously issue.
32437
+(define_cpu_unit "cortex_a53_ls" "cortex_a53")
32439
+;; The store pipeline. Shared between both execution pipelines.
32441
+(define_cpu_unit "cortex_a53_store" "cortex_a53")
32443
+;; The branch pipeline. Branches can dual-issue with other instructions
32444
+;; (except when those instructions take multiple cycles to issue).
32446
+(define_cpu_unit "cortex_a53_branch" "cortex_a53")
32448
+;; The integer divider.
32450
+(define_cpu_unit "cortex_a53_idiv" "cortex_a53")
32452
+;; The floating-point add pipeline used to model the usage
32453
+;; of the add pipeline by fmac instructions.
32455
+(define_cpu_unit "cortex_a53_fpadd_pipe" "cortex_a53")
32457
+;; Floating-point div/sqrt (long latency, out-of-order completion).
32459
+(define_cpu_unit "cortex_a53_fp_div_sqrt" "cortex_a53")
32461
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32462
+;; ALU instructions.
32463
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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")
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")
32478
+;; Forwarding path for unshifted operands.
32480
+(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift"
32481
+ "cortex_a53_alu")
32483
+(define_bypass 1 "cortex_a53_alu,cortex_a53_alu_shift"
32484
+ "cortex_a53_alu_shift"
32485
+ "arm_no_early_alu_shift_dep")
32487
+;; The multiplier pipeline can forward results so there's no need to specify
32488
+;; bypasses. Multiplies can only single-issue currently.
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")
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.
32500
+(define_bypass 1 "cortex_a53_mul"
32502
+ "arm_mac_accumulator_is_mul_result")
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")
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")
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")
32522
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32523
+;; Load/store instructions.
32524
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32526
+;; Address-generation happens in the issue stage.
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
32582
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32584
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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")
32595
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32596
+;; Floating-point arithmetic.
32597
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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,\
32603
+ "cortex_a53_slot0+cortex_a53_fpadd_pipe")
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")
32610
+(define_insn_reservation "cortex_a53_fpmul" 4
32611
+ (and (eq_attr "tune" "cortexa53")
32612
+ (eq_attr "type" "fmuls,fmuld"))
32613
+ "cortex_a53_slot0")
32615
+;; For single-precision multiply-accumulate, the add (accumulate) is issued after
32616
+;; the multiply completes. Model that accordingly.
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")
32623
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32624
+;; Floating-point divide/square root instructions.
32625
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32626
+;; fsqrt really takes one cycle less, but that is not modelled.
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")
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")
32638
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32639
+;; VFP to/from core transfers.
32640
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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")
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")
32652
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32653
+;; VFP flag transfer.
32654
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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")
32661
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32662
+;; VFP load/store.
32663
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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")
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")
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")
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")
32685
+;; Load-to-use for floating-point values has a penalty of one cycle,
32686
+;; i.e. a latency of two.
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,\
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,\
32698
--- a/src/gcc/config/arm/bpabi.h
32699
+++ b/src/gcc/config/arm/bpabi.h
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 \
32709
" %{mbig-endian:%{march=armv7-a|mcpu=cortex-a5 \
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
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"))
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"))
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,\
32740
(const_string "yes") (const_string "no"))
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"))
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"))
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"))
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"))
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"))
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"))
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"))
32791
@@ -169,11 +179,11 @@
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")
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
32822
(set_attr "conds" "unconditional")
32823
(set_attr "predicable" "no")])
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
32831
+ "TARGET_HAVE_LDACQ"
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\";
32839
+ return \"lda<sync_sfx>\\t%0, %1\";
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
32849
+ "TARGET_HAVE_LDACQ"
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\";
32857
+ return \"stl<sync_sfx>\t%1, %0\";
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
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")])
32872
(define_expand "atomic_compare_and_swap<mode>"
32873
[(match_operand:SI 0 "s_register_operand" "") ;; bool out
32874
@@ -325,8 +362,20 @@
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")])
32882
+(define_insn "arm_load_acquire_exclusive<mode>"
32883
+ [(set (match_operand:SI 0 "s_register_operand" "=r")
32885
+ (unspec_volatile:NARROW
32886
+ [(match_operand:NARROW 1 "mem_noofs_operand" "Ua")]
32888
+ "TARGET_HAVE_LDACQ"
32889
+ "ldaex<sync_sfx>%?\\t%0, %C1"
32890
+ [(set_attr "predicable" "yes")
32891
+ (set_attr "predicable_short_it" "no")])
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 @@
32898
"TARGET_HAVE_LDREX"
32900
- [(set_attr "predicable" "yes")])
32901
+ [(set_attr "predicable" "yes")
32902
+ (set_attr "predicable_short_it" "no")])
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")]
32909
+ "TARGET_HAVE_LDACQ"
32910
+ "ldaex%?\t%0, %C1"
32911
+ [(set_attr "predicable" "yes")
32912
+ (set_attr "predicable_short_it" "no")])
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 @@
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")])
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")]
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")])
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 @@
32940
return "strex<sync_sfx>%?\t%0, %2, %C1";
32942
- [(set_attr "predicable" "yes")])
32943
+ [(set_attr "predicable" "yes")
32944
+ (set_attr "predicable_short_it" "no")])
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")]
32953
+ "TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN"
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";
32961
+ [(set_attr "predicable" "yes")
32962
+ (set_attr "predicable_short_it" "no")])
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")]
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
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"
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)")
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)")
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)")
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 @@
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")
33037
--- a/src/gcc/config/arm/arm.md
33038
+++ b/src/gcc/config/arm/arm.md
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")))
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"))
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"))
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))
33056
(define_attr "fpu" "none,vfp"
33057
(const (symbol_ref "arm_fpu_attr")))
33059
+(define_attr "predicated" "yes,no" (const_string "no"))
33061
; LENGTH of an instruction (in bytes)
33062
(define_attr "length" ""
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"))
33072
(define_attr "arch_enabled" "no,yes"
33073
@@ -129,24 +140,16 @@
33074
(match_test "TARGET_32BIT && !arm_arch6"))
33075
(const_string "yes")
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")
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")
33092
- (and (eq_attr "arch" "nota8")
33093
- (not (eq_attr "tune" "cortexa8")))
33094
- (const_string "yes")
33096
- (and (eq_attr "arch" "neon_nota8")
33097
- (not (eq_attr "tune" "cortexa8"))
33098
- (match_test "TARGET_NEON"))
33099
- (const_string "yes")
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")
33108
+ (and (eq_attr "predicable_short_it" "no")
33109
+ (and (eq_attr "predicated" "yes")
33110
+ (match_test "arm_restrict_it")))
33111
+ (const_string "no")
33113
+ (and (eq_attr "enabled_for_depr_it" "no")
33114
+ (match_test "arm_restrict_it"))
33115
+ (const_string "no")
33117
(eq_attr "arch_enabled" "no")
33118
(const_string "no")
33120
@@ -214,126 +226,340 @@
33121
(set_attr "length" "4")
33122
(set_attr "pool_range" "250")])
33124
-;; The instruction used to implement a particular pattern. This
33125
-;; information is used by pipeline descriptions to provide accurate
33126
-;; scheduling information.
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"))
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.
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
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
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.
33177
+; Instruction classification:
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
33188
+; arlo_shift_reg as arlo_shift, with the shift amount specified in a
33190
+; block blockage insn, this blocks all functional units.
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
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.
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.
33336
(define_attr "type"
33337
- "simple_alu_imm,\
33339
- simple_alu_shift,\
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")))
33530
+ (const_string "arlo_reg"))
33532
+; Is this an (integer side) multiply with a 32-bit (or smaller) result?
33533
+(define_attr "mul32" "no,yes"
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")))
33541
; Is this an (integer side) multiply with a 64-bit result?
33542
(define_attr "mul64" "no,yes"
33545
- "smlalxy,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals")
33547
+ "smlalxy,umull,umulls,umaal,umlal,umlals,smull,smulls,smlal,smlals")
33548
(const_string "yes")
33549
(const_string "no")))
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"))
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")))
33581
@@ -502,7 +738,7 @@
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")))]
33622
+ add%?\\t%0, %1, %2
33623
+ add%?\\t%0, %1, %2
33624
+ add%?\\t%0, %1, %2
33626
addw%?\\t%0, %1, %2
33627
addw%?\\t%0, %1, %2
33628
@@ -725,12 +965,13 @@
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")))
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,*")]
33654
(define_insn "*addsi3_compare0_scratch"
33655
@@ -827,24 +1068,27 @@
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,*")
33664
(define_insn "*compare_negsi_si"
33665
[(set (reg:CC_Z CC_REGNUM)
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")))]
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")]
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)
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,*")]
33696
(define_insn "*addsi3_compare_op2"
33697
@@ -931,63 +1175,84 @@
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,*")]
33705
(define_insn "*compare_addsi2_op0"
33706
[(set (reg:CC_C CC_REGNUM)
33708
- (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r")
33709
- (match_operand:SI 1 "arm_add_operand" "I,L,r"))
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"))
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,*")]
33731
(define_insn "*compare_addsi2_op1"
33732
[(set (reg:CC_C CC_REGNUM)
33734
- (plus:SI (match_operand:SI 0 "s_register_operand" "r,r,r")
33735
- (match_operand:SI 1 "arm_add_operand" "I,L,r"))
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"))
33748
[(set_attr "conds" "set")
33749
(set_attr "predicable" "yes")
33750
- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
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")
33756
+ "arlo_imm,*,arlo_imm,arlo_imm,*")]
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))))]
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")]
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")))]
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")]
33803
(define_insn "*addsi3_carryin_shift_<optab>"
33804
@@ -1001,9 +1266,11 @@
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")))]
33817
(define_insn "*addsi3_carryin_clobercc_<optab>"
33818
@@ -1017,26 +1284,89 @@
33819
[(set_attr "conds" "set")]
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))))]
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")]
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))))]
33853
+ "sbc\\t%0, %1, #%B2"
33854
+ [(set_attr "conds" "use")]
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)
33864
+ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
33866
+ "sbcs\\t%0, %1, %2"
33867
+ [(set_attr "conds" "set")]
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)
33877
+ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
33879
+ "sbcs\\t%0, %1, #%B2"
33880
+ [(set_attr "conds" "set")]
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))))]
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")))]
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))))]
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")))]
33921
; transform ((x << y) - 1) to ~(~(x-1) << y) Where X is a constant.
33922
@@ -1087,13 +1417,27 @@
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))))]
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]);
33949
[(set_attr "conds" "clob")
33950
(set_attr "length" "8")]
33952
@@ -1108,55 +1452,113 @@
33953
[(set_attr "length" "4")]
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")
33961
(match_operand:SI 2 "s_register_operand" "r,r"))))
33962
(clobber (reg:CC CC_REGNUM))]
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))))]
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);
33979
[(set_attr "conds" "clob")
33980
(set_attr "length" "8")]
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")
33988
(match_operand:SI 2 "s_register_operand" "r,r"))))
33989
(clobber (reg:CC CC_REGNUM))]
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)
34000
+ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
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]);
34007
[(set_attr "conds" "clob")
34008
(set_attr "length" "8")]
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))]
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))))]
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]);
34035
[(set_attr "conds" "clob")
34036
(set_attr "length" "8")]
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))]
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)
34059
+ (ltu:SI (reg:CC_C CC_REGNUM) (const_int 0))))]
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]);
34066
[(set_attr "conds" "clob")
34067
(set_attr "length" "8")]
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))]
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))))]
34088
+ operands[3] = gen_highpart (SImode, operands[0]);
34089
+ operands[0] = gen_lowpart (SImode, operands[0]);
34091
[(set_attr "conds" "clob")
34092
(set_attr "length" "8")]
34094
@@ -1201,12 +1613,16 @@
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")))]
34106
+ sub%?\\t%0, %1, %2
34108
+ sub%?\\t%0, %1, %2
34110
+ rsb%?\\t%0, %2, %1
34114
@@ -1219,9 +1635,11 @@
34115
INTVAL (operands[1]), operands[0], operands[2], 0);
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")]
34128
@@ -1251,10 +1669,10 @@
34130
rsb%.\\t%0, %2, %1"
34131
[(set_attr "conds" "set")
34132
- (set_attr "type" "simple_alu_imm,*,*")]
34133
+ (set_attr "type" "arlo_imm,*,*")]
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 @@
34143
rsb%.\\t%0, %2, %1"
34144
[(set_attr "conds" "set")
34145
- (set_attr "type" "simple_alu_imm,*,*")]
34146
+ (set_attr "type" "arlo_imm,*,*")]
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)])))]
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)])))]
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,*")]
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 @@
34177
;; Multiplication insns
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"
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));
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")]
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")]
34223
; Unfortunately with the Thumb the '&'/'0' trick can fails when operands
34224
@@ -1357,7 +1769,7 @@
34225
return \"mul\\t%0, %2\";
34227
[(set_attr "length" "4,4,2")
34228
- (set_attr "insn" "mul")]
34229
+ (set_attr "type" "muls")]
34232
(define_insn "*thumb_mulsi3_v6"
34233
@@ -1370,7 +1782,7 @@
34236
[(set_attr "length" "2")
34237
- (set_attr "insn" "mul")]
34238
+ (set_attr "type" "muls")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
34493
(define_insn "*mulhisi3bt"
34494
@@ -1791,8 +2212,9 @@
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")]
34505
(define_insn "*mulhisi3tt"
34506
@@ -1805,8 +2227,9 @@
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")]
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")]
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")]
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")]
34553
(define_insn "maddhidi4"
34554
[(set (match_operand:DI 0 "s_register_operand" "=r")
34556
(mult:DI (sign_extend:DI
34557
- (match_operand:HI 1 "s_register_operand" "r"))
34558
+ (match_operand:HI 1 "s_register_operand" "r"))
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")])
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")])
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")])
34594
(define_expand "mulsf3"
34595
[(set (match_operand:SF 0 "s_register_operand" "")
34596
@@ -2024,13 +2453,49 @@
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"
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"
34613
+ switch (which_alternative)
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));
34623
+ case 5: /* fall through */
34625
+ default: gcc_unreachable ();
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))]
34634
+ operands[3] = gen_lowpart (SImode, operands[0]);
34635
+ operands[5] = gen_highpart (SImode, operands[0]);
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]));
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,*,*")
34652
(define_insn_and_split "*anddi_zesidi_di"
34653
@@ -2145,12 +2610,13 @@
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")))]
34666
+ and%?\\t%0, %1, %2
34667
bic%?\\t%0, %1, #%B2
34670
@@ -2164,9 +2630,11 @@
34671
INTVAL (operands[2]), operands[0], operands[1], 0);
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")
34680
+ "arlo_imm,arlo_imm,*,*,arlo_imm")]
34683
(define_insn "*thumb1_andsi3_insn"
34684
@@ -2176,7 +2644,7 @@
34687
[(set_attr "length" "2")
34688
- (set_attr "type" "simple_alu_imm")
34689
+ (set_attr "type" "arlo_imm")
34690
(set_attr "conds" "set")])
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,*")]
34701
(define_insn "*andsi3_compare0_scratch"
34702
@@ -2209,14 +2677,14 @@
34703
bic%.\\t%2, %0, #%B1
34705
[(set_attr "conds" "set")
34706
- (set_attr "type" "simple_alu_imm,simple_alu_imm,*")]
34707
+ (set_attr "type" "arlo_imm,arlo_imm,*")]
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"))
34719
@@ -2232,7 +2700,8 @@
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")]
34728
(define_insn_and_split "*ne_zeroextractsi"
34729
@@ -2659,7 +3128,8 @@
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")]
34738
(define_insn "insv_t2"
34739
@@ -2670,7 +3140,8 @@
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")]
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")]
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]);
34761
[(set_attr "length" "4,8")
34762
- (set_attr "predicable" "yes")]
34763
+ (set_attr "predicable" "yes")
34764
+ (set_attr "predicable_short_it" "no")]
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]);
34774
[(set_attr "length" "8")
34775
- (set_attr "predicable" "yes")]
34776
+ (set_attr "predicable" "yes")
34777
+ (set_attr "predicable_short_it" "no")]
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")))]
34786
"bic%?\\t%0, %1, %2"
34787
- [(set_attr "predicable" "yes")]
34788
+ [(set_attr "predicable" "yes")
34789
+ (set_attr "predicable_short_it" "no")]
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")))]
34803
(define_insn "*andsi_notsi_si_compare0"
34804
@@ -2814,14 +3288,47 @@
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"
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"
34822
+ switch (which_alternative)
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));
34834
+ default: gcc_unreachable ();
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))]
34843
+ operands[3] = gen_lowpart (SImode, operands[0]);
34844
+ operands[5] = gen_highpart (SImode, operands[0]);
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]));
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")]
34859
(define_insn "*iordi_zesidi_di"
34860
@@ -2834,7 +3341,8 @@
34861
orr%?\\t%Q0, %Q1, %2
34863
[(set_attr "length" "4,8")
34864
- (set_attr "predicable" "yes")]
34865
+ (set_attr "predicable" "yes")
34866
+ (set_attr "predicable_short_it" "no")]
34869
(define_insn "*iordi_sesidi_di"
34870
@@ -2879,12 +3387,13 @@
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")))]
34883
+ orr%?\\t%0, %1, %2
34884
orn%?\\t%0, %1, #%B2
34887
@@ -2894,14 +3403,15 @@
34888
|| (TARGET_THUMB2 && const_ok_for_arm (~INTVAL (operands[2]))))"
34889
[(clobber (const_int 0))]
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);
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,*,*")]
34906
(define_insn "*thumb1_iorsi3_insn"
34907
@@ -2936,7 +3446,7 @@
34909
"orr%.\\t%0, %1, %2"
34910
[(set_attr "conds" "set")
34911
- (set_attr "type" "simple_alu_imm,*")]
34912
+ (set_attr "type" "arlo_imm,*")]
34915
(define_insn "*iorsi3_compare0_scratch"
34916
@@ -2948,25 +3458,55 @@
34918
"orr%.\\t%0, %1, %2"
34919
[(set_attr "conds" "set")
34920
- (set_attr "type" "simple_alu_imm, *")]
34921
+ (set_attr "type" "arlo_imm,*")]
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" "")))]
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"
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"
34947
+ switch (which_alternative)
34952
+ case 4: /* fall through */
34954
+ case 0: /* fall through */
34955
+ case 5: return "veor\t%P0, %P1, %P2";
34956
+ default: gcc_unreachable ();
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))]
34965
+ operands[3] = gen_lowpart (SImode, operands[0]);
34966
+ operands[5] = gen_highpart (SImode, operands[0]);
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]));
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")]
34981
(define_insn "*xordi_zesidi_di"
34982
@@ -2979,7 +3519,8 @@
34983
eor%?\\t%Q0, %Q1, %2
34985
[(set_attr "length" "4,8")
34986
- (set_attr "predicable" "yes")]
34987
+ (set_attr "predicable" "yes")
34988
+ (set_attr "predicable_short_it" "no")]
34991
(define_insn "*xordi_sesidi_di"
34992
@@ -3022,13 +3563,14 @@
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")))]
35006
+ eor%?\\t%0, %1, %2
35009
&& CONST_INT_P (operands[2])
35010
@@ -3039,9 +3581,10 @@
35011
INTVAL (operands[2]), operands[0], operands[1], 0);
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,*,*,*")]
35022
(define_insn "*thumb1_xorsi3_insn"
35023
@@ -3052,7 +3595,7 @@
35025
[(set_attr "length" "2")
35026
(set_attr "conds" "set")
35027
- (set_attr "type" "simple_alu_imm")]
35028
+ (set_attr "type" "arlo_imm")]
35031
(define_insn "*xorsi3_compare0"
35032
@@ -3065,7 +3608,7 @@
35034
"eor%.\\t%0, %1, %2"
35035
[(set_attr "conds" "set")
35036
- (set_attr "type" "simple_alu_imm,*")]
35037
+ (set_attr "type" "arlo_imm,*")]
35040
(define_insn "*xorsi3_compare0_scratch"
35041
@@ -3076,7 +3619,7 @@
35044
[(set_attr "conds" "set")
35045
- (set_attr "type" "simple_alu_imm, *")]
35046
+ (set_attr "type" "arlo_imm,*")]
35049
; By splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C),
35050
@@ -3096,16 +3639,21 @@
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"))))]
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)))]
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")]
35074
; ??? Are these four splitters still beneficial when the Thumb-2 bitfield
35075
@@ -3241,7 +3789,8 @@
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")]
35084
(define_insn "*smax_m1"
35085
@@ -3250,18 +3799,27 @@
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")]
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))]
35102
- cmp\\t%1, %2\;movlt\\t%0, %2
35103
- cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"
35105
+ ; cmp\\t%1, %2\;movlt\\t%0, %2
35106
+ ; cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"
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))
35115
[(set_attr "conds" "clob")
35116
(set_attr "length" "8,12")]
35118
@@ -3290,18 +3848,27 @@
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")]
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))]
35135
- cmp\\t%1, %2\;movge\\t%0, %2
35136
- cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"
35138
+ ; cmp\\t%1, %2\;movge\\t%0, %2
35139
+ ; cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"
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))
35148
[(set_attr "conds" "clob")
35149
(set_attr "length" "8,12")]
35151
@@ -3316,16 +3883,24 @@
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))]
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"
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"
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))
35178
[(set_attr "conds" "clob")
35179
(set_attr "length" "8,8,12")]
35181
@@ -3340,16 +3915,24 @@
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))]
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"
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"
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))
35208
[(set_attr "conds" "clob")
35209
(set_attr "length" "8,8,12")]
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))]
35216
+ "TARGET_32BIT && optimize_insn_for_size_p()"
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"
35228
enum rtx_code code = GET_CODE (operands[4]);
35229
@@ -3423,6 +4006,54 @@
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")
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]))"
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)))
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)
35254
+ (cond_exec (match_op_dup 5 [(reg:CC CC_REGNUM) (const_int 0)])
35255
+ (set (match_dup 0)
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]);
35264
+ if (mode == CCFPmode || mode == CCFPEmode)
35265
+ rc = reverse_condition_maybe_unordered (rc);
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]));
35272
+ operands[6] = gen_rtx_MINUS (SImode, operands[1], operands[3]);
35274
+ [(set_attr "conds" "clob")
35275
+ (set (attr "length")
35276
+ (if_then_else (eq_attr "is_thumb" "yes")
35278
+ (const_int 12)))]
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";
35287
[(set_attr "predicable" "yes")
35288
- (set_attr "insn" "sat")])
35289
+ (set_attr "predicable_short_it" "no")]
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";
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")])
35304
;; Shift and rotation insns
35306
@@ -3566,6 +4198,7 @@
35309
[(set_attr "length" "2")
35310
+ (set_attr "type" "shift,shift_reg")
35311
(set_attr "conds" "set")])
35313
(define_expand "ashrdi3"
35314
@@ -3623,7 +4256,6 @@
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")]
35322
@@ -3646,6 +4278,7 @@
35325
[(set_attr "length" "2")
35326
+ (set_attr "type" "shift,shift_reg")
35327
(set_attr "conds" "set")])
35329
(define_expand "lshrdi3"
35330
@@ -3703,7 +4336,6 @@
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")]
35338
@@ -3729,6 +4361,7 @@
35341
[(set_attr "length" "2")
35342
+ (set_attr "type" "shift,shift_reg")
35343
(set_attr "conds" "set")])
35345
(define_expand "rotlsi3"
35346
@@ -3774,51 +4407,52 @@
35347
(match_operand:SI 2 "register_operand" "l")))]
35350
- [(set_attr "length" "2")]
35351
+ [(set_attr "type" "shift_reg")
35352
+ (set_attr "length" "2")]
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")]))]
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")]
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")])
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)]))]
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")]
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")])
35405
- (clobber (match_scratch:SI 0 "=r"))]
35406
+ (clobber (match_scratch:SI 0 "=r,r"))]
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")]
35415
(define_insn "*not_shiftsi"
35416
@@ -3829,10 +4463,10 @@
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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.
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"
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))]
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]);
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]))
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;
35522
+ [(set_attr "arch" "t2,any")
35523
+ (set_attr "length" "4,8")
35524
+ (set_attr "predicable" "yes")
35525
+ (set_attr "type" "load2")])
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"
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))]
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]);
35542
+ [(set_attr "arch" "t2,any")
35543
+ (set_attr "length" "4,8")
35544
+ (set_attr "predicable" "yes")
35545
+ (set_attr "type" "store2")])
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 @@
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")]
35560
(define_insn "extzv_t2"
35561
@@ -4109,7 +4805,8 @@
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")]
35571
@@ -4121,7 +4818,8 @@
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")]
35580
(define_insn "udivsi3"
35581
@@ -4131,7 +4829,8 @@
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")]
35591
@@ -4154,12 +4853,24 @@
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))]
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))))]
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]);
35615
[(set_attr "conds" "clob")
35616
(set_attr "length" "8")]
35618
@@ -4181,11 +4892,14 @@
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")))]
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")]
35635
(define_insn "*thumb1_negsi2"
35636
@@ -4209,6 +4923,73 @@
35637
"TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE"
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))]
35646
+ "#" ; rsb\\t%Q0, %1, #0\;asr\\t%R0, %Q0, #31
35647
+ "&& reload_completed"
35650
+ operands[2] = gen_highpart (SImode, operands[0]);
35651
+ operands[0] = gen_lowpart (SImode, operands[0]);
35652
+ rtx tmp = gen_rtx_SET (VOIDmode,
35654
+ gen_rtx_MINUS (SImode,
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,
35669
+ emit_insn (gen_rtx_PARALLEL (VOIDmode,
35674
+ emit_insn (gen_rtx_SET (VOIDmode,
35676
+ gen_rtx_ASHIFTRT (SImode,
35681
+ [(set_attr "length" "8,8,4,4")
35682
+ (set_attr "arch" "a,a,t2,t2")]
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))]
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))))]
35700
+ operands[2] = gen_highpart (SImode, operands[0]);
35701
+ operands[0] = gen_lowpart (SImode, operands[0]);
35703
+ [(set_attr "conds" "clob")
35704
+ (set_attr "length" "8")] ;; length in thumb is 4
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);
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))]
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"
35724
+ "&& reload_completed"
35727
+ /* if (which_alternative == 0) */
35728
+ if (REGNO(operands[0]) == REGNO(operands[1]))
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))))]
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),
35744
+ (gen_rtx_SET (VOIDmode,
35746
+ (gen_rtx_MINUS (SImode,
35748
+ operands[1]))))));
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))))]
35762
+ emit_insn (gen_rtx_SET (VOIDmode,
35764
+ gen_rtx_XOR (SImode,
35765
+ gen_rtx_ASHIFTRT (SImode,
35769
+ emit_insn (gen_rtx_SET (VOIDmode,
35771
+ gen_rtx_MINUS (SImode,
35773
+ gen_rtx_ASHIFTRT (SImode,
35775
+ GEN_INT (31)))));
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")]
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))]
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"
35796
+ "&& reload_completed"
35799
+ /* if (which_alternative == 0) */
35800
+ if (REGNO (operands[0]) == REGNO (operands[1]))
35802
+ /* Emit the pattern:
35803
+ cmp\\t%0, #0\;rsbgt\\t%0, %0, #0
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),
35812
+ gen_rtx_SET (VOIDmode,
35814
+ (gen_rtx_MINUS (SImode,
35816
+ operands[1])))));
35820
+ /* Emit the pattern:
35821
+ eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31
35823
+ emit_insn (gen_rtx_SET (VOIDmode,
35825
+ gen_rtx_XOR (SImode,
35826
+ gen_rtx_ASHIFTRT (SImode,
35830
+ emit_insn (gen_rtx_SET (VOIDmode,
35832
+ gen_rtx_MINUS (SImode,
35833
+ gen_rtx_ASHIFTRT (SImode,
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")]
35851
(define_expand "one_cmplsi2"
35852
@@ -4341,12 +5217,15 @@
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")))]
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")]
35870
(define_insn "*thumb1_one_cmplsi2"
35871
@@ -4355,7 +5234,7 @@
35874
[(set_attr "length" "2")
35875
- (set_attr "insn" "mvn")]
35876
+ (set_attr "type" "mvn_reg")]
35879
(define_insn "*notsi_compare0"
35880
@@ -4367,7 +5246,7 @@
35883
[(set_attr "conds" "set")
35884
- (set_attr "insn" "mvn")]
35885
+ (set_attr "type" "mvn_reg")]
35888
(define_insn "*notsi_compare0_scratch"
35889
@@ -4378,7 +5257,7 @@
35892
[(set_attr "conds" "set")
35893
- (set_attr "insn" "mvn")]
35894
+ (set_attr "type" "mvn_reg")]
35897
;; Fixed <--> Floating conversion insns
35898
@@ -4498,7 +5377,7 @@
35899
"TARGET_32BIT <qhs_zextenddi_cond>"
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")]
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")]
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))
35920
- (set_attr "type" "simple_alu_shift, load_byte")]
35921
+ (set_attr "type" "extend,load_byte")]
35924
(define_insn "*arm_zero_extendhisi2"
35925
@@ -4649,7 +5528,7 @@
35929
- [(set_attr "type" "alu_shift,load_byte")
35930
+ [(set_attr "type" "arlo_shift,load_byte")
35931
(set_attr "predicable" "yes")]
35934
@@ -4661,7 +5540,7 @@
35937
[(set_attr "predicable" "yes")
35938
- (set_attr "type" "simple_alu_shift,load_byte")]
35939
+ (set_attr "type" "extend,load_byte")]
35942
(define_insn "*arm_zero_extendhisi2addsi"
35943
@@ -4670,8 +5549,9 @@
35944
(match_operand:SI 2 "s_register_operand" "r")))]
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")]
35954
(define_expand "zero_extendqisi2"
35955
@@ -4719,7 +5599,7 @@
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")]
35964
@@ -4731,7 +5611,7 @@
35967
[(set_attr "length" "2")
35968
- (set_attr "type" "simple_alu_shift,load_byte")]
35969
+ (set_attr "type" "extend,load_byte")]
35972
(define_insn "*arm_zero_extendqisi2"
35973
@@ -4742,7 +5622,7 @@
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")]
35982
@@ -4753,7 +5633,7 @@
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")]
35991
@@ -4764,8 +5644,8 @@
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")]
36002
@@ -4816,7 +5696,8 @@
36005
[(set_attr "conds" "set")
36006
- (set_attr "predicable" "yes")]
36007
+ (set_attr "predicable" "yes")
36008
+ (set_attr "predicable_short_it" "no")]
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))
36016
- (set_attr "type" "simple_alu_shift,load_byte")
36017
+ (set_attr "type" "extend,load_byte")
36018
(set_attr "pool_range" "*,1018")]
36021
@@ -4986,7 +5867,7 @@
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 @@
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")]
36041
@@ -5086,7 +5968,7 @@
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 @@
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")))]
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")]
36072
@@ -5213,7 +6095,7 @@
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")]
36080
(define_expand "extendsfdf2"
36081
@@ -5313,8 +6195,8 @@
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"))]
36090
&& !(TARGET_HARD_FLOAT && TARGET_VFP)
36092
@@ -5472,8 +6354,7 @@
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,*,*")]
36102
@@ -5570,6 +6451,7 @@
36104
"movt%?\t%0, #:upper16:%c2"
36105
[(set_attr "predicable" "yes")
36106
+ (set_attr "predicable_short_it" "no")
36107
(set_attr "length" "4")]
36110
@@ -5587,8 +6469,7 @@
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 @@
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")]
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")])]
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")]
36156
(define_expand "thumb_movhi_clobber"
36157
@@ -6449,26 +7328,27 @@
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"))]
36168
&& ( register_operand (operands[0], QImode)
36169
|| register_operand (operands[1], QImode))"
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")]
36191
(define_insn "*thumb1_movqi_insn"
36192
@@ -6485,8 +7365,7 @@
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")])
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))"
36211
@@ -6551,8 +7430,7 @@
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")]
36221
@@ -6587,8 +7465,7 @@
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")])
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 @@
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")]
36253
@@ -6738,8 +7614,8 @@
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 @@
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,*,*")]
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" "")]
36283
+ if (TARGET_LDRD && current_tune->prefer_ldrd_strd
36284
+ && !optimize_function_for_size_p (cfun))
36286
+ if (gen_movmem_ldrd_strd (operands))
36291
if (arm_gen_movmemqi (operands))
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")]
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")])
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")])
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")]
36332
@@ -7617,25 +8500,69 @@
36333
;; if-conversion can not reduce to a conditional compare, so we do
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"))]
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))))])]
36354
+ operands[3] = gen_highpart (SImode, operands[0]);
36355
+ operands[0] = gen_lowpart (SImode, operands[0]);
36356
+ if (CONST_INT_P (operands[1]))
36358
+ operands[4] = GEN_INT (~INTVAL (gen_highpart_mode (SImode,
36361
+ operands[5] = gen_rtx_PLUS (SImode, operands[3], operands[4]);
36365
+ operands[4] = gen_highpart (SImode, operands[1]);
36366
+ operands[5] = gen_rtx_MINUS (SImode, operands[3], operands[4]);
36368
+ operands[1] = gen_lowpart (SImode, operands[1]);
36369
+ operands[2] = gen_lowpart (SImode, operands[2]);
36371
[(set_attr "conds" "set")
36372
(set_attr "length" "8")]
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")))]
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))))]
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]);
36398
+ operands[3] = gen_highpart (SImode, operands[1]);
36399
+ operands[1] = gen_lowpart (SImode, operands[1]);
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")]
36408
(define_insn "*arm_cmpdi_zero"
36409
@@ -7758,36 +8685,56 @@
36410
operands[3] = const0_rtx;"
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)]))]
36419
- "mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
36420
+ "#" ; "mov%D1\\t%0, #0\;mov%d1\\t%0, #1"
36422
+ [(set (match_dup 0)
36423
+ (if_then_else:SI (match_dup 1)
36427
[(set_attr "conds" "use")
36428
- (set_attr "insn" "mov")
36429
(set_attr "length" "8")]
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)])))]
36438
- "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
36439
+ "#" ; "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0"
36441
+ [(set (match_dup 0)
36442
+ (if_then_else:SI (match_dup 1)
36446
+ operands[3] = GEN_INT (~0);
36448
[(set_attr "conds" "use")
36449
- (set_attr "insn" "mov")
36450
(set_attr "length" "8")]
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)])))]
36459
- "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
36460
+ "#" ; "mvn%D1\\t%0, #0\;mvn%d1\\t%0, #1"
36462
+ [(set (match_dup 0)
36463
+ (if_then_else:SI (match_dup 1)
36467
+ operands[3] = GEN_INT (~1);
36468
+ operands[4] = GEN_INT (~0);
36470
[(set_attr "conds" "use")
36471
- (set_attr "insn" "mov")
36472
(set_attr "length" "8")]
36475
@@ -8069,7 +9016,7 @@
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 @@
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 @@
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>"
36509
+ enum arm_cond_code code = maybe_get_arm_condition_code (operands[1]);
36516
+ return \"vsel%d1.<V_if_elem>\\t%<V_reg>0, %<V_reg>3, %<V_reg>4\";
36521
+ return \"vsel%D1.<V_if_elem>\\t%<V_reg>0, %<V_reg>4, %<V_reg>3\";
36523
+ gcc_unreachable ();
36527
+ [(set_attr "conds" "use")
36528
+ (set_attr "type" "f_sel<vfp_type>")]
36531
+(define_insn_and_split "*movsicc_insn"
36532
[(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r")
36534
(match_operator 3 "arm_comparison_operator"
36535
@@ -8123,26 +9103,60 @@
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"
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"
36554
+ enum rtx_code rev_code;
36555
+ enum machine_mode mode;
36558
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
36560
+ gen_rtx_SET (VOIDmode,
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);
36569
+ rev_code = reverse_condition (rev_code);
36571
+ rev_cond = gen_rtx_fmt_ee (rev_code,
36575
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
36577
+ gen_rtx_SET (VOIDmode,
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")])]
36610
(define_insn "*movsfcc_soft_insn"
36611
@@ -8156,7 +9170,7 @@
36614
[(set_attr "conds" "use")
36615
- (set_attr "insn" "mov")]
36616
+ (set_attr "type" "mov_reg")]
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)"
36627
[(set_attr "type" "call")]
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)"
36636
return output_call (operands);
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)"
36645
return output_call_mem (operands);
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)"
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)"
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)"
36672
[(set_attr "type" "call")]
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)"
36681
return output_call (&operands[1]);
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)"
36691
return output_call_mem (&operands[1]);
36693
@@ -8444,6 +9459,7 @@
36694
(use (match_operand 2 "" ""))
36695
(clobber (reg:SI LR_REGNUM))]
36697
+ && !SIBLING_CALL_P (insn)
36698
&& (GET_CODE (operands[0]) == SYMBOL_REF)
36699
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[0]))"
36701
@@ -8460,6 +9476,7 @@
36702
(use (match_operand 3 "" ""))
36703
(clobber (reg:SI LR_REGNUM))]
36705
+ && !SIBLING_CALL_P (insn)
36706
&& (GET_CODE (operands[1]) == SYMBOL_REF)
36707
&& !arm_is_long_call_p (SYMBOL_REF_DECL (operands[1]))"
36709
@@ -8505,6 +9522,10 @@
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));
36717
if (operands[2] == NULL_RTX)
36718
operands[2] = const0_rtx;
36720
@@ -8519,47 +9540,67 @@
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));
36728
if (operands[3] == NULL_RTX)
36729
operands[3] = const0_rtx;
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 "" ""))
36738
(use (match_operand 2 "" ""))]
36739
- "TARGET_32BIT && GET_CODE (operands[0]) == SYMBOL_REF"
36740
+ "TARGET_32BIT && SIBLING_CALL_P (insn)"
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\";
36747
+ if (arm_arch5 || arm_arch4t)
36748
+ return \"bx%?\\t%0\\t%@ indirect register sibling call\";
36750
+ return \"mov%?\\t%|pc, %0\\t%@ indirect register sibling call\";
36753
[(set_attr "type" "call")]
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 "" "")))
36762
(use (match_operand 3 "" ""))]
36763
- "TARGET_32BIT && GET_CODE (operands[1]) == SYMBOL_REF"
36764
+ "TARGET_32BIT && SIBLING_CALL_P (insn)"
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\";
36771
+ if (arm_arch5 || arm_arch4t)
36772
+ return \"bx%?\\t%1\";
36774
+ return \"mov%?\\t%|pc, %1\\t@ indirect sibling call \";
36777
[(set_attr "type" "call")]
36780
-(define_expand "return"
36782
+(define_expand "<return_str>return"
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>"
36793
- thumb2_expand_return ();
36794
+ thumb2_expand_return (<return_simple_p>);
36798
@@ -8584,13 +9625,13 @@
36799
(set_attr "predicable" "yes")]
36802
-(define_insn "*cond_return"
36803
+(define_insn "*cond_<return_str>return"
36805
(if_then_else (match_operator 0 "arm_comparison_operator"
36806
[(match_operand 1 "cc_register" "") (const_int 0)])
36810
- "TARGET_ARM && USE_RETURN_INSN (TRUE)"
36811
+ "TARGET_ARM <return_cond_true>"
36814
if (arm_ccfsm_state == 2)
36815
@@ -8598,20 +9639,21 @@
36816
arm_ccfsm_state += 2;
36819
- return output_return_instruction (operands[0], true, false, false);
36820
+ return output_return_instruction (operands[0], true, false,
36821
+ <return_simple_p>);
36823
[(set_attr "conds" "use")
36824
(set_attr "length" "12")
36825
(set_attr "type" "load1")]
36828
-(define_insn "*cond_return_inverted"
36829
+(define_insn "*cond_<return_str>return_inverted"
36831
(if_then_else (match_operator 0 "arm_comparison_operator"
36832
[(match_operand 1 "cc_register" "") (const_int 0)])
36835
- "TARGET_ARM && USE_RETURN_INSN (TRUE)"
36837
+ "TARGET_ARM <return_cond_true>"
36840
if (arm_ccfsm_state == 2)
36841
@@ -8619,7 +9661,8 @@
36842
arm_ccfsm_state += 2;
36845
- return output_return_instruction (operands[0], true, true, false);
36846
+ return output_return_instruction (operands[0], true, true,
36847
+ <return_simple_p>);
36849
[(set_attr "conds" "use")
36850
(set_attr "length" "12")
36851
@@ -8991,7 +10034,7 @@
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")])
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")])
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")])
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")])
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")])
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")])
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")))]
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))))]
36920
+ enum machine_mode mode = GET_MODE (operands[2]);
36921
+ enum rtx_code rc = GET_CODE (operands[1]);
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);
36929
+ rc = reverse_condition (rc);
36930
+ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
36932
[(set_attr "conds" "use")
36933
- (set_attr "insn" "mov")
36934
+ (set_attr "type" "mov_reg")
36935
(set_attr "length" "8")]
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")))]
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
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))))]
36961
+ enum machine_mode mode = GET_MODE (operands[2]);
36962
+ enum rtx_code rc = GET_CODE (operands[1]);
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);
36970
+ rc = reverse_condition (rc);
36971
+ operands[5] = gen_rtx_fmt_ee (rc, VOIDmode, operands[2], const0_rtx);
36973
[(set_attr "conds" "use")
36974
(set_attr "length" "4,8")]
36976
@@ -9144,6 +10224,16 @@
36977
(eq:SI (match_operand:SI 1 "s_register_operand" "")
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)))]
36986
+ [(set (match_operand:SI 0 "s_register_operand" "")
36987
+ (eq:SI (match_operand:SI 1 "s_register_operand" "")
36989
+ (clobber (reg:CC CC_REGNUM))]
36990
"TARGET_32BIT && reload_completed"
36992
[(set (reg:CC CC_REGNUM)
36993
@@ -9184,7 +10274,7 @@
36994
(set (match_dup 0) (const_int 1)))])
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 @@
37004
;; Attempt to improve the sequence generated by the compare_scc splitters
37005
;; not to use conditional execution.
37007
+;; Rd = (eq (reg1) (const_int0)) // ARMv5
37011
[(set (reg:CC CC_REGNUM)
37012
(compare:CC (match_operand:SI 1 "register_operand" "")
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)))]
37023
+;; Rd = (eq (reg1) (const_int0)) // !ARMv5
37025
+;; adc Rd, Rd, reg1
37027
+ [(set (reg:CC CC_REGNUM)
37028
+ (compare:CC (match_operand:SI 1 "register_operand" "")
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)"
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))))]
37045
+;; Rd = (eq (reg1) (reg2/imm)) // ARMv5 and optimising for speed.
37046
+;; sub Rd, Reg1, reg2
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)))]
37065
+;; Rd = (eq (reg1) (reg2)) // ! ARMv5 or optimising for size.
37066
+;; sub T1, Reg1, reg2
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")]
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))
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)))])
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))))]
37098
+ if (CONST_INT_P (operands[2]))
37099
+ operands[4] = plus_constant (SImode, operands[1], -INTVAL (operands[2]));
37101
+ operands[4] = gen_rtx_MINUS (SImode, operands[1], operands[2]);
37104
(define_insn "*cond_move"
37105
[(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
37106
@@ -9262,7 +10416,7 @@
37109
[(set_attr "conds" "use")
37110
- (set_attr "insn" "mov")
37111
+ (set_attr "type" "mov_reg")
37112
(set_attr "length" "4,4,8")]
37115
@@ -9636,7 +10790,7 @@
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")]))
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)])))]
37133
@@ -9692,7 +10846,7 @@
37134
(set_attr "length" "16")])
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")]))
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)])))]
37151
@@ -9754,7 +10908,7 @@
37152
;; need only zero the value if false (if true, then the value is already
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 @@
37162
;; ??? The conditional patterns above need checking for Thumb-2 usefulness
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))]
37173
- if (GET_CODE (operands[3]) == LT && operands[2] == const0_rtx)
37174
- return \"mov\\t%0, %1, asr #31\";
37176
+ "&& reload_completed"
37179
+ rtx cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
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)
37185
+ /* Emit mov\\t%0, %1, asr #31 */
37186
+ emit_insn (gen_rtx_SET (VOIDmode,
37188
+ gen_rtx_ASHIFTRT (SImode,
37193
+ else if (GET_CODE (operands[3]) == NE)
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]))));
37200
+ emit_insn (gen_subsi3_compare (operands[0], operands[1], operands[2]));
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\";
37206
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
37207
+ gen_rtx_NE (SImode,
37210
+ gen_rtx_SET (SImode,
37217
+ /* Emit: cmp\\t%1, %2\;mov%D3\\t%0, #0\;mvn%d3\\t%0, #0 */
37218
+ emit_insn (gen_rtx_SET (VOIDmode,
37220
+ gen_rtx_COMPARE (CCmode, operands[1], operands[2])));
37221
+ enum rtx_code rc = GET_CODE (operands[3]);
37223
+ rc = reverse_condition (rc);
37224
+ emit_insn (gen_rtx_COND_EXEC (VOIDmode,
37225
+ gen_rtx_fmt_ee (rc,
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,
37236
+ gen_rtx_SET (VOIDmode,
37243
[(set_attr "conds" "clob")
37244
(set_attr "length" "12")]
37247
+(define_insn_and_split "movcond_addsi"
37248
+ [(set (match_operand:SI 0 "s_register_operand" "=r,l,r")
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"))
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))]
37259
+ "&& reload_completed"
37260
+ [(set (reg:CC_NOOV CC_REGNUM)
37262
+ (plus:SI (match_dup 3)
37265
+ (set (match_dup 0) (match_dup 1))
37266
+ (cond_exec (match_dup 6)
37267
+ (set (match_dup 0) (match_dup 2)))]
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]);
37274
+ operands[6] = gen_rtx_REG (mode, CC_REGNUM);
37275
+ gcc_assert (!(mode == CCFPmode || mode == CCFPEmode));
37276
+ rc = reverse_condition (rc);
37278
+ operands[6] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx);
37281
+ [(set_attr "conds" "clob")
37282
+ (set_attr "enabled_for_depr_it" "no,yes,yes")]
37285
(define_insn "movcond"
37286
[(set (match_operand:SI 0 "s_register_operand" "=r,r,r")
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")
37298
(const_string "*")])]
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")
37310
(const_string "*")])]
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")]
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")]
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")))]
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")))]
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")))]
37370
(define_insn "*ifcompare_not_arith"
37371
@@ -10363,7 +11603,7 @@
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")]
37380
@@ -10396,7 +11636,7 @@
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")]
37389
@@ -10844,7 +12084,7 @@
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")]
37398
@@ -11239,7 +12479,7 @@
37399
"TARGET_32BIT && arm_arch5"
37401
[(set_attr "predicable" "yes")
37402
- (set_attr "insn" "clz")])
37403
+ (set_attr "type" "clz")])
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"
37410
[(set_attr "predicable" "yes")
37411
- (set_attr "insn" "clz")])
37412
+ (set_attr "type" "clz")])
37414
(define_expand "ctzsi2"
37415
[(set (match_operand:SI 0 "s_register_operand" "")
37416
@@ -11280,6 +12520,7 @@
37420
+[(set_attr "predicated" "yes")]
37423
(define_insn "force_register_use"
37424
@@ -11399,7 +12640,8 @@
37427
[(set_attr "predicable" "yes")
37428
- (set_attr "length" "4")]
37429
+ (set_attr "predicable_short_it" "no")
37430
+ (set_attr "length" "4")]
37433
(define_insn "*arm_rev"
37434
@@ -11550,7 +12792,8 @@
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")])
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")])
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")])
37462
(define_insn "*thumb2_strd"
37463
[(set (mem:SI (plus:SI (match_operand:SI 0 "s_register_operand" "rk")
37464
@@ -11595,7 +12840,8 @@
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")])
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")])
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")])
37493
+;; Load the load/store double peephole optimizations.
37494
+(include "ldrdstrd.md")
37496
;; Load the load/store multiple patterns
37497
(include "ldmstm.md")
37499
--- a/src/gcc/config/arm/fmp626.md
37500
+++ b/src/gcc/config/arm/fmp626.md
37501
@@ -63,12 +63,15 @@
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"))
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"))
37518
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37519
@@ -77,22 +80,22 @@
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"))
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"))
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"))
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"))
37545
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37546
--- a/src/gcc/config/arm/fa526.md
37547
+++ b/src/gcc/config/arm/fa526.md
37548
@@ -62,12 +62,15 @@
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"))
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"))
37565
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37566
@@ -76,12 +79,12 @@
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"))
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"))
37581
--- a/src/gcc/config/arm/arm-generic.md
37582
+++ b/src/gcc/config/arm/arm-generic.md
37583
@@ -114,7 +114,9 @@
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"))))
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")))))
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")))))
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"))))))
37623
(define_insn_reservation "single_cycle" 1
37624
--- a/src/gcc/config/arm/iwmmxt2.md
37625
+++ b/src/gcc/config/arm/iwmmxt2.md
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")]
37634
(define_insn "iwmmxt_wabsdiffb"
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")]
37643
(define_insn "iwmmxt_wabsdiffh"
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")]
37652
(define_insn "iwmmxt_wabsdiffw"
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")]
37661
(define_insn "iwmmxt_waddsubhx"
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")]
37670
(define_insn "iwmmxt_wsubaddhx"
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
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")]
38119
--- a/src/gcc/config/arm/cortex-a5.md
38120
+++ b/src/gcc/config/arm/cortex-a5.md
38121
@@ -58,12 +58,15 @@
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"))
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"))
38138
;; Forwarding path for unshifted operands.
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")))
38148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38149
--- a/src/gcc/config/arm/fa606te.md
38150
+++ b/src/gcc/config/arm/fa606te.md
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"))
38162
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38163
@@ -71,22 +74,22 @@
38165
(define_insn_reservation "606te_mult1" 2
38166
(and (eq_attr "tune" "fa606te")
38167
- (eq_attr "insn" "smlalxy"))
38168
+ (eq_attr "type" "smlalxy"))
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"))
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"))
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"))
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")
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")
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")
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"))
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"))
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"))
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")
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 @@
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"))
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"))
38271
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38272
@@ -82,22 +85,22 @@
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"))
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"))
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"))
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"))
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
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
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"
38335
| _ -> assert false
38336
with Not_found -> assert true
38338
let print_feature_test_end features =
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"
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
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)
38365
#undef STARTFILE_SPEC
38366
#define STARTFILE_SPEC \
38367
--- a/src/libobjc/ChangeLog.linaro
38368
+++ b/src/libobjc/ChangeLog.linaro
38370
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38372
+ GCC Linaro 4.8-2013.09 released.
38374
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38376
+ GCC Linaro 4.8-2013.08 released.
38378
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38380
+ GCC Linaro 4.8-2013.07-1 released.
38382
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38384
+ GCC Linaro 4.8-2013.07 released.
38386
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38388
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38390
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38392
+ GCC Linaro 4.8-2013.05 released.
38394
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38396
+ * GCC Linaro 4.8-2013.04 released.
38397
--- a/src/libgfortran/ChangeLog.linaro
38398
+++ b/src/libgfortran/ChangeLog.linaro
38400
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38402
+ GCC Linaro 4.8-2013.09 released.
38404
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38406
+ GCC Linaro 4.8-2013.08 released.
38408
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38410
+ GCC Linaro 4.8-2013.07-1 released.
38412
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38414
+ GCC Linaro 4.8-2013.07 released.
38416
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38418
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38420
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38422
+ GCC Linaro 4.8-2013.05 released.
38424
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38426
+ * GCC Linaro 4.8-2013.04 released.
38427
--- a/src/libada/ChangeLog.linaro
38428
+++ b/src/libada/ChangeLog.linaro
38430
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38432
+ GCC Linaro 4.8-2013.09 released.
38434
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38436
+ GCC Linaro 4.8-2013.08 released.
38438
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38440
+ GCC Linaro 4.8-2013.07-1 released.
38442
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38444
+ GCC Linaro 4.8-2013.07 released.
38446
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38448
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38450
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38452
+ GCC Linaro 4.8-2013.05 released.
38454
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38456
+ * GCC Linaro 4.8-2013.04 released.
38457
--- a/src/libffi/ChangeLog.linaro
38458
+++ b/src/libffi/ChangeLog.linaro
38460
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38462
+ GCC Linaro 4.8-2013.09 released.
38464
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38466
+ GCC Linaro 4.8-2013.08 released.
38468
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38470
+ GCC Linaro 4.8-2013.07-1 released.
38472
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38474
+ GCC Linaro 4.8-2013.07 released.
38476
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38478
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38480
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38482
+ GCC Linaro 4.8-2013.05 released.
38484
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38486
+ * GCC Linaro 4.8-2013.04 released.
38487
--- a/src/libssp/ChangeLog.linaro
38488
+++ b/src/libssp/ChangeLog.linaro
38490
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38492
+ GCC Linaro 4.8-2013.09 released.
38494
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38496
+ GCC Linaro 4.8-2013.08 released.
38498
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38500
+ GCC Linaro 4.8-2013.07-1 released.
38502
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38504
+ GCC Linaro 4.8-2013.07 released.
38506
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38508
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38510
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38512
+ GCC Linaro 4.8-2013.05 released.
38514
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38516
+ * GCC Linaro 4.8-2013.04 released.
38517
--- a/src/libcpp/configure
38518
+++ b/src/libcpp/configure
38519
@@ -7152,9 +7152,7 @@
38523
- arm*-*-*eabi* | \
38524
- arm*-*-rtems* | \
38525
- arm*-*-symbianelf* | \
38530
--- a/src/libcpp/configure.ac
38531
+++ b/src/libcpp/configure.ac
38532
@@ -184,9 +184,7 @@
38536
- arm*-*-*eabi* | \
38537
- arm*-*-rtems* | \
38538
- arm*-*-symbianelf* | \
38543
--- a/src/libcpp/ChangeLog.linaro
38544
+++ b/src/libcpp/ChangeLog.linaro
38546
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38548
+ GCC Linaro 4.8-2013.09 released.
38550
+2013-09-05 Yvan Roux <yvan.roux@linaro.org>
38552
+ Backport from trunk r201566.
38553
+ 2013-08-07 Richard Earnshaw <rearnsha@arm.com>
38555
+ * configure.ac: Set need_64bit_hwint for all arm targets.
38556
+ * configure: Regenerated.
38558
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38560
+ GCC Linaro 4.8-2013.08 released.
38562
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38564
+ GCC Linaro 4.8-2013.07-1 released.
38566
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38568
+ GCC Linaro 4.8-2013.07 released.
38570
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38572
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38574
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38576
+ GCC Linaro 4.8-2013.05 released.
38578
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38580
+ * GCC Linaro 4.8-2013.04 released.
38581
--- a/src/libcpp/po/ChangeLog.linaro
38582
+++ b/src/libcpp/po/ChangeLog.linaro
38584
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38586
+ GCC Linaro 4.8-2013.09 released.
38588
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38590
+ GCC Linaro 4.8-2013.08 released.
38592
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38594
+ GCC Linaro 4.8-2013.07-1 released.
38596
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38598
+ GCC Linaro 4.8-2013.07 released.
38600
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38602
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38604
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38606
+ GCC Linaro 4.8-2013.05 released.
38608
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38610
+ * GCC Linaro 4.8-2013.04 released.
38611
--- a/src/fixincludes/ChangeLog.linaro
38612
+++ b/src/fixincludes/ChangeLog.linaro
38614
+2013-09-10 Christophe Lyon <christophe.lyon@linaro.org>
38616
+ GCC Linaro 4.8-2013.09 released.
38618
+2013-08-14 Christophe Lyon <christophe.lyon@linaro.org>
38620
+ GCC Linaro 4.8-2013.08 released.
38622
+2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38624
+ GCC Linaro 4.8-2013.07-1 released.
38626
+2013-07-05 Christophe Lyon <christophe.lyon@linaro.org>
38628
+ GCC Linaro 4.8-2013.07 released.
38630
+2013-06-11 Rob Savoye <rob.savoye@linaro.org>
38632
+ GCC Linaro gcc-linaro-4.8-2013.06 released.
38634
+2013-05-14 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38636
+ GCC Linaro 4.8-2013.05 released.
38638
+2013-04-09 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org>
38640
+ * GCC Linaro 4.8-2013.04 released.