annotate gcc/config/aarch64/aarch64-sve-builtins-sve2.cc @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* ACLE support for AArch64 SVE (__ARM_FEATURE_SVE2 intrinsics)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "config.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "system.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "coretypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "tm.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include "rtl.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include "tm_p.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include "memmodel.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include "insn-codes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "optabs.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include "recog.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include "expr.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #include "basic-block.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #include "function.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #include "fold-const.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #include "gimple.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 #include "gimple-iterator.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #include "gimplify.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #include "explow.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 #include "emit-rtl.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 #include "tree-vector-builder.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 #include "rtx-vector-builder.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 #include "vec-perm-indices.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 #include "aarch64-sve-builtins.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 #include "aarch64-sve-builtins-shapes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 #include "aarch64-sve-builtins-base.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 #include "aarch64-sve-builtins-sve2.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 #include "aarch64-sve-builtins-functions.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 using namespace aarch64_sve;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 namespace {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 /* Return the UNSPEC_CDOT* unspec for rotation amount ROT. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 static int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 unspec_cdot (int rot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 switch (rot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 case 0: return UNSPEC_CDOT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 case 90: return UNSPEC_CDOT90;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 case 180: return UNSPEC_CDOT180;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 case 270: return UNSPEC_CDOT270;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 default: gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 /* Return the UNSPEC_SQRDCMLAH* unspec for rotation amount ROT. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 static int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 unspec_sqrdcmlah (int rot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 switch (rot)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 case 0: return UNSPEC_SQRDCMLAH;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 case 90: return UNSPEC_SQRDCMLAH90;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 case 180: return UNSPEC_SQRDCMLAH180;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 case 270: return UNSPEC_SQRDCMLAH270;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 default: gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 class svaba_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 rtx_code max_code = e.type_suffix (0).unsigned_p ? UMAX : SMAX;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 machine_mode mode = e.vector_mode (0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 return e.use_exact_insn (code_for_aarch64_sve2_aba (max_code, mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 class svcdot_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 /* Convert the rotation amount into a specific unspec. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 int rot = INTVAL (e.args.pop ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 return e.use_exact_insn (code_for_aarch64_sve (unspec_cdot (rot),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 class svcdot_lane_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 /* Convert the rotation amount into a specific unspec. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 int rot = INTVAL (e.args.pop ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 return e.use_exact_insn (code_for_aarch64_lane (unspec_cdot (rot),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 class svldnt1_gather_impl : public full_width_access
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 call_properties (const function_instance &) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 return CP_READ_MEMORY;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 e.prepare_gather_address_operands (1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 machine_mode mem_mode = e.memory_vector_mode ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 return e.use_exact_insn (code_for_aarch64_gather_ldnt (mem_mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 /* Implements extending forms of svldnt1_gather. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 class svldnt1_gather_extend_impl : public extending_load
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 CONSTEXPR svldnt1_gather_extend_impl (type_suffix_index memory_type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 : extending_load (memory_type) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 e.prepare_gather_address_operands (1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 /* Add a constant predicate for the extension rtx. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 e.args.quick_push (CONSTM1_RTX (VNx16BImode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 insn_code icode = code_for_aarch64_gather_ldnt (extend_rtx_code (),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 e.vector_mode (0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 e.memory_vector_mode ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 return e.use_exact_insn (icode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 /* Implements both svmatch and svnmatch; the unspec parameter decides
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 between them. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 class svmatch_svnmatch_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 CONSTEXPR svmatch_svnmatch_impl (int unspec) : m_unspec (unspec) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 /* These are UNSPEC_PRED_Z operations and so need a hint operand. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 e.add_ptrue_hint (0, e.gp_mode (0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 return e.use_exact_insn (code_for_aarch64_pred (m_unspec,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 int m_unspec;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 /* Implements both svmovlb and svmovlt; the unspec parameters decide
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 between them. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 class svmovl_lb_impl : public unspec_based_function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 CONSTEXPR svmovl_lb_impl (int unspec_for_sint, int unspec_for_uint,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 int unspec_for_fp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 unspec_for_fp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 e.args.quick_push (const0_rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 return e.map_to_unspecs (m_unspec_for_sint, m_unspec_for_uint,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 m_unspec_for_fp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 class svqcadd_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 /* Convert the rotation amount into a specific unspec. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 int rot = INTVAL (e.args.pop ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 if (rot == 90)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 return e.map_to_unspecs (UNSPEC_SQCADD90, -1, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 if (rot == 270)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 return e.map_to_unspecs (UNSPEC_SQCADD270, -1, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 class svqrdcmlah_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 /* Convert the rotation amount into a specific unspec. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 int rot = INTVAL (e.args.pop ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 return e.use_exact_insn (code_for_aarch64_sve (unspec_sqrdcmlah (rot),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 class svqrdcmlah_lane_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 /* Convert the rotation amount into a specific unspec. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 int rot = INTVAL (e.args.pop ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 return e.use_exact_insn (code_for_aarch64_lane (unspec_sqrdcmlah (rot),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 class svqrshl_impl : public unspec_based_function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 CONSTEXPR svqrshl_impl ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 : unspec_based_function (UNSPEC_SQRSHL, UNSPEC_UQRSHL, -1) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 gimple *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 fold (gimple_folder &f) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 if (wi::to_widest (amount) >= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 /* The rounding has no effect, and [SU]QSHL has immediate forms
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 that we can use for sensible shift amounts. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 function_instance instance ("svqshl", functions::svqshl,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 shapes::binary_int_opt_n, MODE_n,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 f.type_suffix_ids, f.pred);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 return f.redirect_call (instance);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 /* The saturation has no effect, and [SU]RSHL has immediate forms
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 that we can use for sensible shift amounts. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 function_instance instance ("svrshl", functions::svrshl,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 shapes::binary_int_opt_n, MODE_n,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 f.type_suffix_ids, f.pred);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 return f.redirect_call (instance);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 class svqshl_impl : public unspec_based_function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 CONSTEXPR svqshl_impl ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 : unspec_based_function (UNSPEC_SQSHL, UNSPEC_UQSHL, -1) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 gimple *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 fold (gimple_folder &f) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 int element_bits = f.type_suffix (0).element_bits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 if (wi::to_widest (amount) >= -element_bits
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 && wi::to_widest (amount) < 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 /* The saturation has no effect for right shifts, so we can
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 use the immediate form of ASR or LSR. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 amount = wide_int_to_tree (TREE_TYPE (amount),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 -wi::to_wide (amount));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 function_instance instance ("svasr", functions::svasr,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 shapes::binary_uint_opt_n, MODE_n,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 f.type_suffix_ids, f.pred);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 if (f.type_suffix (0).unsigned_p)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 instance.base_name = "svlsr";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 instance.base = functions::svlsr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 gcall *call = as_a <gcall *> (f.redirect_call (instance));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 gimple_call_set_arg (call, 2, amount);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 return call;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 class svrshl_impl : public unspec_based_function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 CONSTEXPR svrshl_impl ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 : unspec_based_function (UNSPEC_SRSHL, UNSPEC_URSHL, -1) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 gimple *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 fold (gimple_folder &f) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 if (wi::to_widest (amount) >= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 /* The rounding has no effect, and LSL has immediate forms
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 that we can use for sensible shift amounts. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 function_instance instance ("svlsl", functions::svlsl,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 shapes::binary_uint_opt_n, MODE_n,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 f.type_suffix_ids, f.pred);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 gcall *call = as_a <gcall *> (f.redirect_call (instance));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 gimple_call_set_arg (call, 2, amount);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 return call;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 int element_bits = f.type_suffix (0).element_bits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 if (wi::to_widest (amount) >= -element_bits)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 /* The shift amount is in range of [SU]RSHR. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 amount = wide_int_to_tree (TREE_TYPE (amount),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 -wi::to_wide (amount));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 function_instance instance ("svrshr", functions::svrshr,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 shapes::shift_right_imm, MODE_n,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 f.type_suffix_ids, f.pred);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 gcall *call = as_a <gcall *> (f.redirect_call (instance));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 gimple_call_set_arg (call, 2, amount);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 return call;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 class svsqadd_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 machine_mode mode = e.vector_mode (0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 if (e.pred == PRED_x
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 && aarch64_sve_sqadd_sqsub_immediate_p (mode, e.args[2], false))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 return e.map_to_rtx_codes (UNKNOWN, US_PLUS, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 return e.map_to_unspecs (-1, UNSPEC_USQADD, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 class svsra_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 rtx_code shift_code = e.type_suffix (0).unsigned_p ? LSHIFTRT : ASHIFTRT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 machine_mode mode = e.vector_mode (0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 return e.use_exact_insn (code_for_aarch64_sve_add (shift_code, mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 class svstnt1_scatter_impl : public full_width_access
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 call_properties (const function_instance &) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 return CP_WRITE_MEMORY;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 e.prepare_gather_address_operands (1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 machine_mode mem_mode = e.memory_vector_mode ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 return e.use_exact_insn (code_for_aarch64_scatter_stnt (mem_mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 /* Implements truncating forms of svstnt1_scatter. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 class svstnt1_scatter_truncate_impl : public truncating_store
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 CONSTEXPR svstnt1_scatter_truncate_impl (scalar_int_mode to_mode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 : truncating_store (to_mode) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 e.prepare_gather_address_operands (1, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 insn_code icode = code_for_aarch64_scatter_stnt (e.vector_mode (0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 e.memory_vector_mode ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 return e.use_exact_insn (icode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 class svtbl2_impl : public quiet<multi_vector_function>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 CONSTEXPR svtbl2_impl () : quiet<multi_vector_function> (2) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 return e.use_exact_insn (code_for_aarch64_sve2_tbl2 (e.vector_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 class svuqadd_impl : public function_base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 machine_mode mode = e.vector_mode (0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 if (e.pred == PRED_x
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 && aarch64_sve_arith_immediate_p (mode, e.args[2], false))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 return e.use_unpred_insn (code_for_aarch64_sve_suqadd_const (mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 return e.map_to_unspecs (UNSPEC_SUQADD, -1, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 /* Implements both svwhilerw and svwhilewr; the unspec parameter decides
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 between them. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 class svwhilerw_svwhilewr_impl : public full_width_access
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 CONSTEXPR svwhilerw_svwhilewr_impl (int unspec) : m_unspec (unspec) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 rtx
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 expand (function_expander &e) const OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 for (unsigned int i = 0; i < 2; ++i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 e.args[i] = e.convert_to_pmode (e.args[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 return e.use_exact_insn (code_for_while (m_unspec, Pmode, e.gp_mode (0)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 int m_unspec;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 } /* end anonymous namespace */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 namespace aarch64_sve {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 FUNCTION (svaba, svaba_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 FUNCTION (svabalb, unspec_based_add_function, (UNSPEC_SABDLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 UNSPEC_UABDLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 FUNCTION (svabalt, unspec_based_add_function, (UNSPEC_SABDLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 UNSPEC_UABDLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 FUNCTION (svadclb, unspec_based_function, (-1, UNSPEC_ADCLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 FUNCTION (svadclt, unspec_based_function, (-1, UNSPEC_ADCLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 FUNCTION (svaddhnb, unspec_based_function, (UNSPEC_ADDHNB, UNSPEC_ADDHNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 FUNCTION (svaddhnt, unspec_based_function, (UNSPEC_ADDHNT, UNSPEC_ADDHNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 FUNCTION (svabdlb, unspec_based_function, (UNSPEC_SABDLB, UNSPEC_UABDLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 FUNCTION (svabdlt, unspec_based_function, (UNSPEC_SABDLT, UNSPEC_UABDLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 FUNCTION (svadalp, unspec_based_function, (UNSPEC_SADALP, UNSPEC_UADALP, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 FUNCTION (svaddlb, unspec_based_function, (UNSPEC_SADDLB, UNSPEC_UADDLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 FUNCTION (svaddlbt, unspec_based_function, (UNSPEC_SADDLBT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 FUNCTION (svaddlt, unspec_based_function, (UNSPEC_SADDLT, UNSPEC_UADDLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 FUNCTION (svaddwb, unspec_based_function, (UNSPEC_SADDWB, UNSPEC_UADDWB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 FUNCTION (svaddwt, unspec_based_function, (UNSPEC_SADDWT, UNSPEC_UADDWT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 FUNCTION (svaddp, unspec_based_pred_function, (UNSPEC_ADDP, UNSPEC_ADDP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 UNSPEC_FADDP))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 FUNCTION (svaesd, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesd))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 FUNCTION (svaese, fixed_insn_function, (CODE_FOR_aarch64_sve2_aese))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 FUNCTION (svaesimc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesimc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 FUNCTION (svaesmc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesmc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 FUNCTION (svbcax, CODE_FOR_MODE0 (aarch64_sve2_bcax),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 FUNCTION (svbdep, unspec_based_function, (UNSPEC_BDEP, UNSPEC_BDEP, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 FUNCTION (svbext, unspec_based_function, (UNSPEC_BEXT, UNSPEC_BEXT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 FUNCTION (svbgrp, unspec_based_function, (UNSPEC_BGRP, UNSPEC_BGRP, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 FUNCTION (svbsl, CODE_FOR_MODE0 (aarch64_sve2_bsl),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 FUNCTION (svbsl1n, CODE_FOR_MODE0 (aarch64_sve2_bsl1n),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 FUNCTION (svbsl2n, CODE_FOR_MODE0 (aarch64_sve2_bsl2n),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 FUNCTION (svcdot, svcdot_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 FUNCTION (svcdot_lane, svcdot_lane_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 FUNCTION (svcvtlt, unspec_based_function, (-1, -1, UNSPEC_COND_FCVTLT))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 FUNCTION (svcvtx, unspec_based_function, (-1, -1, UNSPEC_COND_FCVTX))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 FUNCTION (svcvtxnt, CODE_FOR_MODE1 (aarch64_sve2_cvtxnt),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 FUNCTION (sveor3, CODE_FOR_MODE0 (aarch64_sve2_eor3),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 FUNCTION (sveorbt, unspec_based_function, (UNSPEC_EORBT, UNSPEC_EORBT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 FUNCTION (sveortb, unspec_based_function, (UNSPEC_EORTB, UNSPEC_EORTB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 FUNCTION (svhadd, unspec_based_function, (UNSPEC_SHADD, UNSPEC_UHADD, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 FUNCTION (svhsub, unspec_based_function, (UNSPEC_SHSUB, UNSPEC_UHSUB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 FUNCTION (svhistcnt, CODE_FOR_MODE0 (aarch64_sve2_histcnt),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 FUNCTION (svhistseg, CODE_FOR_MODE0 (aarch64_sve2_histseg),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 FUNCTION (svhsubr, unspec_based_function_rotated, (UNSPEC_SHSUB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 UNSPEC_UHSUB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 FUNCTION (svldnt1_gather, svldnt1_gather_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 FUNCTION (svldnt1sb_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s8))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 FUNCTION (svldnt1sh_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s16))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 FUNCTION (svldnt1sw_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s32))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 FUNCTION (svldnt1ub_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u8))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 FUNCTION (svldnt1uh_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u16))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 FUNCTION (svldnt1uw_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u32))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 FUNCTION (svlogb, unspec_based_function, (-1, -1, UNSPEC_COND_FLOGB))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 FUNCTION (svmatch, svmatch_svnmatch_impl, (UNSPEC_MATCH))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 FUNCTION (svmaxp, unspec_based_pred_function, (UNSPEC_SMAXP, UNSPEC_UMAXP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 UNSPEC_FMAXP))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 FUNCTION (svmaxnmp, unspec_based_pred_function, (-1, -1, UNSPEC_FMAXNMP))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 FUNCTION (svminp, unspec_based_pred_function, (UNSPEC_SMINP, UNSPEC_UMINP,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 UNSPEC_FMINP))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 FUNCTION (svminnmp, unspec_based_pred_function, (-1, -1, UNSPEC_FMINNMP))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 FUNCTION (svmlalb, unspec_based_mla_function, (UNSPEC_SMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 UNSPEC_UMULLB, UNSPEC_FMLALB))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 FUNCTION (svmlalb_lane, unspec_based_mla_lane_function, (UNSPEC_SMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 UNSPEC_UMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 UNSPEC_FMLALB))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 FUNCTION (svmlalt, unspec_based_mla_function, (UNSPEC_SMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 UNSPEC_UMULLT, UNSPEC_FMLALT))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 FUNCTION (svmlalt_lane, unspec_based_mla_lane_function, (UNSPEC_SMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 UNSPEC_UMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 UNSPEC_FMLALT))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 FUNCTION (svmlslb, unspec_based_mls_function, (UNSPEC_SMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 UNSPEC_UMULLB, UNSPEC_FMLSLB))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 FUNCTION (svmlslb_lane, unspec_based_mls_lane_function, (UNSPEC_SMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 UNSPEC_UMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 UNSPEC_FMLSLB))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 FUNCTION (svmlslt, unspec_based_mls_function, (UNSPEC_SMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 UNSPEC_UMULLT, UNSPEC_FMLSLT))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 FUNCTION (svmlslt_lane, unspec_based_mls_lane_function, (UNSPEC_SMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 UNSPEC_UMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 UNSPEC_FMLSLT))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 FUNCTION (svmovlb, svmovl_lb_impl, (UNSPEC_SSHLLB, UNSPEC_USHLLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 FUNCTION (svmovlt, svmovl_lb_impl, (UNSPEC_SSHLLT, UNSPEC_USHLLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 FUNCTION (svmullb, unspec_based_function, (UNSPEC_SMULLB, UNSPEC_UMULLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 FUNCTION (svmullb_lane, unspec_based_lane_function, (UNSPEC_SMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 UNSPEC_UMULLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 FUNCTION (svmullt, unspec_based_function, (UNSPEC_SMULLT, UNSPEC_UMULLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 FUNCTION (svmullt_lane, unspec_based_lane_function, (UNSPEC_SMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 UNSPEC_UMULLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 FUNCTION (svnbsl, CODE_FOR_MODE0 (aarch64_sve2_nbsl),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 FUNCTION (svnmatch, svmatch_svnmatch_impl, (UNSPEC_NMATCH))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 FUNCTION (svpmul, CODE_FOR_MODE0 (aarch64_sve2_pmul),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 FUNCTION (svpmullb, unspec_based_function, (-1, UNSPEC_PMULLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 FUNCTION (svpmullb_pair, unspec_based_function, (-1, UNSPEC_PMULLB_PAIR, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 FUNCTION (svpmullt, unspec_based_function, (-1, UNSPEC_PMULLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 FUNCTION (svpmullt_pair, unspec_based_function, (-1, UNSPEC_PMULLT_PAIR, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 FUNCTION (svqabs, rtx_code_function, (SS_ABS, UNKNOWN, UNKNOWN))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 FUNCTION (svqcadd, svqcadd_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 FUNCTION (svqdmlalb, unspec_based_qadd_function, (UNSPEC_SQDMULLB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 FUNCTION (svqdmlalb_lane, unspec_based_qadd_lane_function, (UNSPEC_SQDMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 FUNCTION (svqdmlalbt, unspec_based_qadd_function, (UNSPEC_SQDMULLBT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 FUNCTION (svqdmlalt, unspec_based_qadd_function, (UNSPEC_SQDMULLT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 FUNCTION (svqdmlalt_lane, unspec_based_qadd_lane_function, (UNSPEC_SQDMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 FUNCTION (svqdmlslb, unspec_based_qsub_function, (UNSPEC_SQDMULLB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 FUNCTION (svqdmlslb_lane, unspec_based_qsub_lane_function, (UNSPEC_SQDMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 FUNCTION (svqdmlslbt, unspec_based_qsub_function, (UNSPEC_SQDMULLBT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 FUNCTION (svqdmlslt, unspec_based_qsub_function, (UNSPEC_SQDMULLT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 FUNCTION (svqdmlslt_lane, unspec_based_qsub_lane_function, (UNSPEC_SQDMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 FUNCTION (svqdmulh, unspec_based_function, (UNSPEC_SQDMULH, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 FUNCTION (svqdmulh_lane, unspec_based_lane_function, (UNSPEC_SQDMULH, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 FUNCTION (svqdmullb, unspec_based_function, (UNSPEC_SQDMULLB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 FUNCTION (svqdmullb_lane, unspec_based_lane_function, (UNSPEC_SQDMULLB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 FUNCTION (svqdmullt, unspec_based_function, (UNSPEC_SQDMULLT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 FUNCTION (svqdmullt_lane, unspec_based_lane_function, (UNSPEC_SQDMULLT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 FUNCTION (svqneg, rtx_code_function, (SS_NEG, UNKNOWN, UNKNOWN))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 FUNCTION (svqrdcmlah, svqrdcmlah_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 FUNCTION (svqrdcmlah_lane, svqrdcmlah_lane_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 FUNCTION (svqrdmulh, unspec_based_function, (UNSPEC_SQRDMULH, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 FUNCTION (svqrdmulh_lane, unspec_based_lane_function, (UNSPEC_SQRDMULH,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 FUNCTION (svqrdmlah, unspec_based_function, (UNSPEC_SQRDMLAH, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 FUNCTION (svqrdmlah_lane, unspec_based_lane_function, (UNSPEC_SQRDMLAH,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 FUNCTION (svqrdmlsh, unspec_based_function, (UNSPEC_SQRDMLSH, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 FUNCTION (svqrdmlsh_lane, unspec_based_lane_function, (UNSPEC_SQRDMLSH,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 FUNCTION (svqrshl, svqrshl_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 FUNCTION (svqrshrnb, unspec_based_function, (UNSPEC_SQRSHRNB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 UNSPEC_UQRSHRNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 FUNCTION (svqrshrnt, unspec_based_function, (UNSPEC_SQRSHRNT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 UNSPEC_UQRSHRNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 FUNCTION (svqrshrunb, unspec_based_function, (UNSPEC_SQRSHRUNB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 FUNCTION (svqrshrunt, unspec_based_function, (UNSPEC_SQRSHRUNT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 FUNCTION (svqshl, svqshl_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 FUNCTION (svqshlu, unspec_based_function, (UNSPEC_SQSHLU, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 FUNCTION (svqshrnb, unspec_based_function, (UNSPEC_SQSHRNB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 UNSPEC_UQSHRNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 FUNCTION (svqshrnt, unspec_based_function, (UNSPEC_SQSHRNT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 UNSPEC_UQSHRNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 FUNCTION (svqshrunb, unspec_based_function, (UNSPEC_SQSHRUNB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 FUNCTION (svqshrunt, unspec_based_function, (UNSPEC_SQSHRUNT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 FUNCTION (svqsubr, rtx_code_function_rotated, (SS_MINUS, US_MINUS, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 FUNCTION (svqxtnb, unspec_based_function, (UNSPEC_SQXTNB, UNSPEC_UQXTNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 FUNCTION (svqxtnt, unspec_based_function, (UNSPEC_SQXTNT, UNSPEC_UQXTNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 FUNCTION (svqxtunb, unspec_based_function, (UNSPEC_SQXTUNB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 FUNCTION (svqxtunt, unspec_based_function, (UNSPEC_SQXTUNT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 FUNCTION (svraddhnb, unspec_based_function, (UNSPEC_RADDHNB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 UNSPEC_RADDHNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 FUNCTION (svraddhnt, unspec_based_function, (UNSPEC_RADDHNT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 UNSPEC_RADDHNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 FUNCTION (svrax1, fixed_insn_function, (CODE_FOR_aarch64_sve2_rax1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 FUNCTION (svrhadd, unspec_based_function, (UNSPEC_SRHADD, UNSPEC_URHADD, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 FUNCTION (svrshl, svrshl_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 FUNCTION (svrshr, unspec_based_function, (UNSPEC_SRSHR, UNSPEC_URSHR, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 FUNCTION (svrshrnb, unspec_based_function, (UNSPEC_RSHRNB, UNSPEC_RSHRNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 FUNCTION (svrshrnt, unspec_based_function, (UNSPEC_RSHRNT, UNSPEC_RSHRNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 FUNCTION (svrsra, unspec_based_add_function, (UNSPEC_SRSHR, UNSPEC_URSHR, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 FUNCTION (svrsubhnb, unspec_based_function, (UNSPEC_RSUBHNB,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 UNSPEC_RSUBHNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 FUNCTION (svrsubhnt, unspec_based_function, (UNSPEC_RSUBHNT,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 UNSPEC_RSUBHNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 FUNCTION (svsbclb, unspec_based_function, (-1, UNSPEC_SBCLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 FUNCTION (svsbclt, unspec_based_function, (-1, UNSPEC_SBCLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 FUNCTION (svshllb, unspec_based_function, (UNSPEC_SSHLLB, UNSPEC_USHLLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 FUNCTION (svshllt, unspec_based_function, (UNSPEC_SSHLLT, UNSPEC_USHLLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 FUNCTION (svshrnb, unspec_based_function, (UNSPEC_SHRNB, UNSPEC_SHRNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 FUNCTION (svshrnt, unspec_based_function, (UNSPEC_SHRNT, UNSPEC_SHRNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 FUNCTION (svsli, unspec_based_function, (UNSPEC_SLI, UNSPEC_SLI, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 FUNCTION (svsm4e, fixed_insn_function, (CODE_FOR_aarch64_sve2_sm4e))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 FUNCTION (svsm4ekey, fixed_insn_function, (CODE_FOR_aarch64_sve2_sm4ekey))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 FUNCTION (svsqadd, svsqadd_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 FUNCTION (svsra, svsra_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 FUNCTION (svsri, unspec_based_function, (UNSPEC_SRI, UNSPEC_SRI, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 FUNCTION (svstnt1_scatter, svstnt1_scatter_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 FUNCTION (svstnt1b_scatter, svstnt1_scatter_truncate_impl, (QImode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 FUNCTION (svstnt1h_scatter, svstnt1_scatter_truncate_impl, (HImode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 FUNCTION (svstnt1w_scatter, svstnt1_scatter_truncate_impl, (SImode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 FUNCTION (svsubhnb, unspec_based_function, (UNSPEC_SUBHNB, UNSPEC_SUBHNB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 FUNCTION (svsubhnt, unspec_based_function, (UNSPEC_SUBHNT, UNSPEC_SUBHNT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 FUNCTION (svsublb, unspec_based_function, (UNSPEC_SSUBLB, UNSPEC_USUBLB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 FUNCTION (svsublbt, unspec_based_function, (UNSPEC_SSUBLBT, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 FUNCTION (svsublt, unspec_based_function, (UNSPEC_SSUBLT, UNSPEC_USUBLT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 FUNCTION (svsubltb, unspec_based_function, (UNSPEC_SSUBLTB, -1, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 FUNCTION (svsubwb, unspec_based_function, (UNSPEC_SSUBWB, UNSPEC_USUBWB, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 FUNCTION (svsubwt, unspec_based_function, (UNSPEC_SSUBWT, UNSPEC_USUBWT, -1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 FUNCTION (svtbl2, svtbl2_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 FUNCTION (svtbx, CODE_FOR_MODE0 (aarch64_sve2_tbx),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 FUNCTION (svuqadd, svuqadd_impl,)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 FUNCTION (svwhilege, while_comparison, (UNSPEC_WHILEGE, UNSPEC_WHILEHS))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 FUNCTION (svwhilegt, while_comparison, (UNSPEC_WHILEGT, UNSPEC_WHILEHI))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 FUNCTION (svwhilerw, svwhilerw_svwhilewr_impl, (UNSPEC_WHILERW))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 FUNCTION (svwhilewr, svwhilerw_svwhilewr_impl, (UNSPEC_WHILEWR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 FUNCTION (svxar, CODE_FOR_MODE0 (aarch64_sve2_xar),)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 } /* end namespace aarch64_sve */