annotate gcc/config/nvptx/nvptx.md @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Machine description for NVPTX.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 ;; Copyright (C) 2014-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Bernd Schmidt <bernds@codesourcery.com>
kono
parents:
diff changeset
4 ;;
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6 ;;
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
8 ;; it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 ;; the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 ;; any later version.
kono
parents:
diff changeset
11 ;;
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 ;; GNU General Public License for more details.
kono
parents:
diff changeset
16 ;;
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 (define_c_enum "unspec" [
kono
parents:
diff changeset
22 UNSPEC_ARG_REG
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 UNSPEC_COPYSIGN
kono
parents:
diff changeset
25 UNSPEC_LOG2
kono
parents:
diff changeset
26 UNSPEC_EXP2
kono
parents:
diff changeset
27 UNSPEC_SIN
kono
parents:
diff changeset
28 UNSPEC_COS
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 UNSPEC_FPINT_FLOOR
kono
parents:
diff changeset
31 UNSPEC_FPINT_BTRUNC
kono
parents:
diff changeset
32 UNSPEC_FPINT_CEIL
kono
parents:
diff changeset
33 UNSPEC_FPINT_NEARBYINT
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 UNSPEC_BITREV
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 UNSPEC_ALLOCA
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 UNSPEC_SET_SOFTSTACK
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 UNSPEC_DIM_SIZE
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 UNSPEC_BIT_CONV
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 UNSPEC_VOTE_BALLOT
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 UNSPEC_LANEID
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 UNSPEC_SHUFFLE
kono
parents:
diff changeset
50 UNSPEC_BR_UNIFIED
kono
parents:
diff changeset
51 ])
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 (define_c_enum "unspecv" [
kono
parents:
diff changeset
54 UNSPECV_LOCK
kono
parents:
diff changeset
55 UNSPECV_CAS
kono
parents:
diff changeset
56 UNSPECV_XCHG
kono
parents:
diff changeset
57 UNSPECV_BARSYNC
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
58 UNSPECV_MEMBAR
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
59 UNSPECV_MEMBAR_CTA
111
kono
parents:
diff changeset
60 UNSPECV_DIM_POS
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 UNSPECV_FORK
kono
parents:
diff changeset
63 UNSPECV_FORKED
kono
parents:
diff changeset
64 UNSPECV_JOINING
kono
parents:
diff changeset
65 UNSPECV_JOIN
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 UNSPECV_NOUNROLL
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 UNSPECV_SIMT_ENTER
kono
parents:
diff changeset
70 UNSPECV_SIMT_EXIT
kono
parents:
diff changeset
71 ])
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 (define_attr "subregs_ok" "false,true"
kono
parents:
diff changeset
74 (const_string "false"))
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 (define_attr "atomic" "false,true"
kono
parents:
diff changeset
77 (const_string "false"))
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 ;; The nvptx operand predicates, in general, don't permit subregs and
kono
parents:
diff changeset
80 ;; only literal constants, which differ from the generic ones, which
kono
parents:
diff changeset
81 ;; permit subregs and symbolc constants (as appropriate)
kono
parents:
diff changeset
82 (define_predicate "nvptx_register_operand"
kono
parents:
diff changeset
83 (match_code "reg")
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 return register_operand (op, mode);
kono
parents:
diff changeset
86 })
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 (define_predicate "nvptx_nonimmediate_operand"
kono
parents:
diff changeset
89 (match_code "mem,reg")
kono
parents:
diff changeset
90 {
kono
parents:
diff changeset
91 return (REG_P (op) ? register_operand (op, mode)
kono
parents:
diff changeset
92 : memory_operand (op, mode));
kono
parents:
diff changeset
93 })
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 (define_predicate "nvptx_nonmemory_operand"
kono
parents:
diff changeset
96 (match_code "reg,const_int,const_double")
kono
parents:
diff changeset
97 {
kono
parents:
diff changeset
98 return (REG_P (op) ? register_operand (op, mode)
kono
parents:
diff changeset
99 : immediate_operand (op, mode));
kono
parents:
diff changeset
100 })
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 (define_predicate "const0_operand"
kono
parents:
diff changeset
103 (and (match_code "const_int")
kono
parents:
diff changeset
104 (match_test "op == const0_rtx")))
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 ;; True if this operator is valid for predication.
kono
parents:
diff changeset
107 (define_predicate "predicate_operator"
kono
parents:
diff changeset
108 (match_code "eq,ne"))
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 (define_predicate "ne_operator"
kono
parents:
diff changeset
111 (match_code "ne"))
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 (define_predicate "nvptx_comparison_operator"
kono
parents:
diff changeset
114 (match_code "eq,ne,le,ge,lt,gt,leu,geu,ltu,gtu"))
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 (define_predicate "nvptx_float_comparison_operator"
kono
parents:
diff changeset
117 (match_code "eq,ne,le,ge,lt,gt,uneq,unle,unge,unlt,ungt,unordered,ordered"))
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 ;; Test for a valid operand for a call instruction.
kono
parents:
diff changeset
120 (define_predicate "call_insn_operand"
kono
parents:
diff changeset
121 (match_code "symbol_ref,reg")
kono
parents:
diff changeset
122 {
kono
parents:
diff changeset
123 return REG_P (op) || SYMBOL_REF_FUNCTION_P (op);
kono
parents:
diff changeset
124 })
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 ;; Return true if OP is a call with parallel USEs of the argument
kono
parents:
diff changeset
127 ;; pseudos.
kono
parents:
diff changeset
128 (define_predicate "call_operation"
kono
parents:
diff changeset
129 (match_code "parallel")
kono
parents:
diff changeset
130 {
kono
parents:
diff changeset
131 int arg_end = XVECLEN (op, 0);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 for (int i = 1; i < arg_end; i++)
kono
parents:
diff changeset
134 {
kono
parents:
diff changeset
135 rtx elt = XVECEXP (op, 0, i);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 if (GET_CODE (elt) != USE || !REG_P (XEXP (elt, 0)))
kono
parents:
diff changeset
138 return false;
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140 return true;
kono
parents:
diff changeset
141 })
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 (define_attr "predicable" "false,true"
kono
parents:
diff changeset
144 (const_string "true"))
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 (define_cond_exec
kono
parents:
diff changeset
147 [(match_operator 0 "predicate_operator"
kono
parents:
diff changeset
148 [(match_operand:BI 1 "nvptx_register_operand" "")
kono
parents:
diff changeset
149 (match_operand:BI 2 "const0_operand" "")])]
kono
parents:
diff changeset
150 ""
kono
parents:
diff changeset
151 ""
kono
parents:
diff changeset
152 )
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 (define_constraint "P0"
kono
parents:
diff changeset
155 "An integer with the value 0."
kono
parents:
diff changeset
156 (and (match_code "const_int")
kono
parents:
diff changeset
157 (match_test "ival == 0")))
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 (define_constraint "P1"
kono
parents:
diff changeset
160 "An integer with the value 1."
kono
parents:
diff changeset
161 (and (match_code "const_int")
kono
parents:
diff changeset
162 (match_test "ival == 1")))
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 (define_constraint "Pn"
kono
parents:
diff changeset
165 "An integer with the value -1."
kono
parents:
diff changeset
166 (and (match_code "const_int")
kono
parents:
diff changeset
167 (match_test "ival == -1")))
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 (define_constraint "R"
kono
parents:
diff changeset
170 "A pseudo register."
kono
parents:
diff changeset
171 (match_code "reg"))
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 (define_constraint "Ia"
kono
parents:
diff changeset
174 "Any integer constant."
kono
parents:
diff changeset
175 (and (match_code "const_int") (match_test "true")))
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 (define_mode_iterator QHSDISDFM [QI HI SI DI SF DF])
kono
parents:
diff changeset
178 (define_mode_iterator QHSDIM [QI HI SI DI])
kono
parents:
diff changeset
179 (define_mode_iterator HSDIM [HI SI DI])
kono
parents:
diff changeset
180 (define_mode_iterator BHSDIM [BI HI SI DI])
kono
parents:
diff changeset
181 (define_mode_iterator SDIM [SI DI])
kono
parents:
diff changeset
182 (define_mode_iterator SDISDFM [SI DI SF DF])
kono
parents:
diff changeset
183 (define_mode_iterator QHIM [QI HI])
kono
parents:
diff changeset
184 (define_mode_iterator QHSIM [QI HI SI])
kono
parents:
diff changeset
185 (define_mode_iterator SDFM [SF DF])
kono
parents:
diff changeset
186 (define_mode_iterator SDCM [SC DC])
kono
parents:
diff changeset
187 (define_mode_iterator BITS [SI SF])
kono
parents:
diff changeset
188 (define_mode_iterator BITD [DI DF])
kono
parents:
diff changeset
189 (define_mode_iterator VECIM [V2SI V2DI])
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 ;; This mode iterator allows :P to be used for patterns that operate on
kono
parents:
diff changeset
192 ;; pointer-sized quantities. Exactly one of the two alternatives will match.
kono
parents:
diff changeset
193 (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 ;; We should get away with not defining memory alternatives, since we don't
kono
parents:
diff changeset
196 ;; get variables in this mode and pseudos are never spilled.
kono
parents:
diff changeset
197 (define_insn "movbi"
kono
parents:
diff changeset
198 [(set (match_operand:BI 0 "nvptx_register_operand" "=R,R,R")
kono
parents:
diff changeset
199 (match_operand:BI 1 "nvptx_nonmemory_operand" "R,P0,Pn"))]
kono
parents:
diff changeset
200 ""
kono
parents:
diff changeset
201 "@
kono
parents:
diff changeset
202 %.\\tmov%t0\\t%0, %1;
kono
parents:
diff changeset
203 %.\\tsetp.eq.u32\\t%0, 1, 0;
kono
parents:
diff changeset
204 %.\\tsetp.eq.u32\\t%0, 1, 1;")
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 (define_insn "*mov<mode>_insn"
kono
parents:
diff changeset
207 [(set (match_operand:VECIM 0 "nonimmediate_operand" "=R,R,m")
kono
parents:
diff changeset
208 (match_operand:VECIM 1 "general_operand" "Ri,m,R"))]
kono
parents:
diff changeset
209 "!MEM_P (operands[0]) || REG_P (operands[1])"
kono
parents:
diff changeset
210 {
kono
parents:
diff changeset
211 if (which_alternative == 1)
kono
parents:
diff changeset
212 return "%.\\tld%A1%u1\\t%0, %1;";
kono
parents:
diff changeset
213 if (which_alternative == 2)
kono
parents:
diff changeset
214 return "%.\\tst%A0%u0\\t%0, %1;";
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 return nvptx_output_mov_insn (operands[0], operands[1]);
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 (define_insn "*mov<mode>_insn"
kono
parents:
diff changeset
221 [(set (match_operand:QHSDIM 0 "nonimmediate_operand" "=R,R,m")
kono
parents:
diff changeset
222 (match_operand:QHSDIM 1 "general_operand" "Ri,m,R"))]
kono
parents:
diff changeset
223 "!MEM_P (operands[0]) || REG_P (operands[1])"
kono
parents:
diff changeset
224 {
kono
parents:
diff changeset
225 if (which_alternative == 1)
kono
parents:
diff changeset
226 return "%.\\tld%A1%u1\\t%0, %1;";
kono
parents:
diff changeset
227 if (which_alternative == 2)
kono
parents:
diff changeset
228 return "%.\\tst%A0%u0\\t%0, %1;";
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 return nvptx_output_mov_insn (operands[0], operands[1]);
kono
parents:
diff changeset
231 }
kono
parents:
diff changeset
232 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 (define_insn "*mov<mode>_insn"
kono
parents:
diff changeset
235 [(set (match_operand:SDFM 0 "nonimmediate_operand" "=R,R,m")
kono
parents:
diff changeset
236 (match_operand:SDFM 1 "general_operand" "RF,m,R"))]
kono
parents:
diff changeset
237 "!MEM_P (operands[0]) || REG_P (operands[1])"
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 if (which_alternative == 1)
kono
parents:
diff changeset
240 return "%.\\tld%A1%u0\\t%0, %1;";
kono
parents:
diff changeset
241 if (which_alternative == 2)
kono
parents:
diff changeset
242 return "%.\\tst%A0%u1\\t%0, %1;";
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 return nvptx_output_mov_insn (operands[0], operands[1]);
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 (define_insn "load_arg_reg<mode>"
kono
parents:
diff changeset
249 [(set (match_operand:QHIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
250 (unspec:QHIM [(match_operand 1 "const_int_operand" "n")]
kono
parents:
diff changeset
251 UNSPEC_ARG_REG))]
kono
parents:
diff changeset
252 ""
kono
parents:
diff changeset
253 "%.\\tcvt%t0.u32\\t%0, %%ar%1;")
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 (define_insn "load_arg_reg<mode>"
kono
parents:
diff changeset
256 [(set (match_operand:SDISDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
257 (unspec:SDISDFM [(match_operand 1 "const_int_operand" "n")]
kono
parents:
diff changeset
258 UNSPEC_ARG_REG))]
kono
parents:
diff changeset
259 ""
kono
parents:
diff changeset
260 "%.\\tmov%t0\\t%0, %%ar%1;")
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 (define_expand "mov<mode>"
kono
parents:
diff changeset
263 [(set (match_operand:VECIM 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
264 (match_operand:VECIM 1 "general_operand" ""))]
kono
parents:
diff changeset
265 ""
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 if (MEM_P (operands[0]) && !REG_P (operands[1]))
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 rtx tmp = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
270 emit_move_insn (tmp, operands[1]);
kono
parents:
diff changeset
271 emit_move_insn (operands[0], tmp);
kono
parents:
diff changeset
272 DONE;
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274 })
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 (define_expand "mov<mode>"
kono
parents:
diff changeset
277 [(set (match_operand:QHSDISDFM 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
278 (match_operand:QHSDISDFM 1 "general_operand" ""))]
kono
parents:
diff changeset
279 ""
kono
parents:
diff changeset
280 {
kono
parents:
diff changeset
281 if (MEM_P (operands[0]) && !REG_P (operands[1]))
kono
parents:
diff changeset
282 {
kono
parents:
diff changeset
283 rtx tmp = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
284 emit_move_insn (tmp, operands[1]);
kono
parents:
diff changeset
285 emit_move_insn (operands[0], tmp);
kono
parents:
diff changeset
286 DONE;
kono
parents:
diff changeset
287 }
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 if (GET_CODE (operands[1]) == LABEL_REF)
kono
parents:
diff changeset
290 sorry ("target cannot support label values");
kono
parents:
diff changeset
291 })
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 (define_insn "zero_extendqihi2"
kono
parents:
diff changeset
294 [(set (match_operand:HI 0 "nvptx_register_operand" "=R,R")
kono
parents:
diff changeset
295 (zero_extend:HI (match_operand:QI 1 "nvptx_nonimmediate_operand" "R,m")))]
kono
parents:
diff changeset
296 ""
kono
parents:
diff changeset
297 "@
kono
parents:
diff changeset
298 %.\\tcvt.u16.u%T1\\t%0, %1;
kono
parents:
diff changeset
299 %.\\tld%A1.u8\\t%0, %1;"
kono
parents:
diff changeset
300 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 (define_insn "zero_extend<mode>si2"
kono
parents:
diff changeset
303 [(set (match_operand:SI 0 "nvptx_register_operand" "=R,R")
kono
parents:
diff changeset
304 (zero_extend:SI (match_operand:QHIM 1 "nvptx_nonimmediate_operand" "R,m")))]
kono
parents:
diff changeset
305 ""
kono
parents:
diff changeset
306 "@
kono
parents:
diff changeset
307 %.\\tcvt.u32.u%T1\\t%0, %1;
kono
parents:
diff changeset
308 %.\\tld%A1.u%T1\\t%0, %1;"
kono
parents:
diff changeset
309 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 (define_insn "zero_extend<mode>di2"
kono
parents:
diff changeset
312 [(set (match_operand:DI 0 "nvptx_register_operand" "=R,R")
kono
parents:
diff changeset
313 (zero_extend:DI (match_operand:QHSIM 1 "nvptx_nonimmediate_operand" "R,m")))]
kono
parents:
diff changeset
314 ""
kono
parents:
diff changeset
315 "@
kono
parents:
diff changeset
316 %.\\tcvt.u64.u%T1\\t%0, %1;
kono
parents:
diff changeset
317 %.\\tld%A1%u1\\t%0, %1;"
kono
parents:
diff changeset
318 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 (define_insn "extend<mode>si2"
kono
parents:
diff changeset
321 [(set (match_operand:SI 0 "nvptx_register_operand" "=R,R")
kono
parents:
diff changeset
322 (sign_extend:SI (match_operand:QHIM 1 "nvptx_nonimmediate_operand" "R,m")))]
kono
parents:
diff changeset
323 ""
kono
parents:
diff changeset
324 "@
kono
parents:
diff changeset
325 %.\\tcvt.s32.s%T1\\t%0, %1;
kono
parents:
diff changeset
326 %.\\tld%A1.s%T1\\t%0, %1;"
kono
parents:
diff changeset
327 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 (define_insn "extend<mode>di2"
kono
parents:
diff changeset
330 [(set (match_operand:DI 0 "nvptx_register_operand" "=R,R")
kono
parents:
diff changeset
331 (sign_extend:DI (match_operand:QHSIM 1 "nvptx_nonimmediate_operand" "R,m")))]
kono
parents:
diff changeset
332 ""
kono
parents:
diff changeset
333 "@
kono
parents:
diff changeset
334 %.\\tcvt.s64.s%T1\\t%0, %1;
kono
parents:
diff changeset
335 %.\\tld%A1.s%T1\\t%0, %1;"
kono
parents:
diff changeset
336 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 (define_insn "trunchiqi2"
kono
parents:
diff changeset
339 [(set (match_operand:QI 0 "nvptx_nonimmediate_operand" "=R,m")
kono
parents:
diff changeset
340 (truncate:QI (match_operand:HI 1 "nvptx_register_operand" "R,R")))]
kono
parents:
diff changeset
341 ""
kono
parents:
diff changeset
342 "@
kono
parents:
diff changeset
343 %.\\tcvt%t0.u16\\t%0, %1;
kono
parents:
diff changeset
344 %.\\tst%A0.u8\\t%0, %1;"
kono
parents:
diff changeset
345 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 (define_insn "truncsi<mode>2"
kono
parents:
diff changeset
348 [(set (match_operand:QHIM 0 "nvptx_nonimmediate_operand" "=R,m")
kono
parents:
diff changeset
349 (truncate:QHIM (match_operand:SI 1 "nvptx_register_operand" "R,R")))]
kono
parents:
diff changeset
350 ""
kono
parents:
diff changeset
351 "@
kono
parents:
diff changeset
352 %.\\tcvt%t0.u32\\t%0, %1;
kono
parents:
diff changeset
353 %.\\tst%A0.u%T0\\t%0, %1;"
kono
parents:
diff changeset
354 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 (define_insn "truncdi<mode>2"
kono
parents:
diff changeset
357 [(set (match_operand:QHSIM 0 "nvptx_nonimmediate_operand" "=R,m")
kono
parents:
diff changeset
358 (truncate:QHSIM (match_operand:DI 1 "nvptx_register_operand" "R,R")))]
kono
parents:
diff changeset
359 ""
kono
parents:
diff changeset
360 "@
kono
parents:
diff changeset
361 %.\\tcvt%t0.u64\\t%0, %1;
kono
parents:
diff changeset
362 %.\\tst%A0.u%T0\\t%0, %1;"
kono
parents:
diff changeset
363 [(set_attr "subregs_ok" "true")])
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 ;; Integer arithmetic
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 (define_insn "add<mode>3"
kono
parents:
diff changeset
368 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
369 (plus:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
370 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
371 ""
kono
parents:
diff changeset
372 "%.\\tadd%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 (define_insn "sub<mode>3"
kono
parents:
diff changeset
375 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
376 (minus:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
377 (match_operand:HSDIM 2 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
378 ""
kono
parents:
diff changeset
379 "%.\\tsub%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 (define_insn "mul<mode>3"
kono
parents:
diff changeset
382 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
383 (mult:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
384 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
385 ""
kono
parents:
diff changeset
386 "%.\\tmul.lo%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 (define_insn "*mad<mode>3"
kono
parents:
diff changeset
389 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
390 (plus:HSDIM (mult:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
391 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri"))
kono
parents:
diff changeset
392 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
393 ""
kono
parents:
diff changeset
394 "%.\\tmad.lo%t0\\t%0, %1, %2, %3;")
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 (define_insn "div<mode>3"
kono
parents:
diff changeset
397 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
398 (div:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
399 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
400 ""
kono
parents:
diff changeset
401 "%.\\tdiv.s%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 (define_insn "udiv<mode>3"
kono
parents:
diff changeset
404 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
405 (udiv:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
406 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
407 ""
kono
parents:
diff changeset
408 "%.\\tdiv.u%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 (define_insn "mod<mode>3"
kono
parents:
diff changeset
411 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
412 (mod:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "Ri")
kono
parents:
diff changeset
413 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
414 ""
kono
parents:
diff changeset
415 "%.\\trem.s%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 (define_insn "umod<mode>3"
kono
parents:
diff changeset
418 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
419 (umod:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "Ri")
kono
parents:
diff changeset
420 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
421 ""
kono
parents:
diff changeset
422 "%.\\trem.u%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 (define_insn "smin<mode>3"
kono
parents:
diff changeset
425 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
426 (smin:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
427 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
428 ""
kono
parents:
diff changeset
429 "%.\\tmin.s%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 (define_insn "umin<mode>3"
kono
parents:
diff changeset
432 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
433 (umin:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
434 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
435 ""
kono
parents:
diff changeset
436 "%.\\tmin.u%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 (define_insn "smax<mode>3"
kono
parents:
diff changeset
439 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
440 (smax:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
441 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
442 ""
kono
parents:
diff changeset
443 "%.\\tmax.s%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 (define_insn "umax<mode>3"
kono
parents:
diff changeset
446 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
447 (umax:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
448 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
449 ""
kono
parents:
diff changeset
450 "%.\\tmax.u%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 (define_insn "abs<mode>2"
kono
parents:
diff changeset
453 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
454 (abs:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
455 ""
kono
parents:
diff changeset
456 "%.\\tabs.s%T0\\t%0, %1;")
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 (define_insn "neg<mode>2"
kono
parents:
diff changeset
459 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
460 (neg:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
461 ""
kono
parents:
diff changeset
462 "%.\\tneg.s%T0\\t%0, %1;")
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 (define_insn "one_cmpl<mode>2"
kono
parents:
diff changeset
465 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
466 (not:HSDIM (match_operand:HSDIM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
467 ""
kono
parents:
diff changeset
468 "%.\\tnot.b%T0\\t%0, %1;")
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 (define_insn "bitrev<mode>2"
kono
parents:
diff changeset
471 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
472 (unspec:SDIM [(match_operand:SDIM 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
473 UNSPEC_BITREV))]
kono
parents:
diff changeset
474 ""
kono
parents:
diff changeset
475 "%.\\tbrev.b%T0\\t%0, %1;")
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 (define_insn "clz<mode>2"
kono
parents:
diff changeset
478 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
479 (clz:SI (match_operand:SDIM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
480 ""
kono
parents:
diff changeset
481 "%.\\tclz.b%T1\\t%0, %1;")
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 (define_expand "ctz<mode>2"
kono
parents:
diff changeset
484 [(set (match_operand:SI 0 "nvptx_register_operand" "")
kono
parents:
diff changeset
485 (ctz:SI (match_operand:SDIM 1 "nvptx_register_operand" "")))]
kono
parents:
diff changeset
486 ""
kono
parents:
diff changeset
487 {
kono
parents:
diff changeset
488 rtx tmpreg = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
489 emit_insn (gen_bitrev<mode>2 (tmpreg, operands[1]));
kono
parents:
diff changeset
490 emit_insn (gen_clz<mode>2 (operands[0], tmpreg));
kono
parents:
diff changeset
491 DONE;
kono
parents:
diff changeset
492 })
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 ;; Shifts
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 (define_insn "ashl<mode>3"
kono
parents:
diff changeset
497 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
498 (ashift:SDIM (match_operand:SDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
499 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
500 ""
kono
parents:
diff changeset
501 "%.\\tshl.b%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 (define_insn "ashr<mode>3"
kono
parents:
diff changeset
504 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
505 (ashiftrt:SDIM (match_operand:SDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
506 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
507 ""
kono
parents:
diff changeset
508 "%.\\tshr.s%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 (define_insn "lshr<mode>3"
kono
parents:
diff changeset
511 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
512 (lshiftrt:SDIM (match_operand:SDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
513 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
514 ""
kono
parents:
diff changeset
515 "%.\\tshr.u%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 ;; Logical operations
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 (define_insn "and<mode>3"
kono
parents:
diff changeset
520 [(set (match_operand:BHSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
521 (and:BHSDIM (match_operand:BHSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
522 (match_operand:BHSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
523 ""
kono
parents:
diff changeset
524 "%.\\tand.b%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 (define_insn "ior<mode>3"
kono
parents:
diff changeset
527 [(set (match_operand:BHSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
528 (ior:BHSDIM (match_operand:BHSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
529 (match_operand:BHSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
530 ""
kono
parents:
diff changeset
531 "%.\\tor.b%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 (define_insn "xor<mode>3"
kono
parents:
diff changeset
534 [(set (match_operand:BHSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
535 (xor:BHSDIM (match_operand:BHSDIM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
536 (match_operand:BHSDIM 2 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
537 ""
kono
parents:
diff changeset
538 "%.\\txor.b%T0\\t%0, %1, %2;")
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 ;; Comparisons and branches
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 (define_insn "*cmp<mode>"
kono
parents:
diff changeset
543 [(set (match_operand:BI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
544 (match_operator:BI 1 "nvptx_comparison_operator"
kono
parents:
diff changeset
545 [(match_operand:HSDIM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
546 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")]))]
kono
parents:
diff changeset
547 ""
kono
parents:
diff changeset
548 "%.\\tsetp%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 (define_insn "*cmp<mode>"
kono
parents:
diff changeset
551 [(set (match_operand:BI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
552 (match_operator:BI 1 "nvptx_float_comparison_operator"
kono
parents:
diff changeset
553 [(match_operand:SDFM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
554 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")]))]
kono
parents:
diff changeset
555 ""
kono
parents:
diff changeset
556 "%.\\tsetp%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 (define_insn "jump"
kono
parents:
diff changeset
559 [(set (pc)
kono
parents:
diff changeset
560 (label_ref (match_operand 0 "" "")))]
kono
parents:
diff changeset
561 ""
kono
parents:
diff changeset
562 "%.\\tbra\\t%l0;")
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 (define_insn "br_true"
kono
parents:
diff changeset
565 [(set (pc)
kono
parents:
diff changeset
566 (if_then_else (ne (match_operand:BI 0 "nvptx_register_operand" "R")
kono
parents:
diff changeset
567 (const_int 0))
kono
parents:
diff changeset
568 (label_ref (match_operand 1 "" ""))
kono
parents:
diff changeset
569 (pc)))]
kono
parents:
diff changeset
570 ""
kono
parents:
diff changeset
571 "%j0\\tbra\\t%l1;"
kono
parents:
diff changeset
572 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 (define_insn "br_false"
kono
parents:
diff changeset
575 [(set (pc)
kono
parents:
diff changeset
576 (if_then_else (eq (match_operand:BI 0 "nvptx_register_operand" "R")
kono
parents:
diff changeset
577 (const_int 0))
kono
parents:
diff changeset
578 (label_ref (match_operand 1 "" ""))
kono
parents:
diff changeset
579 (pc)))]
kono
parents:
diff changeset
580 ""
kono
parents:
diff changeset
581 "%J0\\tbra\\t%l1;"
kono
parents:
diff changeset
582 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 ;; unified conditional branch
kono
parents:
diff changeset
585 (define_insn "br_true_uni"
kono
parents:
diff changeset
586 [(set (pc) (if_then_else
kono
parents:
diff changeset
587 (ne (unspec:BI [(match_operand:BI 0 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
588 UNSPEC_BR_UNIFIED) (const_int 0))
kono
parents:
diff changeset
589 (label_ref (match_operand 1 "" "")) (pc)))]
kono
parents:
diff changeset
590 ""
kono
parents:
diff changeset
591 "%j0\\tbra.uni\\t%l1;"
kono
parents:
diff changeset
592 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 (define_insn "br_false_uni"
kono
parents:
diff changeset
595 [(set (pc) (if_then_else
kono
parents:
diff changeset
596 (eq (unspec:BI [(match_operand:BI 0 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
597 UNSPEC_BR_UNIFIED) (const_int 0))
kono
parents:
diff changeset
598 (label_ref (match_operand 1 "" "")) (pc)))]
kono
parents:
diff changeset
599 ""
kono
parents:
diff changeset
600 "%J0\\tbra.uni\\t%l1;"
kono
parents:
diff changeset
601 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 (define_expand "cbranch<mode>4"
kono
parents:
diff changeset
604 [(set (pc)
kono
parents:
diff changeset
605 (if_then_else (match_operator 0 "nvptx_comparison_operator"
kono
parents:
diff changeset
606 [(match_operand:HSDIM 1 "nvptx_register_operand" "")
kono
parents:
diff changeset
607 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "")])
kono
parents:
diff changeset
608 (label_ref (match_operand 3 "" ""))
kono
parents:
diff changeset
609 (pc)))]
kono
parents:
diff changeset
610 ""
kono
parents:
diff changeset
611 {
kono
parents:
diff changeset
612 rtx t = nvptx_expand_compare (operands[0]);
kono
parents:
diff changeset
613 operands[0] = t;
kono
parents:
diff changeset
614 operands[1] = XEXP (t, 0);
kono
parents:
diff changeset
615 operands[2] = XEXP (t, 1);
kono
parents:
diff changeset
616 })
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 (define_expand "cbranch<mode>4"
kono
parents:
diff changeset
619 [(set (pc)
kono
parents:
diff changeset
620 (if_then_else (match_operator 0 "nvptx_float_comparison_operator"
kono
parents:
diff changeset
621 [(match_operand:SDFM 1 "nvptx_register_operand" "")
kono
parents:
diff changeset
622 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "")])
kono
parents:
diff changeset
623 (label_ref (match_operand 3 "" ""))
kono
parents:
diff changeset
624 (pc)))]
kono
parents:
diff changeset
625 ""
kono
parents:
diff changeset
626 {
kono
parents:
diff changeset
627 rtx t = nvptx_expand_compare (operands[0]);
kono
parents:
diff changeset
628 operands[0] = t;
kono
parents:
diff changeset
629 operands[1] = XEXP (t, 0);
kono
parents:
diff changeset
630 operands[2] = XEXP (t, 1);
kono
parents:
diff changeset
631 })
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 (define_expand "cbranchbi4"
kono
parents:
diff changeset
634 [(set (pc)
kono
parents:
diff changeset
635 (if_then_else (match_operator 0 "predicate_operator"
kono
parents:
diff changeset
636 [(match_operand:BI 1 "nvptx_register_operand" "")
kono
parents:
diff changeset
637 (match_operand:BI 2 "const0_operand" "")])
kono
parents:
diff changeset
638 (label_ref (match_operand 3 "" ""))
kono
parents:
diff changeset
639 (pc)))]
kono
parents:
diff changeset
640 ""
kono
parents:
diff changeset
641 "")
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 ;; Conditional stores
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 (define_insn "setcc_from_bi"
kono
parents:
diff changeset
646 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
647 (ne:SI (match_operand:BI 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
648 (const_int 0)))]
kono
parents:
diff changeset
649 ""
kono
parents:
diff changeset
650 "%.\\tselp%t0 %0,-1,0,%1;")
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 (define_insn "sel_true<mode>"
kono
parents:
diff changeset
653 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
654 (if_then_else:HSDIM
kono
parents:
diff changeset
655 (ne (match_operand:BI 1 "nvptx_register_operand" "R") (const_int 0))
kono
parents:
diff changeset
656 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
657 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
658 ""
kono
parents:
diff changeset
659 "%.\\tselp%t0\\t%0, %2, %3, %1;")
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 (define_insn "sel_true<mode>"
kono
parents:
diff changeset
662 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
663 (if_then_else:SDFM
kono
parents:
diff changeset
664 (ne (match_operand:BI 1 "nvptx_register_operand" "R") (const_int 0))
kono
parents:
diff changeset
665 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")
kono
parents:
diff changeset
666 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
667 ""
kono
parents:
diff changeset
668 "%.\\tselp%t0\\t%0, %2, %3, %1;")
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 (define_insn "sel_false<mode>"
kono
parents:
diff changeset
671 [(set (match_operand:HSDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
672 (if_then_else:HSDIM
kono
parents:
diff changeset
673 (eq (match_operand:BI 1 "nvptx_register_operand" "R") (const_int 0))
kono
parents:
diff changeset
674 (match_operand:HSDIM 2 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
675 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")))]
kono
parents:
diff changeset
676 ""
kono
parents:
diff changeset
677 "%.\\tselp%t0\\t%0, %3, %2, %1;")
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 (define_insn "sel_false<mode>"
kono
parents:
diff changeset
680 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
681 (if_then_else:SDFM
kono
parents:
diff changeset
682 (eq (match_operand:BI 1 "nvptx_register_operand" "R") (const_int 0))
kono
parents:
diff changeset
683 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")
kono
parents:
diff changeset
684 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
685 ""
kono
parents:
diff changeset
686 "%.\\tselp%t0\\t%0, %3, %2, %1;")
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 (define_insn "setcc_int<mode>"
kono
parents:
diff changeset
689 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
690 (match_operator:SI 1 "nvptx_comparison_operator"
kono
parents:
diff changeset
691 [(match_operand:HSDIM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
692 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")]))]
kono
parents:
diff changeset
693 ""
kono
parents:
diff changeset
694 "%.\\tset%t0%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 (define_insn "setcc_int<mode>"
kono
parents:
diff changeset
697 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
698 (match_operator:SI 1 "nvptx_float_comparison_operator"
kono
parents:
diff changeset
699 [(match_operand:SDFM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
700 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")]))]
kono
parents:
diff changeset
701 ""
kono
parents:
diff changeset
702 "%.\\tset%t0%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 (define_insn "setcc_float<mode>"
kono
parents:
diff changeset
705 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
706 (match_operator:SF 1 "nvptx_comparison_operator"
kono
parents:
diff changeset
707 [(match_operand:HSDIM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
708 (match_operand:HSDIM 3 "nvptx_nonmemory_operand" "Ri")]))]
kono
parents:
diff changeset
709 ""
kono
parents:
diff changeset
710 "%.\\tset%t0%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 (define_insn "setcc_float<mode>"
kono
parents:
diff changeset
713 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
714 (match_operator:SF 1 "nvptx_float_comparison_operator"
kono
parents:
diff changeset
715 [(match_operand:SDFM 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
716 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")]))]
kono
parents:
diff changeset
717 ""
kono
parents:
diff changeset
718 "%.\\tset%t0%c1\\t%0, %2, %3;")
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 (define_expand "cstorebi4"
kono
parents:
diff changeset
721 [(set (match_operand:SI 0 "nvptx_register_operand")
kono
parents:
diff changeset
722 (match_operator:SI 1 "ne_operator"
kono
parents:
diff changeset
723 [(match_operand:BI 2 "nvptx_register_operand")
kono
parents:
diff changeset
724 (match_operand:BI 3 "const0_operand")]))]
kono
parents:
diff changeset
725 ""
kono
parents:
diff changeset
726 "")
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 (define_expand "cstore<mode>4"
kono
parents:
diff changeset
729 [(set (match_operand:SI 0 "nvptx_register_operand")
kono
parents:
diff changeset
730 (match_operator:SI 1 "nvptx_comparison_operator"
kono
parents:
diff changeset
731 [(match_operand:HSDIM 2 "nvptx_register_operand")
kono
parents:
diff changeset
732 (match_operand:HSDIM 3 "nvptx_nonmemory_operand")]))]
kono
parents:
diff changeset
733 ""
kono
parents:
diff changeset
734 "")
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 (define_expand "cstore<mode>4"
kono
parents:
diff changeset
737 [(set (match_operand:SI 0 "nvptx_register_operand")
kono
parents:
diff changeset
738 (match_operator:SI 1 "nvptx_float_comparison_operator"
kono
parents:
diff changeset
739 [(match_operand:SDFM 2 "nvptx_register_operand")
kono
parents:
diff changeset
740 (match_operand:SDFM 3 "nvptx_nonmemory_operand")]))]
kono
parents:
diff changeset
741 ""
kono
parents:
diff changeset
742 "")
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 ;; Calls
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 (define_insn "call_insn"
kono
parents:
diff changeset
747 [(match_parallel 2 "call_operation"
kono
parents:
diff changeset
748 [(call (mem:QI (match_operand 0 "call_insn_operand" "Rs"))
kono
parents:
diff changeset
749 (match_operand 1))])]
kono
parents:
diff changeset
750 ""
kono
parents:
diff changeset
751 {
kono
parents:
diff changeset
752 return nvptx_output_call_insn (insn, NULL_RTX, operands[0]);
kono
parents:
diff changeset
753 })
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 (define_insn "call_value_insn"
kono
parents:
diff changeset
756 [(match_parallel 3 "call_operation"
kono
parents:
diff changeset
757 [(set (match_operand 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
758 (call (mem:QI (match_operand 1 "call_insn_operand" "Rs"))
kono
parents:
diff changeset
759 (match_operand 2)))])]
kono
parents:
diff changeset
760 ""
kono
parents:
diff changeset
761 {
kono
parents:
diff changeset
762 return nvptx_output_call_insn (insn, operands[0], operands[1]);
kono
parents:
diff changeset
763 })
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 (define_expand "call"
kono
parents:
diff changeset
766 [(match_operand 0 "" "")]
kono
parents:
diff changeset
767 ""
kono
parents:
diff changeset
768 {
kono
parents:
diff changeset
769 nvptx_expand_call (NULL_RTX, operands[0]);
kono
parents:
diff changeset
770 DONE;
kono
parents:
diff changeset
771 })
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 (define_expand "call_value"
kono
parents:
diff changeset
774 [(match_operand 0 "" "")
kono
parents:
diff changeset
775 (match_operand 1 "" "")]
kono
parents:
diff changeset
776 ""
kono
parents:
diff changeset
777 {
kono
parents:
diff changeset
778 nvptx_expand_call (operands[0], operands[1]);
kono
parents:
diff changeset
779 DONE;
kono
parents:
diff changeset
780 })
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 ;; Floating point arithmetic.
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 (define_insn "add<mode>3"
kono
parents:
diff changeset
785 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
786 (plus:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
787 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
788 ""
kono
parents:
diff changeset
789 "%.\\tadd%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 (define_insn "sub<mode>3"
kono
parents:
diff changeset
792 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
793 (minus:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
794 (match_operand:SDFM 2 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
795 ""
kono
parents:
diff changeset
796 "%.\\tsub%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 (define_insn "mul<mode>3"
kono
parents:
diff changeset
799 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
800 (mult:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
801 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
802 ""
kono
parents:
diff changeset
803 "%.\\tmul%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 (define_insn "fma<mode>4"
kono
parents:
diff changeset
806 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
807 (fma:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
808 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")
kono
parents:
diff changeset
809 (match_operand:SDFM 3 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
810 ""
kono
parents:
diff changeset
811 "%.\\tfma%#%t0\\t%0, %1, %2, %3;")
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 (define_insn "div<mode>3"
kono
parents:
diff changeset
814 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
815 (div:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
816 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
817 ""
kono
parents:
diff changeset
818 "%.\\tdiv%#%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 (define_insn "copysign<mode>3"
kono
parents:
diff changeset
821 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
822 (unspec:SDFM [(match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
823 (match_operand:SDFM 2 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
824 UNSPEC_COPYSIGN))]
kono
parents:
diff changeset
825 ""
kono
parents:
diff changeset
826 "%.\\tcopysign%t0\\t%0, %2, %1;")
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 (define_insn "smin<mode>3"
kono
parents:
diff changeset
829 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
830 (smin:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
831 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
832 ""
kono
parents:
diff changeset
833 "%.\\tmin%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 (define_insn "smax<mode>3"
kono
parents:
diff changeset
836 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
837 (smax:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
838 (match_operand:SDFM 2 "nvptx_nonmemory_operand" "RF")))]
kono
parents:
diff changeset
839 ""
kono
parents:
diff changeset
840 "%.\\tmax%t0\\t%0, %1, %2;")
kono
parents:
diff changeset
841
kono
parents:
diff changeset
842 (define_insn "abs<mode>2"
kono
parents:
diff changeset
843 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
844 (abs:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
845 ""
kono
parents:
diff changeset
846 "%.\\tabs%t0\\t%0, %1;")
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 (define_insn "neg<mode>2"
kono
parents:
diff changeset
849 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
850 (neg:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
851 ""
kono
parents:
diff changeset
852 "%.\\tneg%t0\\t%0, %1;")
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 (define_insn "sqrt<mode>2"
kono
parents:
diff changeset
855 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
856 (sqrt:SDFM (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
857 ""
kono
parents:
diff changeset
858 "%.\\tsqrt%#%t0\\t%0, %1;")
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 (define_expand "sincossf3"
kono
parents:
diff changeset
861 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
862 (unspec:SF [(match_operand:SF 2 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
863 UNSPEC_COS))
kono
parents:
diff changeset
864 (set (match_operand:SF 1 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
865 (unspec:SF [(match_dup 2)] UNSPEC_SIN))]
kono
parents:
diff changeset
866 "flag_unsafe_math_optimizations"
kono
parents:
diff changeset
867 {
kono
parents:
diff changeset
868 operands[2] = make_safe_from (operands[2], operands[0]);
kono
parents:
diff changeset
869 })
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 (define_insn "sinsf2"
kono
parents:
diff changeset
872 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
873 (unspec:SF [(match_operand:SF 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
874 UNSPEC_SIN))]
kono
parents:
diff changeset
875 "flag_unsafe_math_optimizations"
kono
parents:
diff changeset
876 "%.\\tsin.approx%t0\\t%0, %1;")
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 (define_insn "cossf2"
kono
parents:
diff changeset
879 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
880 (unspec:SF [(match_operand:SF 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
881 UNSPEC_COS))]
kono
parents:
diff changeset
882 "flag_unsafe_math_optimizations"
kono
parents:
diff changeset
883 "%.\\tcos.approx%t0\\t%0, %1;")
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 (define_insn "log2sf2"
kono
parents:
diff changeset
886 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
887 (unspec:SF [(match_operand:SF 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
888 UNSPEC_LOG2))]
kono
parents:
diff changeset
889 "flag_unsafe_math_optimizations"
kono
parents:
diff changeset
890 "%.\\tlg2.approx%t0\\t%0, %1;")
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 (define_insn "exp2sf2"
kono
parents:
diff changeset
893 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
894 (unspec:SF [(match_operand:SF 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
895 UNSPEC_EXP2))]
kono
parents:
diff changeset
896 "flag_unsafe_math_optimizations"
kono
parents:
diff changeset
897 "%.\\tex2.approx%t0\\t%0, %1;")
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 ;; Conversions involving floating point
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 (define_insn "extendsfdf2"
kono
parents:
diff changeset
902 [(set (match_operand:DF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
903 (float_extend:DF (match_operand:SF 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
904 ""
kono
parents:
diff changeset
905 "%.\\tcvt%t0%t1\\t%0, %1;")
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 (define_insn "truncdfsf2"
kono
parents:
diff changeset
908 [(set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
909 (float_truncate:SF (match_operand:DF 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
910 ""
kono
parents:
diff changeset
911 "%.\\tcvt%#%t0%t1\\t%0, %1;")
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 (define_insn "floatunssi<mode>2"
kono
parents:
diff changeset
914 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
915 (unsigned_float:SDFM (match_operand:SI 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
916 ""
kono
parents:
diff changeset
917 "%.\\tcvt%#%t0.u%T1\\t%0, %1;")
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 (define_insn "floatsi<mode>2"
kono
parents:
diff changeset
920 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
921 (float:SDFM (match_operand:SI 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
922 ""
kono
parents:
diff changeset
923 "%.\\tcvt%#%t0.s%T1\\t%0, %1;")
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 (define_insn "floatunsdi<mode>2"
kono
parents:
diff changeset
926 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
927 (unsigned_float:SDFM (match_operand:DI 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
928 ""
kono
parents:
diff changeset
929 "%.\\tcvt%#%t0.u%T1\\t%0, %1;")
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 (define_insn "floatdi<mode>2"
kono
parents:
diff changeset
932 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
933 (float:SDFM (match_operand:DI 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
934 ""
kono
parents:
diff changeset
935 "%.\\tcvt%#%t0.s%T1\\t%0, %1;")
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 (define_insn "fixuns_trunc<mode>si2"
kono
parents:
diff changeset
938 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
939 (unsigned_fix:SI (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
940 ""
kono
parents:
diff changeset
941 "%.\\tcvt.rzi.u%T0%t1\\t%0, %1;")
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 (define_insn "fix_trunc<mode>si2"
kono
parents:
diff changeset
944 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
945 (fix:SI (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
946 ""
kono
parents:
diff changeset
947 "%.\\tcvt.rzi.s%T0%t1\\t%0, %1;")
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 (define_insn "fixuns_trunc<mode>di2"
kono
parents:
diff changeset
950 [(set (match_operand:DI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
951 (unsigned_fix:DI (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
952 ""
kono
parents:
diff changeset
953 "%.\\tcvt.rzi.u%T0%t1\\t%0, %1;")
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 (define_insn "fix_trunc<mode>di2"
kono
parents:
diff changeset
956 [(set (match_operand:DI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
957 (fix:DI (match_operand:SDFM 1 "nvptx_register_operand" "R")))]
kono
parents:
diff changeset
958 ""
kono
parents:
diff changeset
959 "%.\\tcvt.rzi.s%T0%t1\\t%0, %1;")
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 (define_int_iterator FPINT [UNSPEC_FPINT_FLOOR UNSPEC_FPINT_BTRUNC
kono
parents:
diff changeset
962 UNSPEC_FPINT_CEIL UNSPEC_FPINT_NEARBYINT])
kono
parents:
diff changeset
963 (define_int_attr fpint_name [(UNSPEC_FPINT_FLOOR "floor")
kono
parents:
diff changeset
964 (UNSPEC_FPINT_BTRUNC "btrunc")
kono
parents:
diff changeset
965 (UNSPEC_FPINT_CEIL "ceil")
kono
parents:
diff changeset
966 (UNSPEC_FPINT_NEARBYINT "nearbyint")])
kono
parents:
diff changeset
967 (define_int_attr fpint_roundingmode [(UNSPEC_FPINT_FLOOR ".rmi")
kono
parents:
diff changeset
968 (UNSPEC_FPINT_BTRUNC ".rzi")
kono
parents:
diff changeset
969 (UNSPEC_FPINT_CEIL ".rpi")
kono
parents:
diff changeset
970 (UNSPEC_FPINT_NEARBYINT "%#i")])
kono
parents:
diff changeset
971
kono
parents:
diff changeset
972 (define_insn "<FPINT:fpint_name><SDFM:mode>2"
kono
parents:
diff changeset
973 [(set (match_operand:SDFM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
974 (unspec:SDFM [(match_operand:SDFM 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
975 FPINT))]
kono
parents:
diff changeset
976 ""
kono
parents:
diff changeset
977 "%.\\tcvt<FPINT:fpint_roundingmode>%t0%t1\\t%0, %1;")
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 (define_int_iterator FPINT2 [UNSPEC_FPINT_FLOOR UNSPEC_FPINT_CEIL])
kono
parents:
diff changeset
980 (define_int_attr fpint2_name [(UNSPEC_FPINT_FLOOR "lfloor")
kono
parents:
diff changeset
981 (UNSPEC_FPINT_CEIL "lceil")])
kono
parents:
diff changeset
982 (define_int_attr fpint2_roundingmode [(UNSPEC_FPINT_FLOOR ".rmi")
kono
parents:
diff changeset
983 (UNSPEC_FPINT_CEIL ".rpi")])
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 (define_insn "<FPINT2:fpint2_name><SDFM:mode><SDIM:mode>2"
kono
parents:
diff changeset
986 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
987 (unspec:SDIM [(match_operand:SDFM 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
988 FPINT2))]
kono
parents:
diff changeset
989 ""
kono
parents:
diff changeset
990 "%.\\tcvt<FPINT2:fpint2_roundingmode>.s%T0%t1\\t%0, %1;")
kono
parents:
diff changeset
991
kono
parents:
diff changeset
992 ;; Miscellaneous
kono
parents:
diff changeset
993
kono
parents:
diff changeset
994 (define_insn "nop"
kono
parents:
diff changeset
995 [(const_int 0)]
kono
parents:
diff changeset
996 ""
kono
parents:
diff changeset
997 "")
kono
parents:
diff changeset
998
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 (define_insn "exit"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 [(const_int 1)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002 "exit;")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1004 (define_insn "fake_nop"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1005 [(const_int 2)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1006 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007 "{
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008 .reg .u32 %%nop_src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1009 .reg .u32 %%nop_dst;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1010 mov.u32 %%nop_dst, %%nop_src;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011 }")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012
111
kono
parents:
diff changeset
1013 (define_insn "return"
kono
parents:
diff changeset
1014 [(return)]
kono
parents:
diff changeset
1015 ""
kono
parents:
diff changeset
1016 {
kono
parents:
diff changeset
1017 return nvptx_output_return ();
kono
parents:
diff changeset
1018 }
kono
parents:
diff changeset
1019 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 (define_expand "epilogue"
kono
parents:
diff changeset
1022 [(clobber (const_int 0))]
kono
parents:
diff changeset
1023 ""
kono
parents:
diff changeset
1024 {
kono
parents:
diff changeset
1025 if (TARGET_SOFT_STACK)
kono
parents:
diff changeset
1026 emit_insn (gen_set_softstack_insn (gen_rtx_REG (Pmode,
kono
parents:
diff changeset
1027 SOFTSTACK_PREV_REGNUM)));
kono
parents:
diff changeset
1028 emit_jump_insn (gen_return ());
kono
parents:
diff changeset
1029 DONE;
kono
parents:
diff changeset
1030 })
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032 (define_expand "nonlocal_goto"
kono
parents:
diff changeset
1033 [(match_operand 0 "" "")
kono
parents:
diff changeset
1034 (match_operand 1 "" "")
kono
parents:
diff changeset
1035 (match_operand 2 "" "")
kono
parents:
diff changeset
1036 (match_operand 3 "" "")]
kono
parents:
diff changeset
1037 ""
kono
parents:
diff changeset
1038 {
kono
parents:
diff changeset
1039 sorry ("target cannot support nonlocal goto.");
kono
parents:
diff changeset
1040 emit_insn (gen_nop ());
kono
parents:
diff changeset
1041 DONE;
kono
parents:
diff changeset
1042 })
kono
parents:
diff changeset
1043
kono
parents:
diff changeset
1044 (define_expand "nonlocal_goto_receiver"
kono
parents:
diff changeset
1045 [(const_int 0)]
kono
parents:
diff changeset
1046 ""
kono
parents:
diff changeset
1047 {
kono
parents:
diff changeset
1048 sorry ("target cannot support nonlocal goto.");
kono
parents:
diff changeset
1049 })
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 (define_expand "allocate_stack"
kono
parents:
diff changeset
1052 [(match_operand 0 "nvptx_register_operand")
kono
parents:
diff changeset
1053 (match_operand 1 "nvptx_register_operand")]
kono
parents:
diff changeset
1054 ""
kono
parents:
diff changeset
1055 {
kono
parents:
diff changeset
1056 if (TARGET_SOFT_STACK)
kono
parents:
diff changeset
1057 {
kono
parents:
diff changeset
1058 emit_move_insn (stack_pointer_rtx,
kono
parents:
diff changeset
1059 gen_rtx_MINUS (Pmode, stack_pointer_rtx, operands[1]));
kono
parents:
diff changeset
1060 emit_insn (gen_set_softstack_insn (stack_pointer_rtx));
kono
parents:
diff changeset
1061 emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
kono
parents:
diff changeset
1062 DONE;
kono
parents:
diff changeset
1063 }
kono
parents:
diff changeset
1064 /* The ptx documentation specifies an alloca intrinsic (for 32 bit
kono
parents:
diff changeset
1065 only) but notes it is not implemented. The assembler emits a
kono
parents:
diff changeset
1066 confused error message. Issue a blunt one now instead. */
kono
parents:
diff changeset
1067 sorry ("target cannot support alloca.");
kono
parents:
diff changeset
1068 emit_insn (gen_nop ());
kono
parents:
diff changeset
1069 DONE;
kono
parents:
diff changeset
1070 })
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 (define_insn "set_softstack_insn"
kono
parents:
diff changeset
1073 [(unspec [(match_operand 0 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1074 UNSPEC_SET_SOFTSTACK)]
kono
parents:
diff changeset
1075 "TARGET_SOFT_STACK"
kono
parents:
diff changeset
1076 {
kono
parents:
diff changeset
1077 return nvptx_output_set_softstack (REGNO (operands[0]));
kono
parents:
diff changeset
1078 })
kono
parents:
diff changeset
1079
kono
parents:
diff changeset
1080 (define_expand "restore_stack_block"
kono
parents:
diff changeset
1081 [(match_operand 0 "register_operand" "")
kono
parents:
diff changeset
1082 (match_operand 1 "register_operand" "")]
kono
parents:
diff changeset
1083 ""
kono
parents:
diff changeset
1084 {
kono
parents:
diff changeset
1085 if (TARGET_SOFT_STACK)
kono
parents:
diff changeset
1086 {
kono
parents:
diff changeset
1087 emit_move_insn (operands[0], operands[1]);
kono
parents:
diff changeset
1088 emit_insn (gen_set_softstack_insn (operands[0]));
kono
parents:
diff changeset
1089 }
kono
parents:
diff changeset
1090 DONE;
kono
parents:
diff changeset
1091 })
kono
parents:
diff changeset
1092
kono
parents:
diff changeset
1093 (define_expand "restore_stack_function"
kono
parents:
diff changeset
1094 [(match_operand 0 "register_operand" "")
kono
parents:
diff changeset
1095 (match_operand 1 "register_operand" "")]
kono
parents:
diff changeset
1096 ""
kono
parents:
diff changeset
1097 {
kono
parents:
diff changeset
1098 DONE;
kono
parents:
diff changeset
1099 })
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 (define_insn "trap"
kono
parents:
diff changeset
1102 [(trap_if (const_int 1) (const_int 0))]
kono
parents:
diff changeset
1103 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 "trap; exit;")
111
kono
parents:
diff changeset
1105
kono
parents:
diff changeset
1106 (define_insn "trap_if_true"
kono
parents:
diff changeset
1107 [(trap_if (ne (match_operand:BI 0 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1108 (const_int 0))
kono
parents:
diff changeset
1109 (const_int 0))]
kono
parents:
diff changeset
1110 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111 "%j0 trap; %j0 exit;"
111
kono
parents:
diff changeset
1112 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 (define_insn "trap_if_false"
kono
parents:
diff changeset
1115 [(trap_if (eq (match_operand:BI 0 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1116 (const_int 0))
kono
parents:
diff changeset
1117 (const_int 0))]
kono
parents:
diff changeset
1118 ""
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1119 "%J0 trap; %J0 exit;"
111
kono
parents:
diff changeset
1120 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1121
kono
parents:
diff changeset
1122 (define_expand "ctrap<mode>4"
kono
parents:
diff changeset
1123 [(trap_if (match_operator 0 "nvptx_comparison_operator"
kono
parents:
diff changeset
1124 [(match_operand:SDIM 1 "nvptx_register_operand")
kono
parents:
diff changeset
1125 (match_operand:SDIM 2 "nvptx_nonmemory_operand")])
kono
parents:
diff changeset
1126 (match_operand 3 "const0_operand"))]
kono
parents:
diff changeset
1127 ""
kono
parents:
diff changeset
1128 {
kono
parents:
diff changeset
1129 rtx t = nvptx_expand_compare (operands[0]);
kono
parents:
diff changeset
1130 emit_insn (gen_trap_if_true (t));
kono
parents:
diff changeset
1131 DONE;
kono
parents:
diff changeset
1132 })
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 (define_insn "oacc_dim_size"
kono
parents:
diff changeset
1135 [(set (match_operand:SI 0 "nvptx_register_operand" "")
kono
parents:
diff changeset
1136 (unspec:SI [(match_operand:SI 1 "const_int_operand" "")]
kono
parents:
diff changeset
1137 UNSPEC_DIM_SIZE))]
kono
parents:
diff changeset
1138 ""
kono
parents:
diff changeset
1139 {
kono
parents:
diff changeset
1140 static const char *const asms[] =
kono
parents:
diff changeset
1141 { /* Must match oacc_loop_levels ordering. */
kono
parents:
diff changeset
1142 "%.\\tmov.u32\\t%0, %%nctaid.x;", /* gang */
kono
parents:
diff changeset
1143 "%.\\tmov.u32\\t%0, %%ntid.y;", /* worker */
kono
parents:
diff changeset
1144 "%.\\tmov.u32\\t%0, %%ntid.x;", /* vector */
kono
parents:
diff changeset
1145 };
kono
parents:
diff changeset
1146 return asms[INTVAL (operands[1])];
kono
parents:
diff changeset
1147 })
kono
parents:
diff changeset
1148
kono
parents:
diff changeset
1149 (define_insn "oacc_dim_pos"
kono
parents:
diff changeset
1150 [(set (match_operand:SI 0 "nvptx_register_operand" "")
kono
parents:
diff changeset
1151 (unspec_volatile:SI [(match_operand:SI 1 "const_int_operand" "")]
kono
parents:
diff changeset
1152 UNSPECV_DIM_POS))]
kono
parents:
diff changeset
1153 ""
kono
parents:
diff changeset
1154 {
kono
parents:
diff changeset
1155 static const char *const asms[] =
kono
parents:
diff changeset
1156 { /* Must match oacc_loop_levels ordering. */
kono
parents:
diff changeset
1157 "%.\\tmov.u32\\t%0, %%ctaid.x;", /* gang */
kono
parents:
diff changeset
1158 "%.\\tmov.u32\\t%0, %%tid.y;", /* worker */
kono
parents:
diff changeset
1159 "%.\\tmov.u32\\t%0, %%tid.x;", /* vector */
kono
parents:
diff changeset
1160 };
kono
parents:
diff changeset
1161 return asms[INTVAL (operands[1])];
kono
parents:
diff changeset
1162 })
kono
parents:
diff changeset
1163
kono
parents:
diff changeset
1164 (define_insn "nvptx_fork"
kono
parents:
diff changeset
1165 [(unspec_volatile:SI [(match_operand:SI 0 "const_int_operand" "")]
kono
parents:
diff changeset
1166 UNSPECV_FORK)]
kono
parents:
diff changeset
1167 ""
kono
parents:
diff changeset
1168 "// fork %0;"
kono
parents:
diff changeset
1169 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1170
kono
parents:
diff changeset
1171 (define_insn "nvptx_forked"
kono
parents:
diff changeset
1172 [(unspec_volatile:SI [(match_operand:SI 0 "const_int_operand" "")]
kono
parents:
diff changeset
1173 UNSPECV_FORKED)]
kono
parents:
diff changeset
1174 ""
kono
parents:
diff changeset
1175 "// forked %0;"
kono
parents:
diff changeset
1176 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 (define_insn "nvptx_joining"
kono
parents:
diff changeset
1179 [(unspec_volatile:SI [(match_operand:SI 0 "const_int_operand" "")]
kono
parents:
diff changeset
1180 UNSPECV_JOINING)]
kono
parents:
diff changeset
1181 ""
kono
parents:
diff changeset
1182 "// joining %0;"
kono
parents:
diff changeset
1183 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1184
kono
parents:
diff changeset
1185 (define_insn "nvptx_join"
kono
parents:
diff changeset
1186 [(unspec_volatile:SI [(match_operand:SI 0 "const_int_operand" "")]
kono
parents:
diff changeset
1187 UNSPECV_JOIN)]
kono
parents:
diff changeset
1188 ""
kono
parents:
diff changeset
1189 "// join %0;"
kono
parents:
diff changeset
1190 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1191
kono
parents:
diff changeset
1192 (define_expand "oacc_fork"
kono
parents:
diff changeset
1193 [(set (match_operand:SI 0 "nvptx_nonmemory_operand" "")
kono
parents:
diff changeset
1194 (match_operand:SI 1 "general_operand" ""))
kono
parents:
diff changeset
1195 (unspec_volatile:SI [(match_operand:SI 2 "const_int_operand" "")]
kono
parents:
diff changeset
1196 UNSPECV_FORKED)]
kono
parents:
diff changeset
1197 ""
kono
parents:
diff changeset
1198 {
kono
parents:
diff changeset
1199 if (operands[0] != const0_rtx)
kono
parents:
diff changeset
1200 emit_move_insn (operands[0], operands[1]);
kono
parents:
diff changeset
1201 nvptx_expand_oacc_fork (INTVAL (operands[2]));
kono
parents:
diff changeset
1202 DONE;
kono
parents:
diff changeset
1203 })
kono
parents:
diff changeset
1204
kono
parents:
diff changeset
1205 (define_expand "oacc_join"
kono
parents:
diff changeset
1206 [(set (match_operand:SI 0 "nvptx_nonmemory_operand" "")
kono
parents:
diff changeset
1207 (match_operand:SI 1 "general_operand" ""))
kono
parents:
diff changeset
1208 (unspec_volatile:SI [(match_operand:SI 2 "const_int_operand" "")]
kono
parents:
diff changeset
1209 UNSPECV_JOIN)]
kono
parents:
diff changeset
1210 ""
kono
parents:
diff changeset
1211 {
kono
parents:
diff changeset
1212 if (operands[0] != const0_rtx)
kono
parents:
diff changeset
1213 emit_move_insn (operands[0], operands[1]);
kono
parents:
diff changeset
1214 nvptx_expand_oacc_join (INTVAL (operands[2]));
kono
parents:
diff changeset
1215 DONE;
kono
parents:
diff changeset
1216 })
kono
parents:
diff changeset
1217
kono
parents:
diff changeset
1218 ;; only 32-bit shuffles exist.
kono
parents:
diff changeset
1219 (define_insn "nvptx_shuffle<mode>"
kono
parents:
diff changeset
1220 [(set (match_operand:BITS 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1221 (unspec:BITS
kono
parents:
diff changeset
1222 [(match_operand:BITS 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1223 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
1224 (match_operand:SI 3 "const_int_operand" "n")]
kono
parents:
diff changeset
1225 UNSPEC_SHUFFLE))]
kono
parents:
diff changeset
1226 ""
kono
parents:
diff changeset
1227 "%.\\tshfl%S3.b32\\t%0, %1, %2, 31;")
kono
parents:
diff changeset
1228
kono
parents:
diff changeset
1229 (define_insn "nvptx_vote_ballot"
kono
parents:
diff changeset
1230 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1231 (unspec:SI [(match_operand:BI 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1232 UNSPEC_VOTE_BALLOT))]
kono
parents:
diff changeset
1233 ""
kono
parents:
diff changeset
1234 "%.\\tvote.ballot.b32\\t%0, %1;")
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 ;; Patterns for OpenMP SIMD-via-SIMT lowering
kono
parents:
diff changeset
1237
kono
parents:
diff changeset
1238 (define_insn "omp_simt_enter_insn"
kono
parents:
diff changeset
1239 [(set (match_operand 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1240 (unspec_volatile [(match_operand 1 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
1241 (match_operand 2 "nvptx_nonmemory_operand" "Ri")]
kono
parents:
diff changeset
1242 UNSPECV_SIMT_ENTER))]
kono
parents:
diff changeset
1243 ""
kono
parents:
diff changeset
1244 {
kono
parents:
diff changeset
1245 return nvptx_output_simt_enter (operands[0], operands[1], operands[2]);
kono
parents:
diff changeset
1246 })
kono
parents:
diff changeset
1247
kono
parents:
diff changeset
1248 (define_expand "omp_simt_enter"
kono
parents:
diff changeset
1249 [(match_operand 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1250 (match_operand 1 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
1251 (match_operand 2 "const_int_operand" "n")]
kono
parents:
diff changeset
1252 ""
kono
parents:
diff changeset
1253 {
kono
parents:
diff changeset
1254 if (!CONST_INT_P (operands[1]))
kono
parents:
diff changeset
1255 cfun->machine->simt_stack_size = HOST_WIDE_INT_M1U;
kono
parents:
diff changeset
1256 else
kono
parents:
diff changeset
1257 cfun->machine->simt_stack_size = MAX (UINTVAL (operands[1]),
kono
parents:
diff changeset
1258 cfun->machine->simt_stack_size);
kono
parents:
diff changeset
1259 cfun->machine->simt_stack_align = MAX (UINTVAL (operands[2]),
kono
parents:
diff changeset
1260 cfun->machine->simt_stack_align);
kono
parents:
diff changeset
1261 cfun->machine->has_simtreg = true;
kono
parents:
diff changeset
1262 emit_insn (gen_omp_simt_enter_insn (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1263 DONE;
kono
parents:
diff changeset
1264 })
kono
parents:
diff changeset
1265
kono
parents:
diff changeset
1266 (define_insn "omp_simt_exit"
kono
parents:
diff changeset
1267 [(unspec_volatile [(match_operand 0 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1268 UNSPECV_SIMT_EXIT)]
kono
parents:
diff changeset
1269 ""
kono
parents:
diff changeset
1270 {
kono
parents:
diff changeset
1271 return nvptx_output_simt_exit (operands[0]);
kono
parents:
diff changeset
1272 })
kono
parents:
diff changeset
1273
kono
parents:
diff changeset
1274 ;; Implement IFN_GOMP_SIMT_LANE: set operand 0 to lane index
kono
parents:
diff changeset
1275 (define_insn "omp_simt_lane"
kono
parents:
diff changeset
1276 [(set (match_operand:SI 0 "nvptx_register_operand" "")
kono
parents:
diff changeset
1277 (unspec:SI [(const_int 0)] UNSPEC_LANEID))]
kono
parents:
diff changeset
1278 ""
kono
parents:
diff changeset
1279 "%.\\tmov.u32\\t%0, %%laneid;")
kono
parents:
diff changeset
1280
kono
parents:
diff changeset
1281 ;; Implement IFN_GOMP_SIMT_ORDERED: copy operand 1 to operand 0 and
kono
parents:
diff changeset
1282 ;; place a compiler barrier to disallow unrolling/peeling the containing loop
kono
parents:
diff changeset
1283 (define_expand "omp_simt_ordered"
kono
parents:
diff changeset
1284 [(match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1285 (match_operand:SI 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1286 ""
kono
parents:
diff changeset
1287 {
kono
parents:
diff changeset
1288 emit_move_insn (operands[0], operands[1]);
kono
parents:
diff changeset
1289 emit_insn (gen_nvptx_nounroll ());
kono
parents:
diff changeset
1290 DONE;
kono
parents:
diff changeset
1291 })
kono
parents:
diff changeset
1292
kono
parents:
diff changeset
1293 ;; Implement IFN_GOMP_SIMT_XCHG_BFLY: perform a "butterfly" exchange
kono
parents:
diff changeset
1294 ;; across lanes
kono
parents:
diff changeset
1295 (define_expand "omp_simt_xchg_bfly"
kono
parents:
diff changeset
1296 [(match_operand 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1297 (match_operand 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1298 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")]
kono
parents:
diff changeset
1299 ""
kono
parents:
diff changeset
1300 {
kono
parents:
diff changeset
1301 emit_insn (nvptx_gen_shuffle (operands[0], operands[1], operands[2],
kono
parents:
diff changeset
1302 SHUFFLE_BFLY));
kono
parents:
diff changeset
1303 DONE;
kono
parents:
diff changeset
1304 })
kono
parents:
diff changeset
1305
kono
parents:
diff changeset
1306 ;; Implement IFN_GOMP_SIMT_XCHG_IDX: broadcast value in operand 1
kono
parents:
diff changeset
1307 ;; from lane given by index in operand 2 to operand 0 in all lanes
kono
parents:
diff changeset
1308 (define_expand "omp_simt_xchg_idx"
kono
parents:
diff changeset
1309 [(match_operand 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1310 (match_operand 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1311 (match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")]
kono
parents:
diff changeset
1312 ""
kono
parents:
diff changeset
1313 {
kono
parents:
diff changeset
1314 emit_insn (nvptx_gen_shuffle (operands[0], operands[1], operands[2],
kono
parents:
diff changeset
1315 SHUFFLE_IDX));
kono
parents:
diff changeset
1316 DONE;
kono
parents:
diff changeset
1317 })
kono
parents:
diff changeset
1318
kono
parents:
diff changeset
1319 ;; Implement IFN_GOMP_SIMT_VOTE_ANY:
kono
parents:
diff changeset
1320 ;; set operand 0 to zero iff all lanes supply zero in operand 1
kono
parents:
diff changeset
1321 (define_expand "omp_simt_vote_any"
kono
parents:
diff changeset
1322 [(match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1323 (match_operand:SI 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1324 ""
kono
parents:
diff changeset
1325 {
kono
parents:
diff changeset
1326 rtx pred = gen_reg_rtx (BImode);
kono
parents:
diff changeset
1327 emit_move_insn (pred, gen_rtx_NE (BImode, operands[1], const0_rtx));
kono
parents:
diff changeset
1328 emit_insn (gen_nvptx_vote_ballot (operands[0], pred));
kono
parents:
diff changeset
1329 DONE;
kono
parents:
diff changeset
1330 })
kono
parents:
diff changeset
1331
kono
parents:
diff changeset
1332 ;; Implement IFN_GOMP_SIMT_LAST_LANE:
kono
parents:
diff changeset
1333 ;; set operand 0 to the lowest lane index that passed non-zero in operand 1
kono
parents:
diff changeset
1334 (define_expand "omp_simt_last_lane"
kono
parents:
diff changeset
1335 [(match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1336 (match_operand:SI 1 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1337 ""
kono
parents:
diff changeset
1338 {
kono
parents:
diff changeset
1339 rtx pred = gen_reg_rtx (BImode);
kono
parents:
diff changeset
1340 rtx tmp = gen_reg_rtx (SImode);
kono
parents:
diff changeset
1341 emit_move_insn (pred, gen_rtx_NE (BImode, operands[1], const0_rtx));
kono
parents:
diff changeset
1342 emit_insn (gen_nvptx_vote_ballot (tmp, pred));
kono
parents:
diff changeset
1343 emit_insn (gen_ctzsi2 (operands[0], tmp));
kono
parents:
diff changeset
1344 DONE;
kono
parents:
diff changeset
1345 })
kono
parents:
diff changeset
1346
kono
parents:
diff changeset
1347 ;; extract parts of a 64 bit object into 2 32-bit ints
kono
parents:
diff changeset
1348 (define_insn "unpack<mode>si2"
kono
parents:
diff changeset
1349 [(set (match_operand:SI 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1350 (unspec:SI [(match_operand:BITD 2 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1351 (const_int 0)] UNSPEC_BIT_CONV))
kono
parents:
diff changeset
1352 (set (match_operand:SI 1 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1353 (unspec:SI [(match_dup 2) (const_int 1)] UNSPEC_BIT_CONV))]
kono
parents:
diff changeset
1354 ""
kono
parents:
diff changeset
1355 "%.\\tmov.b64\\t{%0,%1}, %2;")
kono
parents:
diff changeset
1356
kono
parents:
diff changeset
1357 ;; pack 2 32-bit ints into a 64 bit object
kono
parents:
diff changeset
1358 (define_insn "packsi<mode>2"
kono
parents:
diff changeset
1359 [(set (match_operand:BITD 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1360 (unspec:BITD [(match_operand:SI 1 "nvptx_register_operand" "R")
kono
parents:
diff changeset
1361 (match_operand:SI 2 "nvptx_register_operand" "R")]
kono
parents:
diff changeset
1362 UNSPEC_BIT_CONV))]
kono
parents:
diff changeset
1363 ""
kono
parents:
diff changeset
1364 "%.\\tmov.b64\\t%0, {%1,%2};")
kono
parents:
diff changeset
1365
kono
parents:
diff changeset
1366 ;; Atomic insns.
kono
parents:
diff changeset
1367
kono
parents:
diff changeset
1368 (define_expand "atomic_compare_and_swap<mode>"
kono
parents:
diff changeset
1369 [(match_operand:SI 0 "nvptx_register_operand") ;; bool success output
kono
parents:
diff changeset
1370 (match_operand:SDIM 1 "nvptx_register_operand") ;; oldval output
kono
parents:
diff changeset
1371 (match_operand:SDIM 2 "memory_operand") ;; memory
kono
parents:
diff changeset
1372 (match_operand:SDIM 3 "nvptx_register_operand") ;; expected input
kono
parents:
diff changeset
1373 (match_operand:SDIM 4 "nvptx_register_operand") ;; newval input
kono
parents:
diff changeset
1374 (match_operand:SI 5 "const_int_operand") ;; is_weak
kono
parents:
diff changeset
1375 (match_operand:SI 6 "const_int_operand") ;; success model
kono
parents:
diff changeset
1376 (match_operand:SI 7 "const_int_operand")] ;; failure model
kono
parents:
diff changeset
1377 ""
kono
parents:
diff changeset
1378 {
kono
parents:
diff changeset
1379 emit_insn (gen_atomic_compare_and_swap<mode>_1
kono
parents:
diff changeset
1380 (operands[1], operands[2], operands[3], operands[4], operands[6]));
kono
parents:
diff changeset
1381
kono
parents:
diff changeset
1382 rtx cond = gen_reg_rtx (BImode);
kono
parents:
diff changeset
1383 emit_move_insn (cond, gen_rtx_EQ (BImode, operands[1], operands[3]));
kono
parents:
diff changeset
1384 emit_insn (gen_sel_truesi (operands[0], cond, GEN_INT (1), GEN_INT (0)));
kono
parents:
diff changeset
1385 DONE;
kono
parents:
diff changeset
1386 })
kono
parents:
diff changeset
1387
kono
parents:
diff changeset
1388 (define_insn "atomic_compare_and_swap<mode>_1"
kono
parents:
diff changeset
1389 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1390 (unspec_volatile:SDIM
kono
parents:
diff changeset
1391 [(match_operand:SDIM 1 "memory_operand" "+m")
kono
parents:
diff changeset
1392 (match_operand:SDIM 2 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
1393 (match_operand:SDIM 3 "nvptx_nonmemory_operand" "Ri")
kono
parents:
diff changeset
1394 (match_operand:SI 4 "const_int_operand")]
kono
parents:
diff changeset
1395 UNSPECV_CAS))
kono
parents:
diff changeset
1396 (set (match_dup 1)
kono
parents:
diff changeset
1397 (unspec_volatile:SDIM [(const_int 0)] UNSPECV_CAS))]
kono
parents:
diff changeset
1398 ""
kono
parents:
diff changeset
1399 "%.\\tatom%A1.cas.b%T0\\t%0, %1, %2, %3;"
kono
parents:
diff changeset
1400 [(set_attr "atomic" "true")])
kono
parents:
diff changeset
1401
kono
parents:
diff changeset
1402 (define_insn "atomic_exchange<mode>"
kono
parents:
diff changeset
1403 [(set (match_operand:SDIM 0 "nvptx_register_operand" "=R") ;; output
kono
parents:
diff changeset
1404 (unspec_volatile:SDIM
kono
parents:
diff changeset
1405 [(match_operand:SDIM 1 "memory_operand" "+m") ;; memory
kono
parents:
diff changeset
1406 (match_operand:SI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
1407 UNSPECV_XCHG))
kono
parents:
diff changeset
1408 (set (match_dup 1)
kono
parents:
diff changeset
1409 (match_operand:SDIM 2 "nvptx_nonmemory_operand" "Ri"))] ;; input
kono
parents:
diff changeset
1410 ""
kono
parents:
diff changeset
1411 "%.\\tatom%A1.exch.b%T0\\t%0, %1, %2;"
kono
parents:
diff changeset
1412 [(set_attr "atomic" "true")])
kono
parents:
diff changeset
1413
kono
parents:
diff changeset
1414 (define_insn "atomic_fetch_add<mode>"
kono
parents:
diff changeset
1415 [(set (match_operand:SDIM 1 "memory_operand" "+m")
kono
parents:
diff changeset
1416 (unspec_volatile:SDIM
kono
parents:
diff changeset
1417 [(plus:SDIM (match_dup 1)
kono
parents:
diff changeset
1418 (match_operand:SDIM 2 "nvptx_nonmemory_operand" "Ri"))
kono
parents:
diff changeset
1419 (match_operand:SI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
1420 UNSPECV_LOCK))
kono
parents:
diff changeset
1421 (set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1422 (match_dup 1))]
kono
parents:
diff changeset
1423 ""
kono
parents:
diff changeset
1424 "%.\\tatom%A1.add%t0\\t%0, %1, %2;"
kono
parents:
diff changeset
1425 [(set_attr "atomic" "true")])
kono
parents:
diff changeset
1426
kono
parents:
diff changeset
1427 (define_insn "atomic_fetch_addsf"
kono
parents:
diff changeset
1428 [(set (match_operand:SF 1 "memory_operand" "+m")
kono
parents:
diff changeset
1429 (unspec_volatile:SF
kono
parents:
diff changeset
1430 [(plus:SF (match_dup 1)
kono
parents:
diff changeset
1431 (match_operand:SF 2 "nvptx_nonmemory_operand" "RF"))
kono
parents:
diff changeset
1432 (match_operand:SI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
1433 UNSPECV_LOCK))
kono
parents:
diff changeset
1434 (set (match_operand:SF 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1435 (match_dup 1))]
kono
parents:
diff changeset
1436 ""
kono
parents:
diff changeset
1437 "%.\\tatom%A1.add%t0\\t%0, %1, %2;"
kono
parents:
diff changeset
1438 [(set_attr "atomic" "true")])
kono
parents:
diff changeset
1439
kono
parents:
diff changeset
1440 (define_code_iterator any_logic [and ior xor])
kono
parents:
diff changeset
1441 (define_code_attr logic [(and "and") (ior "or") (xor "xor")])
kono
parents:
diff changeset
1442
kono
parents:
diff changeset
1443 (define_insn "atomic_fetch_<logic><mode>"
kono
parents:
diff changeset
1444 [(set (match_operand:SDIM 1 "memory_operand" "+m")
kono
parents:
diff changeset
1445 (unspec_volatile:SDIM
kono
parents:
diff changeset
1446 [(any_logic:SDIM (match_dup 1)
kono
parents:
diff changeset
1447 (match_operand:SDIM 2 "nvptx_nonmemory_operand" "Ri"))
kono
parents:
diff changeset
1448 (match_operand:SI 3 "const_int_operand")] ;; model
kono
parents:
diff changeset
1449 UNSPECV_LOCK))
kono
parents:
diff changeset
1450 (set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
kono
parents:
diff changeset
1451 (match_dup 1))]
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1452 "<MODE>mode == SImode || TARGET_SM35"
111
kono
parents:
diff changeset
1453 "%.\\tatom%A1.b%T0.<logic>\\t%0, %1, %2;"
kono
parents:
diff changeset
1454 [(set_attr "atomic" "true")])
kono
parents:
diff changeset
1455
kono
parents:
diff changeset
1456 (define_insn "nvptx_barsync"
kono
parents:
diff changeset
1457 [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "")]
kono
parents:
diff changeset
1458 UNSPECV_BARSYNC)]
kono
parents:
diff changeset
1459 ""
kono
parents:
diff changeset
1460 "\\tbar.sync\\t%0;"
kono
parents:
diff changeset
1461 [(set_attr "predicable" "false")])
kono
parents:
diff changeset
1462
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1463 (define_expand "memory_barrier"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1464 [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1465 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1466 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1467 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1468 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1469 MEM_VOLATILE_P (operands[0]) = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1470 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1471
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1472 ;; Ptx defines the memory barriers membar.cta, membar.gl and membar.sys
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1473 ;; (corresponding to cuda functions threadfence_block, threadfence and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474 ;; threadfence_system). For the insn memory_barrier we use membar.sys. This
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1475 ;; may be overconservative, but before using membar.gl instead we'll need to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1476 ;; explain in detail why it's safe to use. For now, use membar.sys.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1477 (define_insn "*memory_barrier"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1478 [(set (match_operand:BLK 0 "" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1479 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1480 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1481 "\\tmembar.sys;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1482 [(set_attr "predicable" "false")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1483
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1484 (define_expand "nvptx_membar_cta"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1485 [(set (match_dup 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1486 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR_CTA))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1487 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1488 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1489 operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1490 MEM_VOLATILE_P (operands[0]) = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1491 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1492
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1493 (define_insn "*nvptx_membar_cta"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1494 [(set (match_operand:BLK 0 "" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1495 (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR_CTA))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1496 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1497 "\\tmembar.cta;"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1498 [(set_attr "predicable" "false")])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1499
111
kono
parents:
diff changeset
1500 (define_insn "nvptx_nounroll"
kono
parents:
diff changeset
1501 [(unspec_volatile [(const_int 0)] UNSPECV_NOUNROLL)]
kono
parents:
diff changeset
1502 ""
kono
parents:
diff changeset
1503 "\\t.pragma \\\"nounroll\\\";"
kono
parents:
diff changeset
1504 [(set_attr "predicable" "false")])