annotate gcc/config/gcn/gcn-valu.md @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 ;; Copyright (C) 2016-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 ;; This file is free software; you can redistribute it and/or modify it under
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 ;; the terms of the GNU General Public License as published by the Free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 ;; Software Foundation; either version 3 of the License, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 ;; any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 ;; This file is distributed in the hope that it will be useful, but WITHOUT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 ;; for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 ;; You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 ;; along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 ;; <http://www.gnu.org/licenses/>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 ;; {{{ Vector iterators
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 ; Vector modes for one vector register
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 (define_mode_iterator VEC_1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 [V64SI V64HF V64SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 (define_mode_iterator VEC_1REG_ALT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 [V64SI V64HF V64SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 (define_mode_iterator VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 [V64QI V64HI V64SI V64HF V64SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 (define_mode_iterator VEC_1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 [V64SI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 (define_mode_iterator VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 [V64QI V64HI V64SI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 (define_mode_iterator VEC_ALL1REG_INT_ALT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 [V64QI V64HI V64SI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 ; Vector modes for two vector registers
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 (define_mode_iterator VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 [V64DI V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 ; All of above
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 (define_mode_iterator VEC_REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 [V64SI V64HF V64SF ; Single reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 V64DI V64DF]) ; Double reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 (define_mode_iterator VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 [V64QI V64HI V64SI V64HF V64SF ; Single reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 V64DI V64DF]) ; Double reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 (define_mode_iterator VEC_ALLREG_ALT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 [V64QI V64HI V64SI V64HF V64SF ; Single reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 V64DI V64DF]) ; Double reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 (define_mode_iterator VEC_ALLREG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 [V64QI V64HI V64SI ; Single reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 V64DI]) ; Double reg
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 (define_mode_attr scalar_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 [(V64QI "qi") (V64HI "hi") (V64SI "si")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 (V64HF "hf") (V64SF "sf") (V64DI "di") (V64DF "df")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 (define_mode_attr SCALAR_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 [(V64QI "QI") (V64HI "HI") (V64SI "SI")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 (V64HF "HF") (V64SF "SF") (V64DI "DI") (V64DF "DF")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 (define_mode_attr sdwa [(V64QI "BYTE_0") (V64HI "WORD_0") (V64SI "DWORD")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 ;; {{{ Substitutions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 (define_subst_attr "exec" "vec_merge"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 "" "_exec")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 (define_subst_attr "exec_clobber" "vec_merge_with_clobber"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 "" "_exec")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 (define_subst_attr "exec_vcc" "vec_merge_with_vcc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 "" "_exec")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 (define_subst_attr "exec_scatter" "scatter_store"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 "" "_exec")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 (define_subst "vec_merge"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 [(set (match_operand:VEC_ALLREG_MODE 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 (match_operand:VEC_ALLREG_MODE 1))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 (match_operand:VEC_ALLREG_MODE 3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 "gcn_register_or_unspec_operand" "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 (match_operand:DI 4 "gcn_exec_reg_operand" "e")))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 (define_subst "vec_merge_with_clobber"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 [(set (match_operand:VEC_ALLREG_MODE 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 (match_operand:VEC_ALLREG_MODE 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 (clobber (match_operand 2))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 (match_operand:VEC_ALLREG_MODE 3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 "gcn_register_or_unspec_operand" "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 (match_operand:DI 4 "gcn_exec_reg_operand" "e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 (clobber (match_dup 2))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 (define_subst "vec_merge_with_vcc"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 [(set (match_operand:VEC_ALLREG_MODE 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 (match_operand:VEC_ALLREG_MODE 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 (set (match_operand:DI 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 (match_operand:DI 3))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 [(parallel
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 (match_operand:VEC_ALLREG_MODE 4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 "gcn_register_or_unspec_operand" "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 (match_operand:DI 5 "gcn_exec_reg_operand" "e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 (set (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 (and:DI (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 (reg:DI EXEC_REG)))])])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 (define_subst "scatter_store"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 [(match_operand 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 (match_operand 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 (match_operand 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 (match_operand 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 [(match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 (match_operand:DI 4 "gcn_exec_reg_operand" "e")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 UNSPEC_SCATTER))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 ;; {{{ Vector moves
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 ; This is the entry point for all vector register moves. Memory accesses can
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 ; come this way also, but will more usually use the reload_in/out,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 ; gather/scatter, maskload/store, etc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 (define_expand "mov<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 [(set (match_operand:VEC_ALLREG_MODE 0 "nonimmediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 (match_operand:VEC_ALLREG_MODE 1 "general_operand"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 if (MEM_P (operands[0]) && !lra_in_progress && !reload_completed)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 operands[1] = force_reg (<MODE>mode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 rtx scratch = gen_rtx_SCRATCH (V64DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 rtx a = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 rtx v = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 rtx expr = gcn_expand_scalar_to_vector_address (<MODE>mode, NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 scratch);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 emit_insn (gen_scatter<mode>_expr (expr, operands[1], a, v));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 else if (MEM_P (operands[1]) && !lra_in_progress && !reload_completed)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 rtx scratch = gen_rtx_SCRATCH (V64DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 rtx a = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 rtx v = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 rtx expr = gcn_expand_scalar_to_vector_address (<MODE>mode, NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 scratch);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 emit_insn (gen_gather<mode>_expr (operands[0], expr, a, v));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 else if ((MEM_P (operands[0]) || MEM_P (operands[1])))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 gcc_assert (!reload_completed);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 rtx scratch = gen_reg_rtx (V64DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 emit_insn (gen_mov<mode>_sgprbase (operands[0], operands[1], scratch));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 ; A pseudo instruction that helps LRA use the "U0" constraint.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 (define_insn "mov<mode>_unspec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 [(set (match_operand:VEC_ALLREG_MODE 0 "nonimmediate_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 (match_operand:VEC_ALLREG_MODE 1 "gcn_unspec_operand" " U"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 [(set_attr "type" "unknown")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 (set_attr "length" "0")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 (define_insn "*mov<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 [(set (match_operand:VEC_ALL1REG_MODE 0 "nonimmediate_operand" "=v,v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 (match_operand:VEC_ALL1REG_MODE 1 "general_operand" "vA,B"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 "v_mov_b32\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 [(set_attr "type" "vop1,vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 (set_attr "length" "4,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 (define_insn "mov<mode>_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 [(set (match_operand:VEC_ALL1REG_MODE 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 "=v, v, v, v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 (vec_merge:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 (match_operand:VEC_ALL1REG_MODE 1 "general_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 "vA, B, v,vA, m, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 (match_operand:VEC_ALL1REG_MODE 3 "gcn_alu_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 "U0,U0,vA,vA,U0,U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 (match_operand:DI 2 "register_operand" " e, e,cV,Sv, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 (clobber (match_scratch:V64DI 4 "=X, X, X, X,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 "!MEM_P (operands[0]) || REG_P (operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 v_cndmask_b32\t%0, %3, %1, vcc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 v_cndmask_b32\t%0, %3, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 [(set_attr "type" "vop1,vop1,vop2,vop3a,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 (set_attr "length" "4,8,4,8,16,16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 ; This variant does not accept an unspec, but does permit MEM
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 ; read/modify/write which is necessary for maskstore.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 ;(define_insn "*mov<mode>_exec_match"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 ; [(set (match_operand:VEC_ALL1REG_MODE 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 ; "=v,v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 ; (vec_merge:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 ; (match_operand:VEC_ALL1REG_MODE 1 "general_operand" "vA,B, m, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 ; (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 ; (match_operand:DI 2 "gcn_exec_reg_operand" " e,e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 ; (clobber (match_scratch:V64DI 3 "=X,X,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 ; "!MEM_P (operands[0]) || REG_P (operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 ; "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 ; v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 ; v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 ; #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 ; #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 ; [(set_attr "type" "vop1,vop1,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 ; (set_attr "length" "4,8,16,16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 (define_insn "*mov<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 [(set (match_operand:VEC_2REG_MODE 0 "nonimmediate_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 (match_operand:VEC_2REG_MODE 1 "general_operand" "vDB"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 if (!REG_P (operands[1]) || REGNO (operands[0]) <= REGNO (operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 return "v_mov_b32\t%L0, %L1\;v_mov_b32\t%H0, %H1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 return "v_mov_b32\t%H0, %H1\;v_mov_b32\t%L0, %L1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 (set_attr "length" "16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 (define_insn "mov<mode>_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 [(set (match_operand:VEC_2REG_MODE 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 "= v, v, v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 (vec_merge:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 (match_operand:VEC_2REG_MODE 1 "general_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 "vDB, v0, v0, m, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 (match_operand:VEC_2REG_MODE 3 "gcn_alu_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 " U0,vDA0,vDA0,U0,U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 (match_operand:DI 2 "register_operand" " e, cV, Sv, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 (clobber (match_scratch:V64DI 4 "= X, X, X,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 "!MEM_P (operands[0]) || REG_P (operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 if (!REG_P (operands[1]) || REGNO (operands[0]) <= REGNO (operands[1]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 return "v_mov_b32\t%L0, %L1\;v_mov_b32\t%H0, %H1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 return "v_cndmask_b32\t%L0, %L3, %L1, vcc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 "v_cndmask_b32\t%H0, %H3, %H1, vcc";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 return "v_cndmask_b32\t%L0, %L3, %L1, %2\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 "v_cndmask_b32\t%H0, %H3, %H1, %2";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 switch (which_alternative)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 case 0:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 return "v_mov_b32\t%H0, %H1\;v_mov_b32\t%L0, %L1";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 case 1:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 return "v_cndmask_b32\t%H0, %H3, %H1, vcc\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 "v_cndmask_b32\t%L0, %L3, %L1, vcc";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 case 2:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 return "v_cndmask_b32\t%H0, %H3, %H1, %2\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 "v_cndmask_b32\t%L0, %L3, %L1, %2";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 return "#";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 [(set_attr "type" "vmult,vmult,vmult,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 (set_attr "length" "16,16,16,16,16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 ; This variant does not accept an unspec, but does permit MEM
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 ; read/modify/write which is necessary for maskstore.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 ;(define_insn "*mov<mode>_exec_match"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 ; [(set (match_operand:VEC_2REG_MODE 0 "nonimmediate_operand" "=v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 ; (vec_merge:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 ; (match_operand:VEC_2REG_MODE 1 "general_operand" "vDB, m, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 ; (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 ; (match_operand:DI 2 "gcn_exec_reg_operand" " e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 ; (clobber (match_scratch:V64DI 3 "=X,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 ; "!MEM_P (operands[0]) || REG_P (operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 ; "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 ; * if (!REG_P (operands[1]) || REGNO (operands[0]) <= REGNO (operands[1])) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 ; return \"v_mov_b32\t%L0, %L1\;v_mov_b32\t%H0, %H1\"; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 ; else \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 ; return \"v_mov_b32\t%H0, %H1\;v_mov_b32\t%L0, %L1\";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 ; #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 ; #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 ; [(set_attr "type" "vmult,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 ; (set_attr "length" "16,16,16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 ; A SGPR-base load looks like:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 ; <load> v, Sv
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 ; There's no hardware instruction that corresponds to this, but vector base
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 ; addresses are placed in an SGPR because it is easier to add to a vector.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 ; We also have a temporary vT, and the vector v1 holding numbered lanes.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 ; Rewrite as:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 ; vT = v1 << log2(element-size)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 ; vT += Sv
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 ; flat_load v, vT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 (define_insn "mov<mode>_sgprbase"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 [(set (match_operand:VEC_ALL1REG_MODE 0 "nonimmediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 "= v, v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 (unspec:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 [(match_operand:VEC_ALL1REG_MODE 1 "general_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 " vA,vB, m, v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 UNSPEC_SGPRBASE))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 (clobber (match_operand:V64DI 2 "register_operand" "=&v,&v,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 "lra_in_progress || reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 v_mov_b32\t%0, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 [(set_attr "type" "vop1,vop1,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 (set_attr "length" "4,8,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 (define_insn "mov<mode>_sgprbase"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 [(set (match_operand:VEC_2REG_MODE 0 "nonimmediate_operand" "= v, v, m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 (unspec:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 [(match_operand:VEC_2REG_MODE 1 "general_operand" "vDB, m, v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 UNSPEC_SGPRBASE))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 (clobber (match_operand:V64DI 2 "register_operand" "=&v,&v,&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 "lra_in_progress || reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 * if (!REG_P (operands[1]) || REGNO (operands[0]) <= REGNO (operands[1])) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 return \"v_mov_b32\t%L0, %L1\;v_mov_b32\t%H0, %H1\"; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 else \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 return \"v_mov_b32\t%H0, %H1\;v_mov_b32\t%L0, %L1\";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 #"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 [(set_attr "type" "vmult,*,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 (set_attr "length" "8,12,12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 ; reload_in was once a standard name, but here it's only referenced by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 ; gcn_secondary_reload. It allows a reload with a scratch register.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 (define_expand "reload_in<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 (match_operand:VEC_ALLREG_MODE 1 "memory_operand" " m"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 (clobber (match_operand:V64DI 2 "register_operand" "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 emit_insn (gen_mov<mode>_sgprbase (operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 ; reload_out is similar to reload_in, above.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 (define_expand "reload_out<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 [(set (match_operand:VEC_ALLREG_MODE 0 "memory_operand" "= m")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 (match_operand:VEC_ALLREG_MODE 1 "register_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 (clobber (match_operand:V64DI 2 "register_operand" "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 emit_insn (gen_mov<mode>_sgprbase (operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 ; Expand scalar addresses into gather/scatter patterns
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 (define_split
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 [(set (match_operand:VEC_ALLREG_MODE 0 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 [(match_operand:VEC_ALLREG_MODE 1 "general_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 UNSPEC_SGPRBASE))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 (clobber (match_scratch:V64DI 2))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 (unspec:BLK [(match_dup 5) (match_dup 1) (match_dup 6) (match_dup 7)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 operands[5] = gcn_expand_scalar_to_vector_address (<MODE>mode, NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 operands[6] = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 operands[7] = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 (define_split
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 [(set (match_operand:VEC_ALLREG_MODE 0 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 (match_operand:VEC_ALLREG_MODE 1 "general_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 (match_operand:VEC_ALLREG_MODE 2 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 (match_operand:DI 3 "gcn_exec_reg_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 (clobber (match_scratch:V64DI 4))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 (unspec:BLK [(match_dup 5) (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 (match_dup 6) (match_dup 7) (match_dup 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 operands[5] = gcn_expand_scalar_to_vector_address (<MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 operands[4]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 operands[6] = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 operands[7] = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 (define_split
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 [(set (match_operand:VEC_ALLREG_MODE 0 "nonimmediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 [(match_operand:VEC_ALLREG_MODE 1 "memory_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 UNSPEC_SGPRBASE))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 (clobber (match_scratch:V64DI 2))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 (unspec:VEC_ALLREG_MODE [(match_dup 5) (match_dup 6) (match_dup 7)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 UNSPEC_GATHER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 operands[5] = gcn_expand_scalar_to_vector_address (<MODE>mode, NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 operands[6] = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 operands[7] = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 (define_split
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 [(set (match_operand:VEC_ALLREG_MODE 0 "nonimmediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 (match_operand:VEC_ALLREG_MODE 1 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 (match_operand:VEC_ALLREG_MODE 2 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 (match_operand:DI 3 "gcn_exec_reg_operand")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 (clobber (match_scratch:V64DI 4))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 (unspec:VEC_ALLREG_MODE [(match_dup 5) (match_dup 6) (match_dup 7)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 UNSPEC_GATHER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 (match_dup 3)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 operands[5] = gcn_expand_scalar_to_vector_address (<MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 operands[4]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 operands[6] = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 operands[7] = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 ; TODO: Add zero/sign extending variants.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 ;; {{{ Lane moves
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 ; v_writelane and v_readlane work regardless of exec flags.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 ; We allow source to be scratch.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 ;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 ; FIXME these should take A immediates
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 (define_insn "*vec_set<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 [(set (match_operand:VEC_ALL1REG_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 (vec_merge:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 (vec_duplicate:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 (match_operand:<SCALAR_MODE> 1 "register_operand" " Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 (match_operand:VEC_ALL1REG_MODE 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 (ashift (const_int 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 (match_operand:SI 2 "gcn_alu_operand" "SvB"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 "v_writelane_b32 %0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 (set_attr "length" "8")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 ; FIXME: 64bit operations really should be splitters, but I am not sure how
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 ; to represent vertical subregs.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 (define_insn "*vec_set<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 [(set (match_operand:VEC_2REG_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 (vec_merge:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 (vec_duplicate:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 (match_operand:<SCALAR_MODE> 1 "register_operand" " Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 (match_operand:VEC_2REG_MODE 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 (ashift (const_int 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 (match_operand:SI 2 "gcn_alu_operand" "SvB"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 "v_writelane_b32 %L0, %L1, %2\;v_writelane_b32 %H0, %H1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 (set_attr "length" "16")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 (define_expand "vec_set<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 (vec_duplicate:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 (match_operand:<SCALAR_MODE> 1 "register_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 (ashift (const_int 1) (match_operand:SI 2 "gcn_alu_operand"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 (define_insn "*vec_set<mode>_1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 [(set (match_operand:VEC_ALL1REG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 (vec_merge:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 (vec_duplicate:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 (match_operand:<SCALAR_MODE> 1 "register_operand" "Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 (match_operand:VEC_ALL1REG_MODE 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 (match_operand:SI 2 "const_int_operand" " i")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 "((unsigned) exact_log2 (INTVAL (operands[2])) < 64)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 operands[2] = GEN_INT (exact_log2 (INTVAL (operands[2])));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 return "v_writelane_b32 %0, %1, %2";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 (set_attr "length" "8")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 (define_insn "*vec_set<mode>_1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 [(set (match_operand:VEC_2REG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 (vec_merge:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 (vec_duplicate:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 (match_operand:<SCALAR_MODE> 1 "register_operand" "Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 (match_operand:VEC_2REG_MODE 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 (match_operand:SI 2 "const_int_operand" " i")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 "((unsigned) exact_log2 (INTVAL (operands[2])) < 64)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 operands[2] = GEN_INT (exact_log2 (INTVAL (operands[2])));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 return "v_writelane_b32 %L0, %L1, %2\;v_writelane_b32 %H0, %H1, %2";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 (set_attr "length" "16")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 (define_insn "vec_duplicate<mode><exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 [(set (match_operand:VEC_ALL1REG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 (vec_duplicate:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 (match_operand:<SCALAR_MODE> 1 "gcn_alu_operand" "SvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 "v_mov_b32\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 (define_insn "vec_duplicate<mode><exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 [(set (match_operand:VEC_2REG_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 (vec_duplicate:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 (match_operand:<SCALAR_MODE> 1 "gcn_alu_operand" "SvDB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 "v_mov_b32\t%L0, %L1\;v_mov_b32\t%H0, %H1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 (set_attr "length" "16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 (define_insn "vec_extract<mode><scalar_mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 [(set (match_operand:<SCALAR_MODE> 0 "register_operand" "=Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 (vec_select:<SCALAR_MODE>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 (match_operand:VEC_ALL1REG_MODE 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 (parallel [(match_operand:SI 2 "gcn_alu_operand" "SvB")])))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 "v_readlane_b32 %0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 (set_attr "length" "8")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 (define_insn "vec_extract<mode><scalar_mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 [(set (match_operand:<SCALAR_MODE> 0 "register_operand" "=&Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 (vec_select:<SCALAR_MODE>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 (match_operand:VEC_2REG_MODE 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 (parallel [(match_operand:SI 2 "gcn_alu_operand" " SvB")])))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 "v_readlane_b32 %L0, %L1, %2\;v_readlane_b32 %H0, %H1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 (set_attr "length" "16")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 (set_attr "exec" "none")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 (set_attr "laneselect" "yes")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 (define_expand "extract_last_<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 [(match_operand:<SCALAR_MODE> 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 (match_operand:DI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 (match_operand:VEC_ALLREG_MODE 2 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 "can_create_pseudo_p ()"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 rtx dst = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 rtx mask = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 rtx vect = operands[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 rtx tmpreg = gen_reg_rtx (SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 emit_insn (gen_clzdi2 (tmpreg, mask));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 emit_insn (gen_subsi3 (tmpreg, GEN_INT (63), tmpreg));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 emit_insn (gen_vec_extract<mode><scalar_mode> (dst, vect, tmpreg));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 (define_expand "fold_extract_last_<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 [(match_operand:<SCALAR_MODE> 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 (match_operand:<SCALAR_MODE> 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 (match_operand:DI 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 (match_operand:VEC_ALLREG_MODE 3 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 "can_create_pseudo_p ()"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 rtx dst = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 rtx default_value = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 rtx mask = operands[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 rtx vect = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 rtx else_label = gen_label_rtx ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 rtx end_label = gen_label_rtx ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 rtx cond = gen_rtx_EQ (VOIDmode, mask, const0_rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 emit_jump_insn (gen_cbranchdi4 (cond, mask, const0_rtx, else_label));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 emit_insn (gen_extract_last_<mode> (dst, mask, vect));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 emit_jump_insn (gen_jump (end_label));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 emit_barrier ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 emit_label (else_label);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 emit_move_insn (dst, default_value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 emit_label (end_label);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 (define_expand "vec_init<mode><scalar_mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 (match_operand 1)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 gcn_expand_vector_init (operands[0], operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 ;; {{{ Scatter / Gather
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 ;; GCN does not have an instruction for loading a vector from contiguous
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 ;; memory so *all* loads and stores are eventually converted to scatter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 ;; or gather.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 ;; GCC does not permit MEM to hold vectors of addresses, so we must use an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 ;; unspec. The unspec formats are as follows:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 ;; (unspec:V64??
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 ;; [(<address expression>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 ;; (<addr_space_t>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 ;; (<use_glc>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663 ;; (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 ;; UNSPEC_GATHER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 ;; (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 ;; [(<address expression>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 ;; (<source register>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 ;; (<addr_space_t>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 ;; (<use_glc>)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 ;; (<exec>)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 ;; UNSPEC_SCATTER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 ;; - Loads are expected to be wrapped in a vec_merge, so do not need <exec>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 ;; - The mem:BLK does not contain any real information, but indicates that an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 ;; unknown memory read is taking place. Stores are expected to use a similar
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 ;; mem:BLK outside the unspec.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 ;; - The address space and glc (volatile) fields are there to replace the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 ;; fields normally found in a MEM.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 ;; - Multiple forms of address expression are supported, below.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 (define_expand "gather_load<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 (match_operand:DI 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 (match_operand 2 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 (match_operand 3 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 (match_operand:SI 4 "gcn_alu_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 rtx addr = gcn_expand_scaled_offsets (DEFAULT_ADDR_SPACE, operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 operands[2], operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 INTVAL (operands[3]), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 if (GET_MODE (addr) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 emit_insn (gen_gather<mode>_insn_1offset (operands[0], addr, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 const0_rtx, const0_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 emit_insn (gen_gather<mode>_insn_2offsets (operands[0], operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 addr, const0_rtx, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 const0_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 ; Allow any address expression
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 (define_expand "gather<mode>_expr<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 [(match_operand 1 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 (match_operand 2 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 (match_operand 3 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 UNSPEC_GATHER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 (define_insn "gather<mode>_insn_1offset<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 [(plus:V64DI (match_operand:V64DI 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 (match_operand 2 "immediate_operand" " n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 (match_operand 3 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 (match_operand 4 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 UNSPEC_GATHER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 "(AS_FLAT_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 && ((TARGET_GCN3 && INTVAL(operands[2]) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 || ((unsigned HOST_WIDE_INT)INTVAL(operands[2]) < 0x1000)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 || (AS_GLOBAL_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 && (((unsigned HOST_WIDE_INT)INTVAL(operands[2]) + 0x1000) < 0x2000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 addr_space_t as = INTVAL (operands[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 const char *glc = INTVAL (operands[4]) ? " glc" : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 if (AS_FLAT_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 if (TARGET_GCN5_PLUS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 sprintf (buf, "flat_load%%o0\t%%0, %%1 offset:%%2%s\;s_waitcnt\t0",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 sprintf (buf, "flat_load%%o0\t%%0, %%1%s\;s_waitcnt\t0", glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 else if (AS_GLOBAL_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 sprintf (buf, "global_load%%o0\t%%0, %%1, off offset:%%2%s\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 "s_waitcnt\tvmcnt(0)", glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 [(set_attr "type" "flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 (define_insn "gather<mode>_insn_1offset_ds<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 [(plus:V64SI (match_operand:V64SI 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 (match_operand 2 "immediate_operand" " n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 (match_operand 3 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 (match_operand 4 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 UNSPEC_GATHER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765 "(AS_ANY_DS_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 && ((unsigned HOST_WIDE_INT)INTVAL(operands[2]) < 0x10000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 addr_space_t as = INTVAL (operands[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 sprintf (buf, "ds_read%%b0\t%%0, %%1 offset:%%2%s\;s_waitcnt\tlgkmcnt(0)",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 (AS_GDS_P (as) ? " gds" : ""));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 (define_insn "gather<mode>_insn_2offsets<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 (unspec:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780 [(plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 (match_operand:DI 1 "register_operand" "Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 (sign_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 (match_operand:V64SI 2 "register_operand" " v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 (vec_duplicate:V64DI (match_operand 3 "immediate_operand" " n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 (match_operand 4 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 (match_operand 5 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 (mem:BLK (scratch))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 UNSPEC_GATHER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 "(AS_GLOBAL_P (INTVAL (operands[4]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 && (((unsigned HOST_WIDE_INT)INTVAL(operands[3]) + 0x1000) < 0x2000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 addr_space_t as = INTVAL (operands[4]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 const char *glc = INTVAL (operands[5]) ? " glc" : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 if (AS_GLOBAL_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 /* Work around assembler bug in which a 64-bit register is expected,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 but a 32-bit value would be correct. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 int reg = REGNO (operands[2]) - FIRST_VGPR_REG;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 sprintf (buf, "global_load%%o0\t%%0, v[%d:%d], %%1 offset:%%3%s\;"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 "s_waitcnt\tvmcnt(0)", reg, reg + 1, glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811 [(set_attr "type" "flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 (define_expand "scatter_store<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 (match_operand 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 (match_operand 2 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 (match_operand:SI 3 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 (match_operand:VEC_ALLREG_MODE 4 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822 rtx addr = gcn_expand_scaled_offsets (DEFAULT_ADDR_SPACE, operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823 operands[1], operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 INTVAL (operands[2]), NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 if (GET_MODE (addr) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 emit_insn (gen_scatter<mode>_insn_1offset (addr, const0_rtx, operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 const0_rtx, const0_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 emit_insn (gen_scatter<mode>_insn_2offsets (operands[0], addr,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 const0_rtx, operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832 const0_rtx, const0_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 (define_expand "scatter<mode>_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 (match_operand 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 (match_operand 2 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 (match_operand:SI 3 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 (match_operand:VEC_ALLREG_MODE 4 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 (match_operand:DI 5 "gcn_exec_reg_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 operands[5] = force_reg (DImode, operands[5]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847 rtx addr = gcn_expand_scaled_offsets (DEFAULT_ADDR_SPACE, operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 operands[1], operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 INTVAL (operands[2]), operands[5]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851 if (GET_MODE (addr) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 emit_insn (gen_scatter<mode>_insn_1offset_exec (addr, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 operands[4], const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 operands[5]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 emit_insn (gen_scatter<mode>_insn_2offsets_exec (operands[0], addr,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858 const0_rtx, operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 const0_rtx, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 operands[5]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 ; Allow any address expression
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 (define_expand "scatter<mode>_expr<exec_scatter>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868 [(match_operand:V64DI 0 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 (match_operand:VEC_ALLREG_MODE 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 (match_operand 2 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871 (match_operand 3 "immediate_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874 {})
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876 (define_insn "scatter<mode>_insn_1offset<exec_scatter>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 [(plus:V64DI (match_operand:V64DI 0 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
880 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
881 (match_operand 1 "immediate_operand" "n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
882 (match_operand:VEC_ALLREG_MODE 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
883 (match_operand 3 "immediate_operand" "n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
884 (match_operand 4 "immediate_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
885 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
886 "(AS_FLAT_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
887 && (INTVAL(operands[1]) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
888 || (TARGET_GCN5_PLUS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
889 && (unsigned HOST_WIDE_INT)INTVAL(operands[1]) < 0x1000)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
890 || (AS_GLOBAL_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
891 && (((unsigned HOST_WIDE_INT)INTVAL(operands[1]) + 0x1000) < 0x2000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
892 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
893 addr_space_t as = INTVAL (operands[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
894 const char *glc = INTVAL (operands[4]) ? " glc" : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
895
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
896 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
897 if (AS_FLAT_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
898 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
899 if (TARGET_GCN5_PLUS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
900 sprintf (buf, "flat_store%%s2\t%%0, %%2 offset:%%1%s", glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
901 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
902 sprintf (buf, "flat_store%%s2\t%%0, %%2%s", glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
903 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
904 else if (AS_GLOBAL_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
905 sprintf (buf, "global_store%%s2\t%%0, %%2, off offset:%%1%s", glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
906 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
907 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
908
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
909 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
910 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
911 [(set_attr "type" "flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
912 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
913
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
914 (define_insn "scatter<mode>_insn_1offset_ds<exec_scatter>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
915 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
916 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
917 [(plus:V64SI (match_operand:V64SI 0 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
918 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
919 (match_operand 1 "immediate_operand" "n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
920 (match_operand:VEC_ALLREG_MODE 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
921 (match_operand 3 "immediate_operand" "n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
922 (match_operand 4 "immediate_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
923 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
924 "(AS_ANY_DS_P (INTVAL (operands[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
925 && ((unsigned HOST_WIDE_INT)INTVAL(operands[1]) < 0x10000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
926 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
927 addr_space_t as = INTVAL (operands[3]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
928 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
929 sprintf (buf, "ds_write%%b2\t%%0, %%2 offset:%%1%s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
930 (AS_GDS_P (as) ? " gds" : ""));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
931 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
932 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
933 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
934 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
935
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
936 (define_insn "scatter<mode>_insn_2offsets<exec_scatter>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
937 [(set (mem:BLK (scratch))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
938 (unspec:BLK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
939 [(plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
940 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
941 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
942 (match_operand:DI 0 "register_operand" "Sv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
943 (sign_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
944 (match_operand:V64SI 1 "register_operand" " v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
945 (vec_duplicate:V64DI (match_operand 2 "immediate_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
946 " n")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
947 (match_operand:VEC_ALLREG_MODE 3 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
948 (match_operand 4 "immediate_operand" " n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
949 (match_operand 5 "immediate_operand" " n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
950 UNSPEC_SCATTER))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
951 "(AS_GLOBAL_P (INTVAL (operands[4]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
952 && (((unsigned HOST_WIDE_INT)INTVAL(operands[2]) + 0x1000) < 0x2000))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
953 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
954 addr_space_t as = INTVAL (operands[4]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
955 const char *glc = INTVAL (operands[5]) ? " glc" : "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
956
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
957 static char buf[200];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
958 if (AS_GLOBAL_P (as))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
959 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
960 /* Work around assembler bug in which a 64-bit register is expected,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
961 but a 32-bit value would be correct. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
962 int reg = REGNO (operands[1]) - FIRST_VGPR_REG;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
963 sprintf (buf, "global_store%%s3\tv[%d:%d], %%3, %%0 offset:%%2%s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
964 reg, reg + 1, glc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
965 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
966 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
967 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
968
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
969 return buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
970 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
971 [(set_attr "type" "flat")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
972 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
973
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
974 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
975 ;; {{{ Permutations
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
976
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
977 (define_insn "ds_bpermute<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
978 [(set (match_operand:VEC_ALL1REG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
979 (unspec:VEC_ALL1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
980 [(match_operand:VEC_ALL1REG_MODE 2 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
981 (match_operand:V64SI 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
982 (match_operand:DI 3 "gcn_exec_reg_operand" " e")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
983 UNSPEC_BPERMUTE))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
984 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
985 "ds_bpermute_b32\t%0, %1, %2\;s_waitcnt\tlgkmcnt(0)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
986 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
987 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
988
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
989 (define_insn_and_split "ds_bpermute<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
990 [(set (match_operand:VEC_2REG_MODE 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
991 (unspec:VEC_2REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
992 [(match_operand:VEC_2REG_MODE 2 "register_operand" " v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
993 (match_operand:V64SI 1 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
994 (match_operand:DI 3 "gcn_exec_reg_operand" " e")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
995 UNSPEC_BPERMUTE))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
996 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
997 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
998 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
999 [(set (match_dup 4) (unspec:V64SI [(match_dup 6) (match_dup 1) (match_dup 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1000 UNSPEC_BPERMUTE))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1001 (set (match_dup 5) (unspec:V64SI [(match_dup 7) (match_dup 1) (match_dup 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1002 UNSPEC_BPERMUTE))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1003 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1004 operands[4] = gcn_operand_part (<MODE>mode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1005 operands[5] = gcn_operand_part (<MODE>mode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1006 operands[6] = gcn_operand_part (<MODE>mode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1007 operands[7] = gcn_operand_part (<MODE>mode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1008 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1009 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1010 (set_attr "length" "24")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1011
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1012 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1013 ;; {{{ ALU special case: add/sub
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1014
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1015 (define_insn "add<mode>3<exec_clobber>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1016 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1017 (plus:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1018 (match_operand:VEC_ALL1REG_INT_MODE 1 "register_operand" "% v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1019 (match_operand:VEC_ALL1REG_INT_MODE 2 "gcn_alu_operand" "vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1020 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1021 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1022 "v_add%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1023 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1024 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1025
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1026 (define_insn "add<mode>3_dup<exec_clobber>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1027 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1028 (plus:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1029 (vec_duplicate:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1030 (match_operand:<SCALAR_MODE> 2 "gcn_alu_operand" "SvB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1031 (match_operand:VEC_ALL1REG_INT_MODE 1 "register_operand" " v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1032 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1033 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1034 "v_add%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1035 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1036 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1037
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1038 (define_insn "addv64si3_vcc<exec_vcc>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1039 [(set (match_operand:V64SI 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1040 (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1041 (match_operand:V64SI 1 "register_operand" "% v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1042 (match_operand:V64SI 2 "gcn_alu_operand" "vSvB,vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1043 (set (match_operand:DI 3 "register_operand" "= cV, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1044 (ltu:DI (plus:V64SI (match_dup 1) (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1045 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1046 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1047 "v_add%^_u32\t%0, %3, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1048 [(set_attr "type" "vop2,vop3b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1049 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1050
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1051 ; This pattern only changes the VCC bits when the corresponding lane is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1052 ; enabled, so the set must be described as an ior.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1053
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1054 (define_insn "addv64si3_vcc_dup<exec_vcc>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1055 [(set (match_operand:V64SI 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1056 (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1057 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1058 (match_operand:SI 1 "gcn_alu_operand" "SvB,SvB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1059 (match_operand:V64SI 2 "register_operand" " v, v")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1060 (set (match_operand:DI 3 "register_operand" "=cV, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1061 (ltu:DI (plus:V64SI (vec_duplicate:V64SI (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1062 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1063 (vec_duplicate:V64SI (match_dup 2))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1064 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1065 "v_add%^_u32\t%0, %3, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1066 [(set_attr "type" "vop2,vop3b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1067 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1068
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1069 ; v_addc does not accept an SGPR because the VCC read already counts as an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1070 ; SGPR use and the number of SGPR operands is limited to 1. It does not
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1071 ; accept "B" immediate constants due to a related bus conflict.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1072
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1073 (define_insn "addcv64si3<exec_vcc>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1074 [(set (match_operand:V64SI 0 "register_operand" "=v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1075 (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1076 (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1077 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1078 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1079 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1080 (match_operand:DI 3 "register_operand" " cV,cVSv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1081 (match_operand:V64SI 1 "gcn_alu_operand" "% v, vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1082 (match_operand:V64SI 2 "gcn_alu_operand" " vA, vA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1083 (set (match_operand:DI 4 "register_operand" "=cV,cVSg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1084 (ior:DI (ltu:DI (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1085 (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1086 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1087 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1088 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1089 (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1090 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1091 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1092 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1093 (ltu:DI (plus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1094 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1095 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1096 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1097 (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1098 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1099 (match_dup 1))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1100 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1101 "v_addc%^_u32\t%0, %4, %2, %1, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1102 [(set_attr "type" "vop2,vop3b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1103 (set_attr "length" "4,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1105 (define_insn "sub<mode>3<exec_clobber>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1106 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1107 (minus:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1108 (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" "vSvB, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1109 (match_operand:VEC_ALL1REG_INT_MODE 2 "gcn_alu_operand" " v,vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1110 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1111 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1112 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1113 v_sub%^_u32\t%0, vcc, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1114 v_subrev%^_u32\t%0, vcc, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1115 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1116 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1118 (define_insn "subv64si3_vcc<exec_vcc>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1119 [(set (match_operand:V64SI 0 "register_operand" "= v, v, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1120 (minus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1121 (match_operand:V64SI 1 "gcn_alu_operand" "vSvB,vSvB, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1122 (match_operand:V64SI 2 "gcn_alu_operand" " v, v,vSvB,vSvB")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1123 (set (match_operand:DI 3 "register_operand" "= cV, Sg, cV, Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1124 (gtu:DI (minus:V64SI (match_dup 1) (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1125 (match_dup 1)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1126 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1127 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1128 v_sub%^_u32\t%0, %3, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1129 v_sub%^_u32\t%0, %3, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1130 v_subrev%^_u32\t%0, %3, %2, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1131 v_subrev%^_u32\t%0, %3, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1132 [(set_attr "type" "vop2,vop3b,vop2,vop3b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1133 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1134
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1135 ; v_subb does not accept an SGPR because the VCC read already counts as an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1136 ; SGPR use and the number of SGPR operands is limited to 1. It does not
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1137 ; accept "B" immediate constants due to a related bus conflict.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1139 (define_insn "subcv64si3<exec_vcc>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1140 [(set (match_operand:V64SI 0 "register_operand" "= v, v, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1141 (minus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1142 (minus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1143 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1144 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1145 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1146 (match_operand:DI 3 "gcn_alu_operand" " cV,cVSv,cV,cVSv"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1147 (match_operand:V64SI 1 "gcn_alu_operand" " vA, vA, v, vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1148 (match_operand:V64SI 2 "gcn_alu_operand" " v, vA,vA, vA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1149 (set (match_operand:DI 4 "register_operand" "=cV,cVSg,cV,cVSg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1150 (ior:DI (gtu:DI (minus:V64SI (minus:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1151 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1152 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1153 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1154 (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1155 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1156 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1157 (match_dup 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1158 (ltu:DI (minus:V64SI (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1159 (vec_duplicate:V64SI (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1160 (vec_duplicate:V64SI (const_int 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1161 (match_dup 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1162 (match_dup 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1163 (match_dup 1))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1164 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1165 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1166 v_subb%^_u32\t%0, %4, %1, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1167 v_subb%^_u32\t%0, %4, %1, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1168 v_subbrev%^_u32\t%0, %4, %2, %1, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1169 v_subbrev%^_u32\t%0, %4, %2, %1, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1170 [(set_attr "type" "vop2,vop3b,vop2,vop3b")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1171 (set_attr "length" "4,8,4,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1173 (define_insn_and_split "addv64di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1174 [(set (match_operand:V64DI 0 "register_operand" "= &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1175 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1176 (match_operand:V64DI 1 "register_operand" "%vDb,vDb0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1177 (match_operand:V64DI 2 "gcn_alu_operand" "vDb0, vDb")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1178 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1179 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1180 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1181 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1182 && gcn_can_split_p (V64DImode, operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1183 && gcn_can_split_p (V64DImode, operands[2])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1184 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1185 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1186 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1187 emit_insn (gen_addv64si3_vcc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1188 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1189 gcn_operand_part (V64DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1190 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1191 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1192 emit_insn (gen_addcv64si3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1193 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1194 gcn_operand_part (V64DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1195 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1196 vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1197 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1198 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1199 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1200 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1201
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1202 (define_insn_and_split "addv64di3_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1203 [(set (match_operand:V64DI 0 "register_operand" "= &v, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1204 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1205 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1206 (match_operand:V64DI 1 "register_operand" "%vDb,vDb0,vDb")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1207 (match_operand:V64DI 2 "gcn_alu_operand" "vDb0, vDb,vDb"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1208 (match_operand:V64DI 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1209 " U, U, 0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1210 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1211 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1212 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1213 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1214 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1215 && gcn_can_split_p (V64DImode, operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1216 && gcn_can_split_p (V64DImode, operands[2])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1217 && gcn_can_split_p (V64DImode, operands[4])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1218 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1219 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1220 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1221 emit_insn (gen_addv64si3_vcc_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1222 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1223 gcn_operand_part (V64DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1224 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1225 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1226 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1227 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1228 emit_insn (gen_addcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1229 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1230 gcn_operand_part (V64DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1231 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1232 vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1233 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1234 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1235 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1236 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1237 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1238 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1240 (define_insn_and_split "subv64di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1241 [(set (match_operand:V64DI 0 "register_operand" "=&v, &v, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1242 (minus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1243 (match_operand:V64DI 1 "gcn_alu_operand" "vDb,vDb0, v, v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1244 (match_operand:V64DI 2 "gcn_alu_operand" " v0, v,vDb0,vDb")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1245 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1246 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1247 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1248 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1249 && gcn_can_split_p (V64DImode, operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1250 && gcn_can_split_p (V64DImode, operands[2])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1251 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1252 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1253 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1254 emit_insn (gen_subv64si3_vcc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1255 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1256 gcn_operand_part (V64DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1257 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1258 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1259 emit_insn (gen_subcv64si3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1260 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1261 gcn_operand_part (V64DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1262 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1263 vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1264 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1265 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1266 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1267 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1268
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1269 (define_insn_and_split "subv64di3_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1270 [(set (match_operand:V64DI 0 "register_operand" "= &v, &v, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1271 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1272 (minus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1273 (match_operand:V64DI 1 "gcn_alu_operand" "vSvB,vSvB0, v, v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1274 (match_operand:V64DI 2 "gcn_alu_operand" " v0, v,vSvB0,vSvB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1275 (match_operand:V64DI 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1276 " U0, U0, U0, U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1277 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1278 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1279 "register_operand (operands[1], VOIDmode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1280 || register_operand (operands[2], VOIDmode)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1281 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1282 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1283 && gcn_can_split_p (V64DImode, operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1284 && gcn_can_split_p (V64DImode, operands[2])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1285 && gcn_can_split_p (V64DImode, operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1286 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1287 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1288 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1289 emit_insn (gen_subv64si3_vcc_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1290 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1291 gcn_operand_part (V64DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1292 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1293 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1294 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1295 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1296 emit_insn (gen_subcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1297 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1298 gcn_operand_part (V64DImode, operands[1], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1299 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1300 vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1301 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1302 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1303 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1304 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1305 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1306 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1308 (define_insn_and_split "addv64di3_zext"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1309 [(set (match_operand:V64DI 0 "register_operand" "=&v, &v, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1310 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1311 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1312 (match_operand:V64SI 1 "gcn_alu_operand" "0vA,0vB, vA, vB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1313 (match_operand:V64DI 2 "gcn_alu_operand" "vDb,vDA,0vDb,0vDA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1314 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1315 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1316 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1317 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1318 && gcn_can_split_p (V64DImode, operands[2])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1319 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1320 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1321 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1322 emit_insn (gen_addv64si3_vcc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1323 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1324 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1325 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1326 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1327 emit_insn (gen_addcv64si3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1328 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1329 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1330 const0_rtx, vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1331 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1332 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1333 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1334 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1335
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1336 (define_insn_and_split "addv64di3_zext_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1337 [(set (match_operand:V64DI 0 "register_operand" "=&v, &v, &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1338 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1339 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1340 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1341 (match_operand:V64SI 1 "gcn_alu_operand" "0vA, vA,0vB, vB"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1342 (match_operand:V64DI 2 "gcn_alu_operand" "vDb,0vDb,vDA,0vDA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1343 (match_operand:V64DI 3 "gcn_register_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1344 " U0, U0, U0, U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1345 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1346 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1347 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1348 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1349 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1350 && gcn_can_split_p (V64DImode, operands[2])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1351 && gcn_can_split_p (V64DImode, operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1352 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1353 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1354 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1355 emit_insn (gen_addv64si3_vcc_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1356 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1357 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1358 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1359 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1360 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1361 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1362 emit_insn (gen_addcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1363 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1364 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1365 const0_rtx, vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1366 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1367 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1368 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1369 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1370 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1371 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1372
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1373 (define_insn_and_split "addv64di3_zext_dup"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1374 [(set (match_operand:V64DI 0 "register_operand" "= &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1375 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1376 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1377 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1378 (match_operand:SI 1 "gcn_alu_operand" " BSv, ASv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1379 (match_operand:V64DI 2 "gcn_alu_operand" "vDA0,vDb0")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1380 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1381 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1382 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1383 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1384 && gcn_can_split_p (V64DImode, operands[2])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1385 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1386 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1387 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1388 emit_insn (gen_addv64si3_vcc_dup
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1389 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1390 gcn_operand_part (DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1391 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1392 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1393 emit_insn (gen_addcv64si3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1394 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1395 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1396 const0_rtx, vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1397 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1398 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1399 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1400 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1401
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1402 (define_insn_and_split "addv64di3_zext_dup_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1403 [(set (match_operand:V64DI 0 "register_operand" "= &v, &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1404 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1405 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1406 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1407 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1408 (match_operand:SI 1 "gcn_alu_operand" " ASv, BSv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1409 (match_operand:V64DI 2 "gcn_alu_operand" "vDb0,vDA0"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1410 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0, U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1411 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1412 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1413 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1414 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1415 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1416 && gcn_can_split_p (V64DImode, operands[2])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1417 && gcn_can_split_p (V64DImode, operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1418 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1419 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1420 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1421 emit_insn (gen_addv64si3_vcc_dup_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1422 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1423 gcn_operand_part (DImode, operands[1], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1424 gcn_operand_part (V64DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1425 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1426 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1427 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1428 emit_insn (gen_addcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1429 (gcn_operand_part (V64DImode, operands[0], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1430 gcn_operand_part (V64DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1431 const0_rtx, vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1432 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1433 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1434 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1435 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1436 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1437 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1438
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1439 (define_insn_and_split "addv64di3_zext_dup2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1440 [(set (match_operand:V64DI 0 "register_operand" "= &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1441 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1442 (zero_extend:V64DI (match_operand:V64SI 1 "gcn_alu_operand" " vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1443 (vec_duplicate:V64DI (match_operand:DI 2 "gcn_alu_operand" "DbSv"))))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1444 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1445 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1446 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1447 "gcn_can_split_p (V64DImode, operands[0])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1448 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1449 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1450 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1451 emit_insn (gen_addv64si3_vcc_dup
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1452 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1453 gcn_operand_part (DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1454 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1455 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1456 rtx dsthi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1457 emit_insn (gen_vec_duplicatev64si
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1458 (dsthi, gcn_operand_part (DImode, operands[2], 1)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1459 emit_insn (gen_addcv64si3 (dsthi, dsthi, const0_rtx, vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1460 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1461 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1462 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1463 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1465 (define_insn_and_split "addv64di3_zext_dup2_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1466 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1467 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1468 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1469 (zero_extend:V64DI (match_operand:V64SI 1 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1470 " vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1471 (vec_duplicate:V64DI (match_operand:DI 2 "gcn_alu_operand" "BSv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1472 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1473 (match_operand:DI 4 "gcn_exec_reg_operand" " e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1474 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1475 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1476 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1477 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1478 && gcn_can_split_p (V64DImode, operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1479 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1480 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1481 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1482 emit_insn (gen_addv64si3_vcc_dup_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1483 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1484 gcn_operand_part (DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1485 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1486 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1487 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1488 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1489 rtx dsthi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1490 emit_insn (gen_vec_duplicatev64si_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1491 (dsthi, gcn_operand_part (DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1492 gcn_gen_undef (V64SImode), operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1493 emit_insn (gen_addcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1494 (dsthi, dsthi, const0_rtx, vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1495 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1496 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1497 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1498 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1499 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1500 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1501
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1502 (define_insn_and_split "addv64di3_sext_dup2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1503 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1504 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1505 (sign_extend:V64DI (match_operand:V64SI 1 "gcn_alu_operand" " vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1506 (vec_duplicate:V64DI (match_operand:DI 2 "gcn_alu_operand" "BSv"))))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1507 (clobber (match_scratch:V64SI 3 "=&v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1508 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1509 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1510 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1511 "gcn_can_split_p (V64DImode, operands[0])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1512 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1513 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1514 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1515 emit_insn (gen_ashrv64si3 (operands[3], operands[1], GEN_INT (31)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1516 emit_insn (gen_addv64si3_vcc_dup
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1517 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1518 gcn_operand_part (DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1519 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1520 vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1521 rtx dsthi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1522 emit_insn (gen_vec_duplicatev64si
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1523 (dsthi, gcn_operand_part (DImode, operands[2], 1)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1524 emit_insn (gen_addcv64si3 (dsthi, dsthi, operands[3], vcc, vcc));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1525 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1526 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1527 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1528 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1529
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1530 (define_insn_and_split "addv64di3_sext_dup2_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1531 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1532 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1533 (plus:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1534 (sign_extend:V64DI (match_operand:V64SI 1 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1535 " vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1536 (vec_duplicate:V64DI (match_operand:DI 2 "gcn_alu_operand" "BSv")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1537 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1538 (match_operand:DI 4 "gcn_exec_reg_operand" " e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1539 (clobber (match_scratch:V64SI 5 "=&v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1540 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1541 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1542 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1543 "gcn_can_split_p (V64DImode, operands[0])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1544 && gcn_can_split_p (V64DImode, operands[3])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1545 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1546 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1547 rtx vcc = gen_rtx_REG (DImode, VCC_REG);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1548 emit_insn (gen_ashrv64si3_exec (operands[5], operands[1], GEN_INT (31),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1549 gcn_gen_undef (V64SImode), operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1550 emit_insn (gen_addv64si3_vcc_dup_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1551 (gcn_operand_part (V64DImode, operands[0], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1552 gcn_operand_part (DImode, operands[2], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1553 operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1554 vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1555 gcn_operand_part (V64DImode, operands[3], 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1556 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1557 rtx dsthi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1558 emit_insn (gen_vec_duplicatev64si_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1559 (dsthi, gcn_operand_part (DImode, operands[2], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1560 gcn_gen_undef (V64SImode), operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1561 emit_insn (gen_addcv64si3_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1562 (dsthi, dsthi, operands[5], vcc, vcc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1563 gcn_operand_part (V64DImode, operands[3], 1),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1564 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1565 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1566 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1567 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1568 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1569
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1570 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1571 ;; {{{ DS memory ALU: add/sub
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1572
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1573 (define_mode_iterator DS_ARITH_MODE [V64SI V64SF V64DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1574 (define_mode_iterator DS_ARITH_SCALAR_MODE [SI SF DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1575
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1576 ;; FIXME: the vector patterns probably need RD expanded to a vector of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1577 ;; addresses. For now, the only way a vector can get into LDS is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1578 ;; if the user puts it there manually.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1579 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1580 ;; FIXME: the scalar patterns are probably fine in themselves, but need to be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1581 ;; checked to see if anything can ever use them.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1582
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1583 (define_insn "add<mode>3_ds<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1584 [(set (match_operand:DS_ARITH_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1585 (plus:DS_ARITH_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1586 (match_operand:DS_ARITH_MODE 1 "gcn_ds_memory_operand" "%RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1587 (match_operand:DS_ARITH_MODE 2 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1588 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1589 "ds_add%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1590 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1591 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1592
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1593 (define_insn "add<mode>3_ds_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1594 [(set (match_operand:DS_ARITH_SCALAR_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1595 (plus:DS_ARITH_SCALAR_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1596 (match_operand:DS_ARITH_SCALAR_MODE 1 "gcn_ds_memory_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1597 "%RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1598 (match_operand:DS_ARITH_SCALAR_MODE 2 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1599 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1600 "ds_add%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1601 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1602 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1603
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1604 (define_insn "sub<mode>3_ds<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1605 [(set (match_operand:DS_ARITH_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1606 (minus:DS_ARITH_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1607 (match_operand:DS_ARITH_MODE 1 "gcn_ds_memory_operand" " RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1608 (match_operand:DS_ARITH_MODE 2 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1609 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1610 "ds_sub%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1611 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1612 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1613
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1614 (define_insn "sub<mode>3_ds_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1615 [(set (match_operand:DS_ARITH_SCALAR_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1616 (minus:DS_ARITH_SCALAR_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1617 (match_operand:DS_ARITH_SCALAR_MODE 1 "gcn_ds_memory_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1618 " RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1619 (match_operand:DS_ARITH_SCALAR_MODE 2 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1620 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1621 "ds_sub%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1622 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1623 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1624
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1625 (define_insn "subr<mode>3_ds<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1626 [(set (match_operand:DS_ARITH_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1627 (minus:DS_ARITH_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1628 (match_operand:DS_ARITH_MODE 2 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1629 (match_operand:DS_ARITH_MODE 1 "gcn_ds_memory_operand" " RD")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1630 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1631 "ds_rsub%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1632 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1633 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1634
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1635 (define_insn "subr<mode>3_ds_scalar"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1636 [(set (match_operand:DS_ARITH_SCALAR_MODE 0 "gcn_ds_memory_operand" "=RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1637 (minus:DS_ARITH_SCALAR_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1638 (match_operand:DS_ARITH_SCALAR_MODE 2 "register_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1639 (match_operand:DS_ARITH_SCALAR_MODE 1 "gcn_ds_memory_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1640 " RD")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1641 "rtx_equal_p (operands[0], operands[1])"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1642 "ds_rsub%u0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1643 [(set_attr "type" "ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1644 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1645
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1646 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1647 ;; {{{ ALU special case: mult
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1648
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1649 (define_insn "<su>mulv64si3_highpart<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1650 [(set (match_operand:V64SI 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1651 (truncate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1652 (lshiftrt:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1653 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1654 (any_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1655 (match_operand:V64SI 1 "gcn_alu_operand" " %v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1656 (any_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1657 (match_operand:V64SI 2 "gcn_alu_operand" "vSvA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1658 (const_int 32))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1659 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1660 "v_mul_hi<sgnsuffix>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1661 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1662 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1663
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1664 (define_insn "mul<mode>3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1665 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1666 (mult:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1667 (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" "%vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1668 (match_operand:VEC_ALL1REG_INT_MODE 2 "gcn_alu_operand" " vSvA")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1669 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1670 "v_mul_lo_u32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1671 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1672 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1673
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1674 (define_insn "mul<mode>3_dup<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1675 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1676 (mult:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1677 (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" "%vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1678 (vec_duplicate:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1679 (match_operand:<SCALAR_MODE> 2 "gcn_alu_operand" " SvA"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1680 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1681 "v_mul_lo_u32\t%0, %1, %2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1682 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1683 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1684
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1685 (define_insn_and_split "mulv64di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1686 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1687 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1688 (match_operand:V64DI 1 "gcn_alu_operand" "% v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1689 (match_operand:V64DI 2 "gcn_alu_operand" "vDA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1690 (clobber (match_scratch:V64SI 3 "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1691 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1692 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1693 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1694 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1695 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1696 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1697 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1698 rtx left_lo = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1699 rtx left_hi = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1700 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1701 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1702 rtx tmp = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1703
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1704 emit_insn (gen_mulv64si3 (out_lo, left_lo, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1705 emit_insn (gen_umulv64si3_highpart (out_hi, left_lo, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1706 emit_insn (gen_mulv64si3 (tmp, left_hi, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1707 emit_insn (gen_addv64si3 (out_hi, out_hi, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1708 emit_insn (gen_mulv64si3 (tmp, left_lo, right_hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1709 emit_insn (gen_addv64si3 (out_hi, out_hi, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1710 emit_insn (gen_mulv64si3 (tmp, left_hi, right_hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1711 emit_insn (gen_addv64si3 (out_hi, out_hi, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1712 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1713 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1714
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1715 (define_insn_and_split "mulv64di3_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1716 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1717 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1718 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1719 (match_operand:V64DI 1 "gcn_alu_operand" "% v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1720 (match_operand:V64DI 2 "gcn_alu_operand" "vDA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1721 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1722 (match_operand:DI 4 "gcn_exec_reg_operand" " e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1723 (clobber (match_scratch:V64SI 5 "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1724 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1725 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1726 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1727 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1728 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1729 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1730 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1731 rtx left_lo = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1732 rtx left_hi = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1733 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1734 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1735 rtx exec = operands[4];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1736 rtx tmp = operands[5];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1737
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1738 rtx old_lo, old_hi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1739 if (GET_CODE (operands[3]) == UNSPEC)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1740 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1741 old_lo = old_hi = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1742 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1743 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1744 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1745 old_lo = gcn_operand_part (V64DImode, operands[3], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1746 old_hi = gcn_operand_part (V64DImode, operands[3], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1747 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1748
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1749 rtx undef = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1750
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1751 emit_insn (gen_mulv64si3_exec (out_lo, left_lo, right_lo, old_lo, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1752 emit_insn (gen_umulv64si3_highpart_exec (out_hi, left_lo, right_lo,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1753 old_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1754 emit_insn (gen_mulv64si3_exec (tmp, left_hi, right_lo, undef, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1755 emit_insn (gen_addv64si3_exec (out_hi, out_hi, tmp, out_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1756 emit_insn (gen_mulv64si3_exec (tmp, left_lo, right_hi, undef, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1757 emit_insn (gen_addv64si3_exec (out_hi, out_hi, tmp, out_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1758 emit_insn (gen_mulv64si3_exec (tmp, left_hi, right_hi, undef, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1759 emit_insn (gen_addv64si3_exec (out_hi, out_hi, tmp, out_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1760 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1761 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1762
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1763 (define_insn_and_split "mulv64di3_zext"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1764 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1765 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1766 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1767 (match_operand:V64SI 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1768 (match_operand:V64DI 2 "gcn_alu_operand" "vDA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1769 (clobber (match_scratch:V64SI 3 "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1770 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1771 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1772 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1773 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1774 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1775 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1776 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1777 rtx left = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1778 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1779 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1780 rtx tmp = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1781
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1782 emit_insn (gen_mulv64si3 (out_lo, left, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1783 emit_insn (gen_umulv64si3_highpart (out_hi, left, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1784 emit_insn (gen_mulv64si3 (tmp, left, right_hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1785 emit_insn (gen_addv64si3 (out_hi, out_hi, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1786 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1787 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1788
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1789 (define_insn_and_split "mulv64di3_zext_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1790 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1791 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1792 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1793 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1794 (match_operand:V64SI 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1795 (match_operand:V64DI 2 "gcn_alu_operand" "vDA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1796 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1797 (match_operand:DI 4 "gcn_exec_reg_operand" " e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1798 (clobber (match_scratch:V64SI 5 "=&v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1799 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1800 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1801 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1802 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1803 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1804 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1805 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1806 rtx left = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1807 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1808 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1809 rtx exec = operands[4];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1810 rtx tmp = operands[5];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1812 rtx old_lo, old_hi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1813 if (GET_CODE (operands[3]) == UNSPEC)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1814 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1815 old_lo = old_hi = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1816 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1817 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1818 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1819 old_lo = gcn_operand_part (V64DImode, operands[3], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1820 old_hi = gcn_operand_part (V64DImode, operands[3], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1821 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1822
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1823 rtx undef = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1824
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1825 emit_insn (gen_mulv64si3_exec (out_lo, left, right_lo, old_lo, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1826 emit_insn (gen_umulv64si3_highpart_exec (out_hi, left, right_lo,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1827 old_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1828 emit_insn (gen_mulv64si3_exec (tmp, left, right_hi, undef, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1829 emit_insn (gen_addv64si3_exec (out_hi, out_hi, tmp, out_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1830 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1831 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1832
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1833 (define_insn_and_split "mulv64di3_zext_dup2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1834 [(set (match_operand:V64DI 0 "register_operand" "= &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1835 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1836 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1837 (match_operand:V64SI 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1838 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1839 (match_operand:DI 2 "gcn_alu_operand" "SvDA"))))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1840 (clobber (match_scratch:V64SI 3 "= &v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1841 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1842 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1843 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1844 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1845 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1846 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1847 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1848 rtx left = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1849 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1850 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1851 rtx tmp = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1852
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1853 emit_insn (gen_mulv64si3 (out_lo, left, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1854 emit_insn (gen_umulv64si3_highpart (out_hi, left, right_lo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1855 emit_insn (gen_mulv64si3 (tmp, left, right_hi));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1856 emit_insn (gen_addv64si3 (out_hi, out_hi, tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1857 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1858 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1859
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1860 (define_insn_and_split "mulv64di3_zext_dup2_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1861 [(set (match_operand:V64DI 0 "register_operand" "= &v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1862 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1863 (mult:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1864 (zero_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1865 (match_operand:V64SI 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1866 (vec_duplicate:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1867 (match_operand:DI 2 "gcn_alu_operand" "SvDA")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1868 (match_operand:V64DI 3 "gcn_register_or_unspec_operand" " U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1869 (match_operand:DI 4 "gcn_exec_reg_operand" " e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1870 (clobber (match_scratch:V64SI 5 "= &v"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1871 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1872 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1873 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1874 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1875 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1876 rtx out_lo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1877 rtx out_hi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1878 rtx left = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1879 rtx right_lo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1880 rtx right_hi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1881 rtx exec = operands[4];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1882 rtx tmp = operands[5];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1883
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1884 rtx old_lo, old_hi;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1885 if (GET_CODE (operands[3]) == UNSPEC)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1886 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1887 old_lo = old_hi = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1888 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1889 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1890 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1891 old_lo = gcn_operand_part (V64DImode, operands[3], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1892 old_hi = gcn_operand_part (V64DImode, operands[3], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1893 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1894
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1895 rtx undef = gcn_gen_undef (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1896
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1897 emit_insn (gen_mulv64si3_exec (out_lo, left, right_lo, old_lo, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1898 emit_insn (gen_umulv64si3_highpart_exec (out_hi, left, right_lo,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1899 old_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1900 emit_insn (gen_mulv64si3_exec (tmp, left, right_hi, undef, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1901 emit_insn (gen_addv64si3_exec (out_hi, out_hi, tmp, out_hi, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1902 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1903 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1904
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1905 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1906 ;; {{{ ALU generic case
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1907
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1908 (define_mode_iterator VEC_INT_MODE [V64SI V64DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1909
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1910 (define_code_iterator bitop [and ior xor])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1911 (define_code_iterator shiftop [ashift lshiftrt ashiftrt])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1912 (define_code_iterator minmaxop [smin smax umin umax])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1913
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1914 (define_insn "<expander><mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1915 [(set (match_operand:VEC_1REG_INT_MODE 0 "gcn_valu_dst_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1916 (bitunop:VEC_1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1917 (match_operand:VEC_1REG_INT_MODE 1 "gcn_valu_src0_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1918 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1919 "v_<mnemonic>0\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1920 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1921 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1922
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1923 (define_insn "<expander><mode>3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1924 [(set (match_operand:VEC_1REG_INT_MODE 0 "gcn_valu_dst_operand" "= v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1925 (bitop:VEC_1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1926 (match_operand:VEC_1REG_INT_MODE 1 "gcn_valu_src0_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1927 "% v, 0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1928 (match_operand:VEC_1REG_INT_MODE 2 "gcn_valu_src1com_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1929 "vSvB, v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1930 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1931 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1932 v_<mnemonic>0\t%0, %2, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1933 ds_<mnemonic>0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1934 [(set_attr "type" "vop2,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1935 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1936
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1937 (define_insn_and_split "<expander>v64di3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1938 [(set (match_operand:V64DI 0 "gcn_valu_dst_operand" "=&v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1939 (bitop:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1940 (match_operand:V64DI 1 "gcn_valu_src0_operand" "% v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1941 (match_operand:V64DI 2 "gcn_valu_src1com_operand" "vSvB, v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1942 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1943 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1944 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1945 ds_<mnemonic>0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1946 "(reload_completed && !gcn_ds_memory_operand (operands[0], V64DImode))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1947 [(set (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1948 (bitop:V64SI (match_dup 5) (match_dup 7)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1949 (set (match_dup 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1950 (bitop:V64SI (match_dup 6) (match_dup 8)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1951 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1952 operands[3] = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1953 operands[4] = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1954 operands[5] = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1955 operands[6] = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1956 operands[7] = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1957 operands[8] = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1958 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1959 [(set_attr "type" "vmult,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1960 (set_attr "length" "16,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1961
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1962 (define_insn_and_split "<expander>v64di3_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1963 [(set (match_operand:V64DI 0 "gcn_valu_dst_operand" "=&v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1964 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1965 (bitop:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1966 (match_operand:V64DI 1 "gcn_valu_src0_operand" "% v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1967 (match_operand:V64DI 2 "gcn_valu_src1com_operand" "vSvB, v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1968 (match_operand:V64DI 3 "gcn_register_ds_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1969 " U0,U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1970 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1971 "!memory_operand (operands[0], VOIDmode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1972 || (rtx_equal_p (operands[0], operands[1])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1973 && register_operand (operands[2], VOIDmode))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1974 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1975 #
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1976 ds_<mnemonic>0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1977 "(reload_completed && !gcn_ds_memory_operand (operands[0], V64DImode))"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1978 [(set (match_dup 5)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1979 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1980 (bitop:V64SI (match_dup 7) (match_dup 9))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1981 (match_dup 11)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1982 (match_dup 4)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1983 (set (match_dup 6)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1984 (vec_merge:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1985 (bitop:V64SI (match_dup 8) (match_dup 10))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1986 (match_dup 12)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1987 (match_dup 4)))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1988 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1989 operands[5] = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1990 operands[6] = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1991 operands[7] = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1992 operands[8] = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1993 operands[9] = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1994 operands[10] = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1995 operands[11] = gcn_operand_part (V64DImode, operands[3], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1996 operands[12] = gcn_operand_part (V64DImode, operands[3], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1997 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1998 [(set_attr "type" "vmult,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1999 (set_attr "length" "16,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2001 (define_insn "<expander>v64si3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2002 [(set (match_operand:V64SI 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2003 (shiftop:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2004 (match_operand:V64SI 1 "gcn_alu_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2005 (vec_duplicate:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2006 (match_operand:SI 2 "gcn_alu_operand" "SvB"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2007 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2008 "v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2009 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2010 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2011
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2012 (define_insn "v<expander>v64si3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2013 [(set (match_operand:V64SI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2014 (shiftop:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2015 (match_operand:V64SI 1 "gcn_alu_operand" " v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2016 (match_operand:V64SI 2 "gcn_alu_operand" "vB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2017 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2018 "v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2019 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2020 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2021
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2022 (define_insn "<expander><mode>3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2023 [(set (match_operand:VEC_1REG_INT_MODE 0 "gcn_valu_dst_operand" "= v,RD")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2024 (minmaxop:VEC_1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2025 (match_operand:VEC_1REG_INT_MODE 1 "gcn_valu_src0_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2026 "% v, 0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2027 (match_operand:VEC_1REG_INT_MODE 2 "gcn_valu_src1com_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2028 "vSvB, v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2029 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2030 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2031 v_<mnemonic>0\t%0, %2, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2032 ds_<mnemonic>0\t%A0, %2%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2033 [(set_attr "type" "vop2,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2034 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2035
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2036 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2037 ;; {{{ FP binops - special cases
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2038
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2039 ; GCN does not directly provide a DFmode subtract instruction, so we do it by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2040 ; adding the negated second operand to the first.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2041
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2042 (define_insn "subv64df3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2043 [(set (match_operand:V64DF 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2044 (minus:V64DF
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2045 (match_operand:V64DF 1 "gcn_alu_operand" "vSvB, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2046 (match_operand:V64DF 2 "gcn_alu_operand" " v,vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2047 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2048 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2049 v_add_f64\t%0, %1, -%2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2050 v_add_f64\t%0, -%2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2051 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2052 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2053
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2054 (define_insn "subdf"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2055 [(set (match_operand:DF 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2056 (minus:DF
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2057 (match_operand:DF 1 "gcn_alu_operand" "vSvB, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2058 (match_operand:DF 2 "gcn_alu_operand" " v,vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2059 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2060 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2061 v_add_f64\t%0, %1, -%2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2062 v_add_f64\t%0, -%2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2063 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2064 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2065
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2066 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2067 ;; {{{ FP binops - generic
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2068
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2069 (define_mode_iterator VEC_FP_MODE [V64HF V64SF V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2070 (define_mode_iterator VEC_FP_1REG_MODE [V64HF V64SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2071 (define_mode_iterator FP_MODE [HF SF DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2072 (define_mode_iterator FP_1REG_MODE [HF SF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2073
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2074 (define_code_iterator comm_fp [plus mult smin smax])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2075 (define_code_iterator nocomm_fp [minus])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2076 (define_code_iterator all_fp [plus mult minus smin smax])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2077
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2078 (define_insn "<expander><mode>3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2079 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2080 (comm_fp:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2081 (match_operand:VEC_FP_MODE 1 "gcn_alu_operand" "% v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2082 (match_operand:VEC_FP_MODE 2 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2083 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2084 "v_<mnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2085 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2086 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2087
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2088 (define_insn "<expander><mode>3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2089 [(set (match_operand:FP_MODE 0 "gcn_valu_dst_operand" "= v, RL")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2090 (comm_fp:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2091 (match_operand:FP_MODE 1 "gcn_valu_src0_operand" "% v, 0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2092 (match_operand:FP_MODE 2 "gcn_valu_src1_operand" "vSvB,vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2093 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2094 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2095 v_<mnemonic>0\t%0, %2, %1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2096 v_<mnemonic>0\t%0, %1%O0"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2097 [(set_attr "type" "vop2,ds")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2098 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2099
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2100 (define_insn "<expander><mode>3<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2101 [(set (match_operand:VEC_FP_1REG_MODE 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2102 (nocomm_fp:VEC_FP_1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2103 (match_operand:VEC_FP_1REG_MODE 1 "gcn_alu_operand" "vSvB, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2104 (match_operand:VEC_FP_1REG_MODE 2 "gcn_alu_operand" " v,vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2105 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2106 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2107 v_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2108 v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2109 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2110 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2112 (define_insn "<expander><mode>3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2113 [(set (match_operand:FP_1REG_MODE 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2114 (nocomm_fp:FP_1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2115 (match_operand:FP_1REG_MODE 1 "gcn_alu_operand" "vSvB, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2116 (match_operand:FP_1REG_MODE 2 "gcn_alu_operand" " v,vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2117 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2118 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2119 v_<mnemonic>0\t%0, %1, %2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2120 v_<revmnemonic>0\t%0, %2, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2121 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2122 (set_attr "length" "8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2123
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2124 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2125 ;; {{{ FP unops
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2127 (define_insn "abs<mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2128 [(set (match_operand:FP_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2129 (abs:FP_MODE (match_operand:FP_MODE 1 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2130 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2131 "v_add%i0\t%0, 0, |%1|"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2132 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2133 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2134
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2135 (define_insn "abs<mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2136 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2137 (abs:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2138 (match_operand:VEC_FP_MODE 1 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2139 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2140 "v_add%i0\t%0, 0, |%1|"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2141 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2142 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2143
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2144 (define_insn "neg<mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2145 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2146 (neg:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2147 (match_operand:VEC_FP_MODE 1 "register_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2148 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2149 "v_add%i0\t%0, 0, -%1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2150 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2151 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2152
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2153 (define_insn "sqrt<mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2154 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2155 (sqrt:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2156 (match_operand:VEC_FP_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2157 "flag_unsafe_math_optimizations"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2158 "v_sqrt%i0\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2159 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2160 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2161
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2162 (define_insn "sqrt<mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2163 [(set (match_operand:FP_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2164 (sqrt:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2165 (match_operand:FP_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2166 "flag_unsafe_math_optimizations"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2167 "v_sqrt%i0\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2168 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2169 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2170
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2171 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2172 ;; {{{ FP fused multiply and add
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2173
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2174 (define_insn "fma<mode>4<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2175 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2176 (fma:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2177 (match_operand:VEC_FP_MODE 1 "gcn_alu_operand" "% vA, vA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2178 (match_operand:VEC_FP_MODE 2 "gcn_alu_operand" " vA,vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2179 (match_operand:VEC_FP_MODE 3 "gcn_alu_operand" "vSvA, vA")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2180 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2181 "v_fma%i0\t%0, %1, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2182 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2183 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2184
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2185 (define_insn "fma<mode>4_negop2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2186 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "= v, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2187 (fma:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2188 (match_operand:VEC_FP_MODE 1 "gcn_alu_operand" " vA, vA,vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2189 (neg:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2190 (match_operand:VEC_FP_MODE 2 "gcn_alu_operand" " vA,vSvA, vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2191 (match_operand:VEC_FP_MODE 3 "gcn_alu_operand" "vSvA, vA, vA")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2192 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2193 "v_fma%i0\t%0, %1, -%2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2194 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2195 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2196
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2197 (define_insn "fma<mode>4"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2198 [(set (match_operand:FP_MODE 0 "register_operand" "= v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2199 (fma:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2200 (match_operand:FP_MODE 1 "gcn_alu_operand" "% vA, vA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2201 (match_operand:FP_MODE 2 "gcn_alu_operand" " vA,vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2202 (match_operand:FP_MODE 3 "gcn_alu_operand" "vSvA, vA")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2203 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2204 "v_fma%i0\t%0, %1, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2205 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2206 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2207
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2208 (define_insn "fma<mode>4_negop2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2209 [(set (match_operand:FP_MODE 0 "register_operand" "= v, v, v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2210 (fma:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2211 (match_operand:FP_MODE 1 "gcn_alu_operand" " vA, vA,vSvA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2212 (neg:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2213 (match_operand:FP_MODE 2 "gcn_alu_operand" " vA,vSvA, vA"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2214 (match_operand:FP_MODE 3 "gcn_alu_operand" "vSvA, vA, vA")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2215 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2216 "v_fma%i0\t%0, %1, -%2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2217 [(set_attr "type" "vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2218 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2220 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2221 ;; {{{ FP division
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2222
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2223 (define_insn "recip<mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2224 [(set (match_operand:VEC_FP_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2225 (div:VEC_FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2226 (vec_duplicate:VEC_FP_MODE (float:<SCALAR_MODE> (const_int 1)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2227 (match_operand:VEC_FP_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2228 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2229 "v_rcp%i0\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2230 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2231 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2232
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2233 (define_insn "recip<mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2234 [(set (match_operand:FP_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2235 (div:FP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2236 (float:FP_MODE (const_int 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2237 (match_operand:FP_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2238 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2239 "v_rcp%i0\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2240 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2241 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2243 ;; Do division via a = b * 1/c
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2244 ;; The v_rcp_* instructions are not sufficiently accurate on their own,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2245 ;; so we use 2 v_fma_* instructions to do one round of Newton-Raphson
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2246 ;; which the ISA manual says is enough to improve the reciprocal accuracy.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2247 ;;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2248 ;; FIXME: This does not handle denormals, NaNs, division-by-zero etc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2249
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2250 (define_expand "div<mode>3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2251 [(match_operand:VEC_FP_MODE 0 "gcn_valu_dst_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2252 (match_operand:VEC_FP_MODE 1 "gcn_valu_src0_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2253 (match_operand:VEC_FP_MODE 2 "gcn_valu_src0_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2254 "flag_reciprocal_math"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2255 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2256 rtx two = gcn_vec_constant (<MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2257 const_double_from_real_value (dconst2, <SCALAR_MODE>mode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2258 rtx initrcp = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2259 rtx fma = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2260 rtx rcp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2261
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2262 bool is_rcp = (GET_CODE (operands[1]) == CONST_VECTOR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2263 && real_identical
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2264 (CONST_DOUBLE_REAL_VALUE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2265 (CONST_VECTOR_ELT (operands[1], 0)), &dconstm1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2266
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2267 if (is_rcp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2268 rcp = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2269 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2270 rcp = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2272 emit_insn (gen_recip<mode>2 (initrcp, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2273 emit_insn (gen_fma<mode>4_negop2 (fma, initrcp, operands[2], two));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2274 emit_insn (gen_mul<mode>3 (rcp, initrcp, fma));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2275
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2276 if (!is_rcp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2277 emit_insn (gen_mul<mode>3 (operands[0], operands[1], rcp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2278
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2279 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2280 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2282 (define_expand "div<mode>3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2283 [(match_operand:FP_MODE 0 "gcn_valu_dst_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2284 (match_operand:FP_MODE 1 "gcn_valu_src0_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2285 (match_operand:FP_MODE 2 "gcn_valu_src0_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2286 "flag_reciprocal_math"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2287 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2288 rtx two = const_double_from_real_value (dconst2, <MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2289 rtx initrcp = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2290 rtx fma = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2291 rtx rcp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2292
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2293 bool is_rcp = (GET_CODE (operands[1]) == CONST_DOUBLE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2294 && real_identical (CONST_DOUBLE_REAL_VALUE (operands[1]),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2295 &dconstm1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2296
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2297 if (is_rcp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2298 rcp = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2299 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2300 rcp = gen_reg_rtx (<MODE>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2301
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2302 emit_insn (gen_recip<mode>2 (initrcp, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2303 emit_insn (gen_fma<mode>4_negop2 (fma, initrcp, operands[2], two));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2304 emit_insn (gen_mul<mode>3 (rcp, initrcp, fma));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2305
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2306 if (!is_rcp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2307 emit_insn (gen_mul<mode>3 (operands[0], operands[1], rcp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2308
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2309 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2310 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2311
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2312 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2313 ;; {{{ Int/FP conversions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2314
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2315 (define_mode_iterator CVT_FROM_MODE [HI SI HF SF DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2316 (define_mode_iterator CVT_TO_MODE [HI SI HF SF DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2317
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2318 (define_mode_iterator VCVT_MODE [V64HI V64SI V64HF V64SF V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2319 (define_mode_iterator VCVT_FMODE [V64HF V64SF V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2320 (define_mode_iterator VCVT_IMODE [V64HI V64SI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2321
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2322 (define_code_iterator cvt_op [fix unsigned_fix
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2323 float unsigned_float
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2324 float_extend float_truncate])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2325 (define_code_attr cvt_name [(fix "fix_trunc") (unsigned_fix "fixuns_trunc")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2326 (float "float") (unsigned_float "floatuns")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2327 (float_extend "extend") (float_truncate "trunc")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2328 (define_code_attr cvt_operands [(fix "%i0%i1") (unsigned_fix "%u0%i1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2329 (float "%i0%i1") (unsigned_float "%i0%u1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2330 (float_extend "%i0%i1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2331 (float_truncate "%i0%i1")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2332
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2333 (define_insn "<cvt_name><CVT_FROM_MODE:mode><CVT_TO_MODE:mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2334 [(set (match_operand:CVT_TO_MODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2335 (cvt_op:CVT_TO_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2336 (match_operand:CVT_FROM_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2337 "gcn_valid_cvt_p (<CVT_FROM_MODE:MODE>mode, <CVT_TO_MODE:MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2338 <cvt_name>_cvt)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2339 "v_cvt<cvt_operands>\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2340 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2341 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2342
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2343 (define_insn "<cvt_name><VCVT_MODE:mode><VCVT_FMODE:mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2344 [(set (match_operand:VCVT_FMODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2345 (cvt_op:VCVT_FMODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2346 (match_operand:VCVT_MODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2347 "gcn_valid_cvt_p (<VCVT_MODE:MODE>mode, <VCVT_FMODE:MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2348 <cvt_name>_cvt)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2349 "v_cvt<cvt_operands>\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2350 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2351 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2352
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2353 (define_insn "<cvt_name><VCVT_FMODE:mode><VCVT_IMODE:mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2354 [(set (match_operand:VCVT_IMODE 0 "register_operand" "= v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2355 (cvt_op:VCVT_IMODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2356 (match_operand:VCVT_FMODE 1 "gcn_alu_operand" "vSvB")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2357 "gcn_valid_cvt_p (<VCVT_FMODE:MODE>mode, <VCVT_IMODE:MODE>mode,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2358 <cvt_name>_cvt)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2359 "v_cvt<cvt_operands>\t%0, %1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2360 [(set_attr "type" "vop1")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2361 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2362
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2363 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2364 ;; {{{ Int/int conversions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2365
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2366 (define_code_iterator zero_convert [truncate zero_extend])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2367 (define_code_attr convop [
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2368 (sign_extend "extend")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2369 (zero_extend "zero_extend")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2370 (truncate "trunc")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2371
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2372 (define_insn "<convop><VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2373 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2374 (zero_convert:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2375 (match_operand:VEC_ALL1REG_INT_ALT 1 "gcn_alu_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2376 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2377 "v_mov_b32_sdwa\t%0, %1 dst_sel:<VEC_ALL1REG_INT_MODE:sdwa> dst_unused:UNUSED_PAD src0_sel:<VEC_ALL1REG_INT_ALT:sdwa>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2378 [(set_attr "type" "vop_sdwa")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2379 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2381 (define_insn "extend<VEC_ALL1REG_INT_ALT:mode><VEC_ALL1REG_INT_MODE:mode>2<exec>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2382 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2383 (sign_extend:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2384 (match_operand:VEC_ALL1REG_INT_ALT 1 "gcn_alu_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2385 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2386 "v_mov_b32_sdwa\t%0, sext(%1) src0_sel:<VEC_ALL1REG_INT_ALT:sdwa>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2387 [(set_attr "type" "vop_sdwa")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2388 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2389
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2390 ;; GCC can already do these for scalar types, but not for vector types.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2391 ;; Unfortunately you can't just do SUBREG on a vector to select the low part,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2392 ;; so there must be a few tricks here.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2393
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2394 (define_insn_and_split "truncv64di<mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2395 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2396 (truncate:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2397 (match_operand:V64DI 1 "gcn_alu_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2398 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2399 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2400 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2401 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2402 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2403 rtx inlo = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2404 rtx out = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2405
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2406 if (<MODE>mode != V64SImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2407 emit_insn (gen_truncv64si<mode>2 (out, inlo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2408 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2409 emit_move_insn (out, inlo);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2410 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2411 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2412 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2414 (define_insn_and_split "truncv64di<mode>2_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2415 [(set (match_operand:VEC_ALL1REG_INT_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2416 (vec_merge:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2417 (truncate:VEC_ALL1REG_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2418 (match_operand:V64DI 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2419 (match_operand:VEC_ALL1REG_INT_MODE 2 "gcn_alu_or_unspec_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2420 "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2421 (match_operand:DI 3 "gcn_exec_operand" " e")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2422 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2423 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2424 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2425 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2426 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2427 rtx out = operands[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2428 rtx inlo = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2429 rtx merge = operands[2];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2430 rtx exec = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2431
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2432 if (<MODE>mode != V64SImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2433 emit_insn (gen_truncv64si<mode>2_exec (out, inlo, merge, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2434 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2435 emit_insn (gen_mov<mode>_exec (out, inlo, exec, merge));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2436 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2437 [(set_attr "type" "vop2")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2438 (set_attr "length" "4")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2439
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2440 (define_insn_and_split "<convop><mode>v64di2"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2441 [(set (match_operand:V64DI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2442 (any_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2443 (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" " v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2444 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2445 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2446 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2447 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2448 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2449 rtx outlo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2450 rtx outhi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2451 rtx in = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2452
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2453 if (<MODE>mode != V64SImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2454 emit_insn (gen_<convop><mode>v64si2 (outlo, in));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2455 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2456 emit_move_insn (outlo, in);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2457 if ('<su>' == 's')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2458 emit_insn (gen_ashrv64si3 (outhi, outlo, GEN_INT (31)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2459 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2460 emit_insn (gen_vec_duplicatev64si (outhi, const0_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2461 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2462 [(set_attr "type" "mult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2463 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2465 (define_insn_and_split "<convop><mode>v64di2_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2466 [(set (match_operand:V64DI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2467 (vec_merge:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2468 (any_extend:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2469 (match_operand:VEC_ALL1REG_INT_MODE 1 "gcn_alu_operand" " v"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2470 (match_operand:V64DI 2 "gcn_alu_or_unspec_operand" "U0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2471 (match_operand:DI 3 "gcn_exec_operand" " e")))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2472 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2473 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2474 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2475 [(const_int 0)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2476 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2477 rtx outlo = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2478 rtx outhi = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2479 rtx in = operands[1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2480 rtx mergelo = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2481 rtx mergehi = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2482 rtx exec = operands[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2483
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2484 if (<MODE>mode != V64SImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2485 emit_insn (gen_<convop><mode>v64si2_exec (outlo, in, mergelo, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2486 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2487 emit_insn (gen_mov<mode>_exec (outlo, in, exec, mergelo));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2488 if ('<su>' == 's')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2489 emit_insn (gen_ashrv64si3_exec (outhi, outlo, GEN_INT (31), mergehi,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2490 exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2491 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2492 emit_insn (gen_vec_duplicatev64si_exec (outhi, const0_rtx, mergehi,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2493 exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2494 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2495 [(set_attr "type" "mult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2496 (set_attr "length" "12")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2497
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2498 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2499 ;; {{{ Vector comparison/merge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2500
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2501 (define_mode_iterator VCMP_MODE [V64HI V64SI V64DI V64HF V64SF V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2502 (define_mode_iterator VCMP_MODE_INT [V64HI V64SI V64DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2503
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2504 (define_insn "vec_cmp<mode>di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2505 [(set (match_operand:DI 0 "register_operand" "=cV,cV, e, e,Sg,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2506 (match_operator 1 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2507 [(match_operand:VCMP_MODE 2 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2508 "vSv, B,vSv, B, v,vA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2509 (match_operand:VCMP_MODE 3 "gcn_vop3_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2510 " v, v, v, v,vA, v")]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2511 (clobber (match_scratch:DI 4 "= X, X, cV,cV, X, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2512 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2513 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2514 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2515 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2516 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2517 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2518 v_cmp%E1\t%0, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2519 v_cmp%E1\t%0, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2520 [(set_attr "type" "vopc,vopc,vopc,vopc,vop3a,vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2521 (set_attr "length" "4,8,4,8,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2522
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2523 (define_expand "vec_cmpu<mode>di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2524 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2525 (match_operator 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2526 [(match_operand:VCMP_MODE_INT 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2527 (match_operand:VCMP_MODE_INT 3 "gcn_vop3_operand")])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2528 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2529 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2530 /* Unsigned comparisons use the same patterns as signed comparisons,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2531 except that they use unsigned operators (e.g. LTU vs LT).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2532 The '%E1' directive then does the Right Thing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2533 emit_insn (gen_vec_cmp<mode>di (operands[0], operands[1], operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2534 operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2535 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2536 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2537
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2538 ; There's no instruction for 8-bit vector comparison, so we need to extend.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2539 (define_expand "vec_cmp<u>v64qidi"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2540 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2541 (match_operator 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2542 [(any_extend:V64SI (match_operand:V64QI 2 "gcn_alu_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2543 (any_extend:V64SI (match_operand:V64QI 3 "gcn_vop3_operand"))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2544 "can_create_pseudo_p ()"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2545 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2546 rtx sitmp1 = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2547 rtx sitmp2 = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2548
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2549 emit_insn (gen_<expander>v64qiv64si2 (sitmp1, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2550 emit_insn (gen_<expander>v64qiv64si2 (sitmp2, operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2551 emit_insn (gen_vec_cmpv64sidi (operands[0], operands[1], sitmp1, sitmp2));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2552 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2553 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2554
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2555 (define_insn "vec_cmp<mode>di_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2556 [(set (match_operand:DI 0 "register_operand" "=cV,cV, e, e,Sg,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2557 (and:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2558 (match_operator 1 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2559 [(match_operand:VCMP_MODE 2 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2560 "vSv, B,vSv, B, v,vA")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2561 (match_operand:VCMP_MODE 3 "gcn_vop3_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2562 " v, v, v, v,vA, v")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2563 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e, e, e, e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2564 (clobber (match_scratch:DI 5 "= X, X, cV,cV, X, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2565 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2566 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2567 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2568 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2569 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2570 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2571 v_cmp%E1\t%0, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2572 v_cmp%E1\t%0, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2573 [(set_attr "type" "vopc,vopc,vopc,vopc,vop3a,vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2574 (set_attr "length" "4,8,4,8,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2575
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2576 (define_expand "vec_cmpu<mode>di_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2577 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2578 (match_operator 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2579 [(match_operand:VCMP_MODE_INT 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2580 (match_operand:VCMP_MODE_INT 3 "gcn_vop3_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2581 (match_operand:DI 4 "gcn_exec_reg_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2582 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2583 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2584 /* Unsigned comparisons use the same patterns as signed comparisons,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2585 except that they use unsigned operators (e.g. LTU vs LT).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2586 The '%E1' directive then does the Right Thing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2587 emit_insn (gen_vec_cmpu<mode>di_exec (operands[0], operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2588 operands[2], operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2589 operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2590 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2591 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2592
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2593 (define_expand "vec_cmp<u>v64qidi_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2594 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2595 (match_operator 1 "gcn_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2596 [(any_extend:V64SI (match_operand:V64QI 2 "gcn_alu_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2597 (any_extend:V64SI (match_operand:V64QI 3 "gcn_vop3_operand"))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2598 (match_operand:DI 4 "gcn_exec_reg_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2599 "can_create_pseudo_p ()"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2600 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2601 rtx sitmp1 = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2602 rtx sitmp2 = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2603
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2604 emit_insn (gen_<expander>v64qiv64si2_exec (sitmp1, operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2605 operands[2], operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2606 emit_insn (gen_<expander>v64qiv64si2_exec (sitmp2, operands[3],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2607 operands[3], operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2608 emit_insn (gen_vec_cmpv64sidi_exec (operands[0], operands[1], sitmp1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2609 sitmp2, operands[4]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2610 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2611 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2612
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2613 (define_insn "vec_cmp<mode>di_dup"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2614 [(set (match_operand:DI 0 "register_operand" "=cV,cV, e,e,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2615 (match_operator 1 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2616 [(vec_duplicate:VCMP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2617 (match_operand:<SCALAR_MODE> 2 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2618 " Sv, B,Sv,B, A"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2619 (match_operand:VCMP_MODE 3 "gcn_vop3_operand" " v, v, v,v, v")]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2620 (clobber (match_scratch:DI 4 "= X,X,cV,cV, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2621 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2622 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2623 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2624 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2625 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2626 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2627 v_cmp%E1\t%0, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2628 [(set_attr "type" "vopc,vopc,vopc,vopc,vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2629 (set_attr "length" "4,8,4,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2630
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2631 (define_insn "vec_cmp<mode>di_dup_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2632 [(set (match_operand:DI 0 "register_operand" "=cV,cV, e,e,Sg")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2633 (and:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2634 (match_operator 1 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2635 [(vec_duplicate:VCMP_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2636 (match_operand:<SCALAR_MODE> 2 "gcn_alu_operand"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2637 " Sv, B,Sv,B, A"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2638 (match_operand:VCMP_MODE 3 "gcn_vop3_operand" " v, v, v,v, v")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2639 (match_operand:DI 4 "gcn_exec_reg_operand" " e, e, e,e, e")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2640 (clobber (match_scratch:DI 5 "= X,X,cV,cV, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2641 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2642 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2643 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2644 v_cmp%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2645 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2646 v_cmpx%E1\tvcc, %2, %3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2647 v_cmp%E1\t%0, %2, %3"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2648 [(set_attr "type" "vopc,vopc,vopc,vopc,vop3a")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2649 (set_attr "length" "4,8,4,8,8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2650
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2651 (define_expand "vcond_mask_<mode>di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2652 [(parallel
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2653 [(set (match_operand:VEC_ALLREG_MODE 0 "register_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2654 (vec_merge:VEC_ALLREG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2655 (match_operand:VEC_ALLREG_MODE 1 "gcn_vop3_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2656 (match_operand:VEC_ALLREG_MODE 2 "gcn_alu_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2657 (match_operand:DI 3 "register_operand" "")))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2658 (clobber (scratch:V64DI))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2659 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2660 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2661
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2662 (define_expand "vcond<VEC_ALLREG_MODE:mode><VEC_ALLREG_ALT:mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2663 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2664 (match_operand:VEC_ALLREG_MODE 1 "gcn_vop3_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2665 (match_operand:VEC_ALLREG_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2666 (match_operator 3 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2667 [(match_operand:VEC_ALLREG_ALT 4 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2668 (match_operand:VEC_ALLREG_ALT 5 "gcn_vop3_operand")])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2669 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2670 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2671 rtx tmp = gen_reg_rtx (DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2672 emit_insn (gen_vec_cmp<VEC_ALLREG_ALT:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2673 (tmp, operands[3], operands[4], operands[5]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2674 emit_insn (gen_vcond_mask_<VEC_ALLREG_MODE:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2675 (operands[0], operands[1], operands[2], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2676 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2677 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2678
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2679 (define_expand "vcond<VEC_ALLREG_MODE:mode><VEC_ALLREG_ALT:mode>_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2680 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2681 (match_operand:VEC_ALLREG_MODE 1 "gcn_vop3_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2682 (match_operand:VEC_ALLREG_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2683 (match_operator 3 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2684 [(match_operand:VEC_ALLREG_ALT 4 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2685 (match_operand:VEC_ALLREG_ALT 5 "gcn_vop3_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2686 (match_operand:DI 6 "gcn_exec_reg_operand" "e")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2687 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2688 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2689 rtx tmp = gen_reg_rtx (DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2690 emit_insn (gen_vec_cmp<VEC_ALLREG_ALT:mode>di_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2691 (tmp, operands[3], operands[4], operands[5], operands[6]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2692 emit_insn (gen_vcond_mask_<VEC_ALLREG_MODE:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2693 (operands[0], operands[1], operands[2], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2694 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2695 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2696
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2697 (define_expand "vcondu<VEC_ALLREG_MODE:mode><VEC_ALLREG_INT_MODE:mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2698 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2699 (match_operand:VEC_ALLREG_MODE 1 "gcn_vop3_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2700 (match_operand:VEC_ALLREG_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2701 (match_operator 3 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2702 [(match_operand:VEC_ALLREG_INT_MODE 4 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2703 (match_operand:VEC_ALLREG_INT_MODE 5 "gcn_vop3_operand")])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2704 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2705 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2706 rtx tmp = gen_reg_rtx (DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2707 emit_insn (gen_vec_cmpu<VEC_ALLREG_INT_MODE:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2708 (tmp, operands[3], operands[4], operands[5]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2709 emit_insn (gen_vcond_mask_<VEC_ALLREG_MODE:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2710 (operands[0], operands[1], operands[2], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2711 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2712 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2713
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2714 (define_expand "vcondu<VEC_ALLREG_MODE:mode><VEC_ALLREG_INT_MODE:mode>_exec"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2715 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2716 (match_operand:VEC_ALLREG_MODE 1 "gcn_vop3_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2717 (match_operand:VEC_ALLREG_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2718 (match_operator 3 "gcn_fp_compare_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2719 [(match_operand:VEC_ALLREG_INT_MODE 4 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2720 (match_operand:VEC_ALLREG_INT_MODE 5 "gcn_vop3_operand")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2721 (match_operand:DI 6 "gcn_exec_reg_operand" "e")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2722 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2723 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2724 rtx tmp = gen_reg_rtx (DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2725 emit_insn (gen_vec_cmpu<VEC_ALLREG_INT_MODE:mode>di_exec
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2726 (tmp, operands[3], operands[4], operands[5], operands[6]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2727 emit_insn (gen_vcond_mask_<VEC_ALLREG_MODE:mode>di
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2728 (operands[0], operands[1], operands[2], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2729 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2730 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2731
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2732 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2733 ;; {{{ Fully masked loop support
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2734
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2735 (define_expand "while_ultsidi"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2736 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2737 (match_operand:SI 1 "")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2738 (match_operand:SI 2 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2739 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2740 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2741 if (GET_CODE (operands[1]) != CONST_INT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2742 || GET_CODE (operands[2]) != CONST_INT)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2743 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2744 rtx _0_1_2_3 = gen_rtx_REG (V64SImode, VGPR_REGNO (1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2745 rtx tmp = _0_1_2_3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2746 if (GET_CODE (operands[1]) != CONST_INT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2747 || INTVAL (operands[1]) != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2748 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2749 tmp = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2750 emit_insn (gen_addv64si3_dup (tmp, _0_1_2_3, operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2751 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2752 emit_insn (gen_vec_cmpv64sidi_dup (operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2753 gen_rtx_GT (VOIDmode, 0, 0),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2754 operands[2], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2755 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2756 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2757 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2758 HOST_WIDE_INT diff = INTVAL (operands[2]) - INTVAL (operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2759 HOST_WIDE_INT mask = (diff >= 64 ? -1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2760 : ~((unsigned HOST_WIDE_INT)-1 << diff));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2761 emit_move_insn (operands[0], gen_rtx_CONST_INT (VOIDmode, mask));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2762 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2763 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2764 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2765
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2766 (define_expand "maskload<mode>di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2767 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2768 (match_operand:VEC_ALLREG_MODE 1 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2769 (match_operand 2 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2770 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2771 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2772 rtx exec = force_reg (DImode, operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2773 rtx addr = gcn_expand_scalar_to_vector_address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2774 (<MODE>mode, exec, operands[1], gen_rtx_SCRATCH (V64DImode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2775 rtx as = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2776 rtx v = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2777
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2778 /* Masked lanes are required to hold zero. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2779 emit_move_insn (operands[0], gcn_vec_constant (<MODE>mode, 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2780
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2781 emit_insn (gen_gather<mode>_expr_exec (operands[0], addr, as, v,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2782 operands[0], exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2783 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2784 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2785
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2786 (define_expand "maskstore<mode>di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2787 [(match_operand:VEC_ALLREG_MODE 0 "memory_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2788 (match_operand:VEC_ALLREG_MODE 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2789 (match_operand 2 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2790 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2791 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2792 rtx exec = force_reg (DImode, operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2793 rtx addr = gcn_expand_scalar_to_vector_address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2794 (<MODE>mode, exec, operands[0], gen_rtx_SCRATCH (V64DImode));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2795 rtx as = gen_rtx_CONST_INT (VOIDmode, MEM_ADDR_SPACE (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2796 rtx v = gen_rtx_CONST_INT (VOIDmode, MEM_VOLATILE_P (operands[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2797 emit_insn (gen_scatter<mode>_expr_exec (addr, operands[1], as, v, exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2798 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2799 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2800
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2801 (define_expand "mask_gather_load<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2802 [(match_operand:VEC_ALLREG_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2803 (match_operand:DI 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2804 (match_operand 2 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2805 (match_operand 3 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2806 (match_operand:SI 4 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2807 (match_operand:DI 5 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2808 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2809 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2810 rtx exec = force_reg (DImode, operands[5]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2812 /* TODO: more conversions will be needed when more types are vectorized. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2813 if (GET_MODE (operands[2]) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2814 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2815 rtx tmp = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2816 emit_insn (gen_truncv64div64si2_exec (tmp, operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2817 gcn_gen_undef (V64SImode),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2818 exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2819 operands[2] = tmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2820 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2821
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2822 rtx addr = gcn_expand_scaled_offsets (DEFAULT_ADDR_SPACE, operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2823 operands[2], operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2824 INTVAL (operands[3]), exec);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2825
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2826 /* Masked lanes are required to hold zero. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2827 emit_move_insn (operands[0], gcn_vec_constant (<MODE>mode, 0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2828
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2829 if (GET_MODE (addr) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2830 emit_insn (gen_gather<mode>_insn_1offset_exec (operands[0], addr,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2831 const0_rtx, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2832 const0_rtx, operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2833 exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2834 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2835 emit_insn (gen_gather<mode>_insn_2offsets_exec (operands[0], operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2836 addr, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2837 const0_rtx, const0_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2838 operands[0], exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2839 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2840 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2841
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2842 (define_expand "mask_scatter_store<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2843 [(match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2844 (match_operand 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2845 (match_operand 2 "immediate_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2846 (match_operand:SI 3 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2847 (match_operand:VEC_ALLREG_MODE 4 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2848 (match_operand:DI 5 "")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2849 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2850 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2851 rtx exec = force_reg (DImode, operands[5]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2852
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2853 /* TODO: more conversions will be needed when more types are vectorized. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2854 if (GET_MODE (operands[1]) == V64DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2855 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2856 rtx tmp = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2857 emit_insn (gen_truncv64div64si2_exec (tmp, operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2858 gcn_gen_undef (V64SImode),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2859 exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2860 operands[1] = tmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2861 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2862
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2863 emit_insn (gen_scatter<mode>_exec (operands[0], operands[1], operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2864 operands[3], operands[4], exec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2865 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2866 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2867
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2868 ; FIXME this should be VEC_REG_MODE, but not all dependencies are implemented.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2869 (define_mode_iterator COND_MODE [V64SI V64DI V64SF V64DF])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2870 (define_mode_iterator COND_INT_MODE [V64SI V64DI])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2871
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2872 (define_code_iterator cond_op [plus minus])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2873
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2874 (define_expand "cond_<expander><mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2875 [(match_operand:COND_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2876 (match_operand:DI 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2877 (cond_op:COND_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2878 (match_operand:COND_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2879 (match_operand:COND_MODE 3 "gcn_alu_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2880 (match_operand:COND_MODE 4 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2881 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2882 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2883 operands[1] = force_reg (DImode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2884 operands[2] = force_reg (<MODE>mode, operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2885
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2886 emit_insn (gen_<expander><mode>3_exec (operands[0], operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2887 operands[3], operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2888 operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2889 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2890 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2891
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2892 (define_code_iterator cond_bitop [and ior xor])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2893
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2894 (define_expand "cond_<expander><mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2895 [(match_operand:COND_INT_MODE 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2896 (match_operand:DI 1 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2897 (cond_bitop:COND_INT_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2898 (match_operand:COND_INT_MODE 2 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2899 (match_operand:COND_INT_MODE 3 "gcn_alu_operand"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2900 (match_operand:COND_INT_MODE 4 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2901 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2902 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2903 operands[1] = force_reg (DImode, operands[1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2904 operands[2] = force_reg (<MODE>mode, operands[2]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2905
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2906 emit_insn (gen_<expander><mode>3_exec (operands[0], operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2907 operands[3], operands[4],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2908 operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2909 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2910 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2911
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2912 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2913 ;; {{{ Vector reductions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2914
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2915 (define_int_iterator REDUC_UNSPEC [UNSPEC_SMIN_DPP_SHR UNSPEC_SMAX_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2916 UNSPEC_UMIN_DPP_SHR UNSPEC_UMAX_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2917 UNSPEC_PLUS_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2918 UNSPEC_AND_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2919 UNSPEC_IOR_DPP_SHR UNSPEC_XOR_DPP_SHR])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2920
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2921 (define_int_iterator REDUC_2REG_UNSPEC [UNSPEC_PLUS_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2922 UNSPEC_AND_DPP_SHR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2923 UNSPEC_IOR_DPP_SHR UNSPEC_XOR_DPP_SHR])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2924
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2925 ; FIXME: Isn't there a better way of doing this?
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2926 (define_int_attr reduc_unspec [(UNSPEC_SMIN_DPP_SHR "UNSPEC_SMIN_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2927 (UNSPEC_SMAX_DPP_SHR "UNSPEC_SMAX_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2928 (UNSPEC_UMIN_DPP_SHR "UNSPEC_UMIN_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2929 (UNSPEC_UMAX_DPP_SHR "UNSPEC_UMAX_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2930 (UNSPEC_PLUS_DPP_SHR "UNSPEC_PLUS_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2931 (UNSPEC_AND_DPP_SHR "UNSPEC_AND_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2932 (UNSPEC_IOR_DPP_SHR "UNSPEC_IOR_DPP_SHR")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2933 (UNSPEC_XOR_DPP_SHR "UNSPEC_XOR_DPP_SHR")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2934
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2935 (define_int_attr reduc_op [(UNSPEC_SMIN_DPP_SHR "smin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2936 (UNSPEC_SMAX_DPP_SHR "smax")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2937 (UNSPEC_UMIN_DPP_SHR "umin")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2938 (UNSPEC_UMAX_DPP_SHR "umax")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2939 (UNSPEC_PLUS_DPP_SHR "plus")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2940 (UNSPEC_AND_DPP_SHR "and")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2941 (UNSPEC_IOR_DPP_SHR "ior")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2942 (UNSPEC_XOR_DPP_SHR "xor")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2943
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2944 (define_int_attr reduc_insn [(UNSPEC_SMIN_DPP_SHR "v_min%i0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2945 (UNSPEC_SMAX_DPP_SHR "v_max%i0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2946 (UNSPEC_UMIN_DPP_SHR "v_min%u0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2947 (UNSPEC_UMAX_DPP_SHR "v_max%u0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2948 (UNSPEC_PLUS_DPP_SHR "v_add%u0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2949 (UNSPEC_AND_DPP_SHR "v_and%b0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2950 (UNSPEC_IOR_DPP_SHR "v_or%b0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2951 (UNSPEC_XOR_DPP_SHR "v_xor%b0")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2952
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2953 (define_expand "reduc_<reduc_op>_scal_<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2954 [(set (match_operand:<SCALAR_MODE> 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2955 (unspec:<SCALAR_MODE>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2956 [(match_operand:VEC_1REG_MODE 1 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2957 REDUC_UNSPEC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2958 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2959 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2960 rtx tmp = gcn_expand_reduc_scalar (<MODE>mode, operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2961 <reduc_unspec>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2962
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2963 /* The result of the reduction is in lane 63 of tmp. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2964 emit_insn (gen_mov_from_lane63_<mode> (operands[0], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2965
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2966 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2967 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2968
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2969 (define_expand "reduc_<reduc_op>_scal_v64di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2970 [(set (match_operand:DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2971 (unspec:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2972 [(match_operand:V64DI 1 "register_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2973 REDUC_2REG_UNSPEC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2974 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2975 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2976 rtx tmp = gcn_expand_reduc_scalar (V64DImode, operands[1],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2977 <reduc_unspec>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2978
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2979 /* The result of the reduction is in lane 63 of tmp. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2980 emit_insn (gen_mov_from_lane63_v64di (operands[0], tmp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2981
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2982 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2983 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2984
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2985 (define_insn "*<reduc_op>_dpp_shr_<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2986 [(set (match_operand:VEC_1REG_MODE 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2987 (unspec:VEC_1REG_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2988 [(match_operand:VEC_1REG_MODE 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2989 (match_operand:VEC_1REG_MODE 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2990 (match_operand:SI 3 "const_int_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2991 REDUC_UNSPEC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2992 "!(TARGET_GCN3 && SCALAR_INT_MODE_P (<SCALAR_MODE>mode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2993 && <reduc_unspec> == UNSPEC_PLUS_DPP_SHR)"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2994 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2995 return gcn_expand_dpp_shr_insn (<MODE>mode, "<reduc_insn>",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2996 <reduc_unspec>, INTVAL (operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2997 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2998 [(set_attr "type" "vop_dpp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2999 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3001 (define_insn_and_split "*<reduc_op>_dpp_shr_v64di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3002 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3003 (unspec:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3004 [(match_operand:V64DI 1 "register_operand" "v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3005 (match_operand:V64DI 2 "register_operand" "v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3006 (match_operand:SI 3 "const_int_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3007 REDUC_2REG_UNSPEC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3008 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3009 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3010 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3011 [(set (match_dup 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3012 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3013 [(match_dup 6) (match_dup 8) (match_dup 3)] REDUC_2REG_UNSPEC))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3014 (set (match_dup 5)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3015 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3016 [(match_dup 7) (match_dup 9) (match_dup 3)] REDUC_2REG_UNSPEC))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3017 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3018 operands[4] = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3019 operands[5] = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3020 operands[6] = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3021 operands[7] = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3022 operands[8] = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3023 operands[9] = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3024 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3025 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3026 (set_attr "length" "16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3027
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3028 ; Special cases for addition.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3029
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3030 (define_insn "*plus_carry_dpp_shr_v64si"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3031 [(set (match_operand:V64SI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3032 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3033 [(match_operand:V64SI 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3034 (match_operand:V64SI 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3035 (match_operand:SI 3 "const_int_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3036 UNSPEC_PLUS_CARRY_DPP_SHR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3037 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3038 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3039 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3040 const char *insn = TARGET_GCN3 ? "v_add%u0" : "v_add_co%u0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3041 return gcn_expand_dpp_shr_insn (V64SImode, insn,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3042 UNSPEC_PLUS_CARRY_DPP_SHR,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3043 INTVAL (operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3044 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3045 [(set_attr "type" "vop_dpp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3046 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3047
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3048 (define_insn "*plus_carry_in_dpp_shr_v64si"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3049 [(set (match_operand:V64SI 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3050 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3051 [(match_operand:V64SI 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3052 (match_operand:V64SI 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3053 (match_operand:SI 3 "const_int_operand" "n")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3054 (match_operand:DI 4 "register_operand" "cV")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3055 UNSPEC_PLUS_CARRY_IN_DPP_SHR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3056 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3057 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3058 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3059 const char *insn = TARGET_GCN3 ? "v_addc%u0" : "v_addc_co%u0";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3060 return gcn_expand_dpp_shr_insn (V64SImode, insn,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3061 UNSPEC_PLUS_CARRY_IN_DPP_SHR,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3062 INTVAL (operands[3]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3063 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3064 [(set_attr "type" "vop_dpp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3065 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3066
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3067 (define_insn_and_split "*plus_carry_dpp_shr_v64di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3068 [(set (match_operand:V64DI 0 "register_operand" "=&v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3069 (unspec:V64DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3070 [(match_operand:V64DI 1 "register_operand" "v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3071 (match_operand:V64DI 2 "register_operand" "v0")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3072 (match_operand:SI 3 "const_int_operand" "n")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3073 UNSPEC_PLUS_CARRY_DPP_SHR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3074 (clobber (reg:DI VCC_REG))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3075 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3076 "#"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3077 "reload_completed"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3078 [(parallel [(set (match_dup 4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3079 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3080 [(match_dup 6) (match_dup 8) (match_dup 3)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3081 UNSPEC_PLUS_CARRY_DPP_SHR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3082 (clobber (reg:DI VCC_REG))])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3083 (parallel [(set (match_dup 5)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3084 (unspec:V64SI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3085 [(match_dup 7) (match_dup 9) (match_dup 3) (reg:DI VCC_REG)]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3086 UNSPEC_PLUS_CARRY_IN_DPP_SHR))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3087 (clobber (reg:DI VCC_REG))])]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3088 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3089 operands[4] = gcn_operand_part (V64DImode, operands[0], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3090 operands[5] = gcn_operand_part (V64DImode, operands[0], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3091 operands[6] = gcn_operand_part (V64DImode, operands[1], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3092 operands[7] = gcn_operand_part (V64DImode, operands[1], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3093 operands[8] = gcn_operand_part (V64DImode, operands[2], 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3094 operands[9] = gcn_operand_part (V64DImode, operands[2], 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3095 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3096 [(set_attr "type" "vmult")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3097 (set_attr "length" "16")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3098
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3099 ; Instructions to move a scalar value from lane 63 of a vector register.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3100 (define_insn "mov_from_lane63_<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3101 [(set (match_operand:<SCALAR_MODE> 0 "register_operand" "=Sg,v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3102 (unspec:<SCALAR_MODE>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3103 [(match_operand:VEC_ALL1REG_MODE 1 "register_operand" "v,v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3104 UNSPEC_MOV_FROM_LANE63))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3105 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3106 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3107 v_readlane_b32\t%0, %1, 63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3108 v_mov_b32\t%0, %1 wave_ror:1"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3109 [(set_attr "type" "vop3a,vop_dpp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3110 (set_attr "exec" "none,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3111 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3113 (define_insn "mov_from_lane63_v64di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3114 [(set (match_operand:DI 0 "register_operand" "=Sg,v")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3115 (unspec:DI
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3116 [(match_operand:V64DI 1 "register_operand" "v,v")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3117 UNSPEC_MOV_FROM_LANE63))]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3118 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3119 "@
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3120 v_readlane_b32\t%L0, %L1, 63\;v_readlane_b32\t%H0, %H1, 63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3121 * if (REGNO (operands[0]) <= REGNO (operands[1])) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3122 return \"v_mov_b32\t%L0, %L1 wave_ror:1\;\" \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3123 \"v_mov_b32\t%H0, %H1 wave_ror:1\"; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3124 else \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3125 return \"v_mov_b32\t%H0, %H1 wave_ror:1\;\" \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3126 \"v_mov_b32\t%L0, %L1 wave_ror:1\";"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3127 [(set_attr "type" "vop3a,vop_dpp")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3128 (set_attr "exec" "none,*")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3129 (set_attr "length" "8")])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3131 ;; }}}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3132 ;; {{{ Miscellaneous
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3134 (define_expand "vec_seriesv64si"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3135 [(match_operand:V64SI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3136 (match_operand:SI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3137 (match_operand:SI 2 "gcn_alu_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3138 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3139 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3140 rtx tmp = gen_reg_rtx (V64SImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3141 rtx v1 = gen_rtx_REG (V64SImode, VGPR_REGNO (1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3143 emit_insn (gen_mulv64si3_dup (tmp, v1, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3144 emit_insn (gen_addv64si3_dup (operands[0], tmp, operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3145 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3146 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3148 (define_expand "vec_seriesv64di"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3149 [(match_operand:V64DI 0 "register_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3150 (match_operand:DI 1 "gcn_alu_operand")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3151 (match_operand:DI 2 "gcn_alu_operand")]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3152 ""
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3153 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3154 rtx tmp = gen_reg_rtx (V64DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3155 rtx v1 = gen_rtx_REG (V64SImode, VGPR_REGNO (1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3156 rtx op1vec = gen_reg_rtx (V64DImode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3158 emit_insn (gen_mulv64di3_zext_dup2 (tmp, v1, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3159 emit_insn (gen_vec_duplicatev64si (op1vec, operands[1]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3160 emit_insn (gen_addv64di3 (operands[0], tmp, op1vec));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3161 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3162 })
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3163
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3164 ;; }}}