annotate gcc/config/s390/vector.md @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;;- Instruction patterns for the System z vector facility
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 ;; Copyright (C) 2015-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 ;; This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 ;; GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
8 ;; the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
9 ;; Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
10 ;; version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
13 ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
14 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
15 ;; for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 ; All vector modes supported in a vector register
kono
parents:
diff changeset
22 (define_mode_iterator V
kono
parents:
diff changeset
23 [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1SF
kono
parents:
diff changeset
24 V2SF V4SF V1DF V2DF])
kono
parents:
diff changeset
25 (define_mode_iterator VT
kono
parents:
diff changeset
26 [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1SF
kono
parents:
diff changeset
27 V2SF V4SF V1DF V2DF V1TF V1TI TI])
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 ; All modes directly supported by the hardware having full vector reg size
kono
parents:
diff changeset
30 ; V_HW2 is duplicate of V_HW for having two iterators expanding
kono
parents:
diff changeset
31 ; independently e.g. vcond
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 (define_mode_iterator V_HW [V16QI V8HI V4SI V2DI (V1TI "TARGET_VXE") V2DF (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")])
111
kono
parents:
diff changeset
33 (define_mode_iterator V_HW2 [V16QI V8HI V4SI V2DI V2DF (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")])
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 (define_mode_iterator V_HW_64 [V2DI V2DF])
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 (define_mode_iterator VT_HW_HSDT [V8HI V4SI V4SF V2DI V2DF V1TI V1TF TI TF])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 (define_mode_iterator V_HW_HSD [V8HI V4SI (V4SF "TARGET_VXE") V2DI V2DF])
111
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 ; Including TI for instructions that support it (va, vn, ...)
kono
parents:
diff changeset
40 (define_mode_iterator VT_HW [V16QI V8HI V4SI V2DI V2DF V1TI TI (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")])
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 ; All full size integer vector modes supported in a vector register + TImode
kono
parents:
diff changeset
43 (define_mode_iterator VIT_HW [V16QI V8HI V4SI V2DI V1TI TI])
kono
parents:
diff changeset
44 (define_mode_iterator VI_HW [V16QI V8HI V4SI V2DI])
kono
parents:
diff changeset
45 (define_mode_iterator VI_HW_QHS [V16QI V8HI V4SI])
kono
parents:
diff changeset
46 (define_mode_iterator VI_HW_HSD [V8HI V4SI V2DI])
kono
parents:
diff changeset
47 (define_mode_iterator VI_HW_HS [V8HI V4SI])
kono
parents:
diff changeset
48 (define_mode_iterator VI_HW_QH [V16QI V8HI])
kono
parents:
diff changeset
49 (define_mode_iterator VI_HW_4 [V4SI V4SF])
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 ; All integer vector modes supported in a vector register + TImode
kono
parents:
diff changeset
52 (define_mode_iterator VIT [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1TI TI])
kono
parents:
diff changeset
53 (define_mode_iterator VI [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI])
kono
parents:
diff changeset
54 (define_mode_iterator VI_QHS [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI])
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 (define_mode_iterator VFT [(V1SF "TARGET_VXE") (V2SF "TARGET_VXE") (V4SF "TARGET_VXE")
kono
parents:
diff changeset
57 V1DF V2DF
kono
parents:
diff changeset
58 (V1TF "TARGET_VXE")])
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 ; FP vector modes directly supported by the HW. This does not include
kono
parents:
diff changeset
61 ; vector modes using only part of a vector register and should be used
kono
parents:
diff changeset
62 ; for instructions which might trigger IEEE exceptions.
kono
parents:
diff changeset
63 (define_mode_iterator VF_HW [(V4SF "TARGET_VXE") V2DF (V1TF "TARGET_VXE")])
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 (define_mode_iterator V_8 [V1QI])
kono
parents:
diff changeset
66 (define_mode_iterator V_16 [V2QI V1HI])
kono
parents:
diff changeset
67 (define_mode_iterator V_32 [V4QI V2HI V1SI V1SF])
kono
parents:
diff changeset
68 (define_mode_iterator V_64 [V8QI V4HI V2SI V2SF V1DI V1DF])
kono
parents:
diff changeset
69 (define_mode_iterator V_128 [V16QI V8HI V4SI V4SF V2DI V2DF V1TI V1TF])
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 (define_mode_iterator V_128_NOSINGLE [V16QI V8HI V4SI V4SF V2DI V2DF])
kono
parents:
diff changeset
72
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73 ; 32 bit int<->fp vector conversion instructions are available since VXE2 (z15).
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 (define_mode_iterator VX_VEC_CONV_BFP [V2DF (V4SF "TARGET_VXE2")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 (define_mode_iterator VX_VEC_CONV_INT [V2DI (V4SI "TARGET_VXE2")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76
111
kono
parents:
diff changeset
77 ; Empty string for all but TImode. This is used to hide the TImode
kono
parents:
diff changeset
78 ; expander name in case it is defined already. See addti3 for an
kono
parents:
diff changeset
79 ; example.
kono
parents:
diff changeset
80 (define_mode_attr ti* [(V1QI "") (V2QI "") (V4QI "") (V8QI "") (V16QI "")
kono
parents:
diff changeset
81 (V1HI "") (V2HI "") (V4HI "") (V8HI "")
kono
parents:
diff changeset
82 (V1SI "") (V2SI "") (V4SI "")
kono
parents:
diff changeset
83 (V1DI "") (V2DI "")
kono
parents:
diff changeset
84 (V1TI "") (TI "*")
kono
parents:
diff changeset
85 (V1SF "") (V2SF "") (V4SF "")
kono
parents:
diff changeset
86 (V1DF "") (V2DF "")
kono
parents:
diff changeset
87 (V1TF "") (TF "")])
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 ; The element type of the vector.
kono
parents:
diff changeset
90 (define_mode_attr non_vec[(V1QI "QI") (V2QI "QI") (V4QI "QI") (V8QI "QI") (V16QI "QI")
kono
parents:
diff changeset
91 (V1HI "HI") (V2HI "HI") (V4HI "HI") (V8HI "HI")
kono
parents:
diff changeset
92 (V1SI "SI") (V2SI "SI") (V4SI "SI")
kono
parents:
diff changeset
93 (V1DI "DI") (V2DI "DI")
kono
parents:
diff changeset
94 (V1TI "TI") (TI "TI")
kono
parents:
diff changeset
95 (V1SF "SF") (V2SF "SF") (V4SF "SF")
kono
parents:
diff changeset
96 (V1DF "DF") (V2DF "DF")
kono
parents:
diff changeset
97 (V1TF "TF") (TF "TF")])
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 ; Like above, but in lower case.
kono
parents:
diff changeset
100 (define_mode_attr non_vec_l[(V1QI "qi") (V2QI "qi") (V4QI "qi") (V8QI "qi")
kono
parents:
diff changeset
101 (V16QI "qi")
kono
parents:
diff changeset
102 (V1HI "hi") (V2HI "hi") (V4HI "hi") (V8HI "hi")
kono
parents:
diff changeset
103 (V1SI "si") (V2SI "si") (V4SI "si")
kono
parents:
diff changeset
104 (V1DI "di") (V2DI "di")
kono
parents:
diff changeset
105 (V1TI "ti") (TI "ti")
kono
parents:
diff changeset
106 (V1SF "sf") (V2SF "sf") (V4SF "sf")
kono
parents:
diff changeset
107 (V1DF "df") (V2DF "df")
kono
parents:
diff changeset
108 (V1TF "tf") (TF "tf")])
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 ; The instruction suffix for integer instructions and instructions
kono
parents:
diff changeset
111 ; which do not care about whether it is floating point or integer.
kono
parents:
diff changeset
112 (define_mode_attr bhfgq[(V1QI "b") (V2QI "b") (V4QI "b") (V8QI "b") (V16QI "b")
kono
parents:
diff changeset
113 (V1HI "h") (V2HI "h") (V4HI "h") (V8HI "h")
kono
parents:
diff changeset
114 (V1SI "f") (V2SI "f") (V4SI "f")
kono
parents:
diff changeset
115 (V1DI "g") (V2DI "g")
kono
parents:
diff changeset
116 (V1TI "q") (TI "q")
kono
parents:
diff changeset
117 (V1SF "f") (V2SF "f") (V4SF "f")
kono
parents:
diff changeset
118 (V1DF "g") (V2DF "g")
kono
parents:
diff changeset
119 (V1TF "q")])
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 ; This is for vmalhw. It gets an 'w' attached to avoid confusion with
kono
parents:
diff changeset
122 ; multiply and add logical high vmalh.
kono
parents:
diff changeset
123 (define_mode_attr w [(V1QI "") (V2QI "") (V4QI "") (V8QI "") (V16QI "")
kono
parents:
diff changeset
124 (V1HI "w") (V2HI "w") (V4HI "w") (V8HI "w")
kono
parents:
diff changeset
125 (V1SI "") (V2SI "") (V4SI "")
kono
parents:
diff changeset
126 (V1DI "") (V2DI "")])
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 ; Resulting mode of a vector comparison. For floating point modes an
kono
parents:
diff changeset
129 ; integer vector mode with the same element size is picked.
kono
parents:
diff changeset
130 (define_mode_attr tointvec [(V1QI "V1QI") (V2QI "V2QI") (V4QI "V4QI") (V8QI "V8QI") (V16QI "V16QI")
kono
parents:
diff changeset
131 (V1HI "V1HI") (V2HI "V2HI") (V4HI "V4HI") (V8HI "V8HI")
kono
parents:
diff changeset
132 (V1SI "V1SI") (V2SI "V2SI") (V4SI "V4SI")
kono
parents:
diff changeset
133 (V1DI "V1DI") (V2DI "V2DI")
kono
parents:
diff changeset
134 (V1TI "V1TI")
kono
parents:
diff changeset
135 (V1SF "V1SI") (V2SF "V2SI") (V4SF "V4SI")
kono
parents:
diff changeset
136 (V1DF "V1DI") (V2DF "V2DI")
kono
parents:
diff changeset
137 (V1TF "V1TI")])
kono
parents:
diff changeset
138 (define_mode_attr vw [(SF "w") (V1SF "w") (V2SF "v") (V4SF "v")
kono
parents:
diff changeset
139 (DF "w") (V1DF "w") (V2DF "v")
kono
parents:
diff changeset
140 (TF "w") (V1TF "w")])
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 (define_mode_attr sdx [(SF "s") (V1SF "s") (V2SF "s") (V4SF "s")
kono
parents:
diff changeset
143 (DF "d") (V1DF "d") (V2DF "d")
kono
parents:
diff changeset
144 (TF "x") (V1TF "x")])
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 ; Vector with doubled element size.
kono
parents:
diff changeset
147 (define_mode_attr vec_double [(V1QI "V1HI") (V2QI "V1HI") (V4QI "V2HI") (V8QI "V4HI") (V16QI "V8HI")
kono
parents:
diff changeset
148 (V1HI "V1SI") (V2HI "V1SI") (V4HI "V2SI") (V8HI "V4SI")
kono
parents:
diff changeset
149 (V1SI "V1DI") (V2SI "V1DI") (V4SI "V2DI")
kono
parents:
diff changeset
150 (V1DI "V1TI") (V2DI "V1TI")
kono
parents:
diff changeset
151 (V1SF "V1DF") (V2SF "V1DF") (V4SF "V2DF")])
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 ; Vector with half the element size.
kono
parents:
diff changeset
154 (define_mode_attr vec_half [(V1HI "V2QI") (V2HI "V4QI") (V4HI "V8QI") (V8HI "V16QI")
kono
parents:
diff changeset
155 (V1SI "V2HI") (V2SI "V4HI") (V4SI "V8HI")
kono
parents:
diff changeset
156 (V1DI "V2SI") (V2DI "V4SI")
kono
parents:
diff changeset
157 (V1TI "V2DI")
kono
parents:
diff changeset
158 (V1DF "V2SF") (V2DF "V4SF")
kono
parents:
diff changeset
159 (V1TF "V1DF")])
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 ; Vector with half the element size AND half the number of elements.
kono
parents:
diff changeset
162 (define_mode_attr vec_halfhalf
kono
parents:
diff changeset
163 [(V2HI "V2QI") (V4HI "V4QI") (V8HI "V8QI")
kono
parents:
diff changeset
164 (V2SI "V2HI") (V4SI "V4HI")
kono
parents:
diff changeset
165 (V2DI "V2SI")
kono
parents:
diff changeset
166 (V2DF "V2SF")])
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 (define_mode_attr vec_halfnumelts
kono
parents:
diff changeset
169 [(V4SF "V2SF") (V4SI "V2SI")])
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 ; Comparison operators on int and fp compares which are directly
kono
parents:
diff changeset
174 ; supported by the HW.
kono
parents:
diff changeset
175 (define_code_iterator VICMP_HW_OP [eq gt gtu])
kono
parents:
diff changeset
176 ; For int insn_cmp_op can be used in the insn name as well as in the asm output.
kono
parents:
diff changeset
177 (define_code_attr insn_cmp_op [(eq "eq") (gt "h") (gtu "hl") (ge "he")])
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 ; Flags for vector string instructions (vfae all 4, vfee only ZS and CS, vstrc all 4)
kono
parents:
diff changeset
180 (define_constants
kono
parents:
diff changeset
181 [(VSTRING_FLAG_IN 8) ; invert result
kono
parents:
diff changeset
182 (VSTRING_FLAG_RT 4) ; result type
kono
parents:
diff changeset
183 (VSTRING_FLAG_ZS 2) ; zero search
kono
parents:
diff changeset
184 (VSTRING_FLAG_CS 1)]) ; condition code set
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 (include "vx-builtins.md")
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 ; Full HW vector size moves
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 ; We don't use lm/stm for 128 bit moves since these are slower than
kono
parents:
diff changeset
191 ; splitting it into separate moves.
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 ; FIXME: More constants are possible by enabling jxx, jyy constraints
kono
parents:
diff changeset
194 ; for TImode (use double-int for the calculations)
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 ; vgmb, vgmh, vgmf, vgmg, vrepib, vrepih, vrepif, vrepig
kono
parents:
diff changeset
197 (define_insn "mov<mode>"
kono
parents:
diff changeset
198 [(set (match_operand:V_128 0 "nonimmediate_operand" "=v,v,R, v, v, v, v, v,v,*d,*d,?o")
kono
parents:
diff changeset
199 (match_operand:V_128 1 "general_operand" " v,R,v,j00,jm1,jyy,jxx,jKK,d, v,dT,*d"))]
kono
parents:
diff changeset
200 ""
kono
parents:
diff changeset
201 "@
kono
parents:
diff changeset
202 vlr\t%v0,%v1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 vl\t%v0,%1%A1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 vst\t%v1,%0%A0
111
kono
parents:
diff changeset
205 vzero\t%v0
kono
parents:
diff changeset
206 vone\t%v0
kono
parents:
diff changeset
207 vgbm\t%v0,%t1
kono
parents:
diff changeset
208 vgm<bhfgq>\t%v0,%s1,%e1
kono
parents:
diff changeset
209 vrepi<bhfgq>\t%v0,%h1
kono
parents:
diff changeset
210 vlvgp\t%v0,%1,%N1
kono
parents:
diff changeset
211 #
kono
parents:
diff changeset
212 #
kono
parents:
diff changeset
213 #"
kono
parents:
diff changeset
214 [(set_attr "cpu_facility" "vx,vx,vx,vx,vx,vx,vx,vx,vx,vx,*,*")
kono
parents:
diff changeset
215 (set_attr "op_type" "VRR,VRX,VRX,VRI,VRI,VRI,VRI,VRI,VRR,*,*,*")])
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 ; VR -> GPR, no instruction so split it into 64 element sets.
kono
parents:
diff changeset
218 (define_split
kono
parents:
diff changeset
219 [(set (match_operand:V_128 0 "register_operand" "")
kono
parents:
diff changeset
220 (match_operand:V_128 1 "register_operand" ""))]
kono
parents:
diff changeset
221 "TARGET_VX && GENERAL_REG_P (operands[0]) && VECTOR_REG_P (operands[1])"
kono
parents:
diff changeset
222 [(set (match_dup 2)
kono
parents:
diff changeset
223 (unspec:DI [(subreg:V2DI (match_dup 1) 0)
kono
parents:
diff changeset
224 (const_int 0)] UNSPEC_VEC_EXTRACT))
kono
parents:
diff changeset
225 (set (match_dup 3)
kono
parents:
diff changeset
226 (unspec:DI [(subreg:V2DI (match_dup 1) 0)
kono
parents:
diff changeset
227 (const_int 1)] UNSPEC_VEC_EXTRACT))]
kono
parents:
diff changeset
228 {
kono
parents:
diff changeset
229 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
kono
parents:
diff changeset
230 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
kono
parents:
diff changeset
231 })
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 ; Split the 128 bit GPR move into two word mode moves
kono
parents:
diff changeset
234 ; s390_split_ok_p decides which part needs to be moved first.
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 (define_split
kono
parents:
diff changeset
237 [(set (match_operand:V_128 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
238 (match_operand:V_128 1 "general_operand" ""))]
kono
parents:
diff changeset
239 "reload_completed
kono
parents:
diff changeset
240 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
kono
parents:
diff changeset
241 [(set (match_dup 2) (match_dup 4))
kono
parents:
diff changeset
242 (set (match_dup 3) (match_dup 5))]
kono
parents:
diff changeset
243 {
kono
parents:
diff changeset
244 operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
kono
parents:
diff changeset
245 operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
kono
parents:
diff changeset
246 operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
kono
parents:
diff changeset
247 operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
kono
parents:
diff changeset
248 })
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 (define_split
kono
parents:
diff changeset
251 [(set (match_operand:V_128 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
252 (match_operand:V_128 1 "general_operand" ""))]
kono
parents:
diff changeset
253 "reload_completed
kono
parents:
diff changeset
254 && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
kono
parents:
diff changeset
255 [(set (match_dup 2) (match_dup 4))
kono
parents:
diff changeset
256 (set (match_dup 3) (match_dup 5))]
kono
parents:
diff changeset
257 {
kono
parents:
diff changeset
258 operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
kono
parents:
diff changeset
259 operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
kono
parents:
diff changeset
260 operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
kono
parents:
diff changeset
261 operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
kono
parents:
diff changeset
262 })
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 ; This is the vector equivalent to the TImode splitter in s390.md. It
kono
parents:
diff changeset
265 ; is required if both target GPRs occur in the source address operand.
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 ; For non-s_operands at least one of the target GPRs does not conflict
kono
parents:
diff changeset
268 ; with the address operand and one of the splitters above will take
kono
parents:
diff changeset
269 ; over.
kono
parents:
diff changeset
270 (define_split
kono
parents:
diff changeset
271 [(set (match_operand:V_128 0 "register_operand" "")
kono
parents:
diff changeset
272 (match_operand:V_128 1 "memory_operand" ""))]
kono
parents:
diff changeset
273 "TARGET_ZARCH && reload_completed
kono
parents:
diff changeset
274 && !VECTOR_REG_P (operands[0])
kono
parents:
diff changeset
275 && !s_operand (operands[1], VOIDmode)"
kono
parents:
diff changeset
276 [(set (match_dup 0) (match_dup 1))]
kono
parents:
diff changeset
277 {
kono
parents:
diff changeset
278 rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
kono
parents:
diff changeset
279 addr = gen_lowpart (Pmode, addr);
kono
parents:
diff changeset
280 s390_load_address (addr, XEXP (operands[1], 0));
kono
parents:
diff changeset
281 operands[1] = replace_equiv_address (operands[1], addr);
kono
parents:
diff changeset
282 })
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 ; Moves for smaller vector modes.
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 ; In these patterns only the vlr, vone, and vzero instructions write
kono
parents:
diff changeset
287 ; VR bytes outside the mode. This should be ok since we disallow
kono
parents:
diff changeset
288 ; formerly bigger modes being accessed with smaller modes via
kono
parents:
diff changeset
289 ; subreg. Note: The vone, vzero instructions could easily be replaced
kono
parents:
diff changeset
290 ; with vlei which would only access the bytes belonging to the mode.
kono
parents:
diff changeset
291 ; However, this would probably be slower.
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 (define_insn "mov<mode>"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,R,T")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,T,d,d"))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 "TARGET_VX"
111
kono
parents:
diff changeset
297 "@
kono
parents:
diff changeset
298 vlr\t%v0,%v1
kono
parents:
diff changeset
299 vlvgb\t%v0,%1,0
kono
parents:
diff changeset
300 vlgvb\t%0,%v1,0
kono
parents:
diff changeset
301 vleb\t%v0,%1,0
kono
parents:
diff changeset
302 vsteb\t%v1,%0,0
kono
parents:
diff changeset
303 vzero\t%v0
kono
parents:
diff changeset
304 vone\t%v0
kono
parents:
diff changeset
305 vgbm\t%v0,%t1
kono
parents:
diff changeset
306 vgm\t%v0,%s1,%e1
kono
parents:
diff changeset
307 lr\t%0,%1
kono
parents:
diff changeset
308 mvi\t%0,0
kono
parents:
diff changeset
309 mviy\t%0,0
kono
parents:
diff changeset
310 mvi\t%0,-1
kono
parents:
diff changeset
311 mviy\t%0,-1
kono
parents:
diff changeset
312 lhi\t%0,0
kono
parents:
diff changeset
313 lhi\t%0,-1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 llc\t%0,%1
111
kono
parents:
diff changeset
315 stc\t%1,%0
kono
parents:
diff changeset
316 stcy\t%1,%0"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RXY,RX,RXY")])
111
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 (define_insn "mov<mode>"
kono
parents:
diff changeset
320 [(set (match_operand:V_16 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, Q, d, d,d,d,d,R,T,b")
kono
parents:
diff changeset
321 (match_operand:V_16 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,jm1,j00,jm1,R,T,b,d,d,d"))]
kono
parents:
diff changeset
322 ""
kono
parents:
diff changeset
323 "@
kono
parents:
diff changeset
324 vlr\t%v0,%v1
kono
parents:
diff changeset
325 vlvgh\t%v0,%1,0
kono
parents:
diff changeset
326 vlgvh\t%0,%v1,0
kono
parents:
diff changeset
327 vleh\t%v0,%1,0
kono
parents:
diff changeset
328 vsteh\t%v1,%0,0
kono
parents:
diff changeset
329 vzero\t%v0
kono
parents:
diff changeset
330 vone\t%v0
kono
parents:
diff changeset
331 vgbm\t%v0,%t1
kono
parents:
diff changeset
332 vgm\t%v0,%s1,%e1
kono
parents:
diff changeset
333 lr\t%0,%1
kono
parents:
diff changeset
334 mvhhi\t%0,0
kono
parents:
diff changeset
335 mvhhi\t%0,-1
kono
parents:
diff changeset
336 lhi\t%0,0
kono
parents:
diff changeset
337 lhi\t%0,-1
kono
parents:
diff changeset
338 lh\t%0,%1
kono
parents:
diff changeset
339 lhy\t%0,%1
kono
parents:
diff changeset
340 lhrl\t%0,%1
kono
parents:
diff changeset
341 sth\t%1,%0
kono
parents:
diff changeset
342 sthy\t%1,%0
kono
parents:
diff changeset
343 sthrl\t%1,%0"
kono
parents:
diff changeset
344 [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SIL,SIL,RI,RI,RX,RXY,RIL,RX,RXY,RIL")])
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 (define_insn "mov<mode>"
kono
parents:
diff changeset
347 [(set (match_operand:V_32 0 "nonimmediate_operand" "=f,f,f,R,T,v,v,d,v,R, f, v, v, v, v, Q, Q, d, d,d,d,d,d,R,T,b")
kono
parents:
diff changeset
348 (match_operand:V_32 1 "general_operand" " f,R,T,f,f,v,d,v,R,v,j00,j00,jm1,jyy,jxx,j00,jm1,j00,jm1,b,d,R,T,d,d,d"))]
kono
parents:
diff changeset
349 "TARGET_VX"
kono
parents:
diff changeset
350 "@
kono
parents:
diff changeset
351 ldr\t%v0,%v1
kono
parents:
diff changeset
352 lde\t%0,%1
kono
parents:
diff changeset
353 ley\t%0,%1
kono
parents:
diff changeset
354 ste\t%1,%0
kono
parents:
diff changeset
355 stey\t%1,%0
kono
parents:
diff changeset
356 vlr\t%v0,%v1
kono
parents:
diff changeset
357 vlvgf\t%v0,%1,0
kono
parents:
diff changeset
358 vlgvf\t%0,%v1,0
kono
parents:
diff changeset
359 vlef\t%v0,%1,0
kono
parents:
diff changeset
360 vstef\t%1,%0,0
kono
parents:
diff changeset
361 lzer\t%v0
kono
parents:
diff changeset
362 vzero\t%v0
kono
parents:
diff changeset
363 vone\t%v0
kono
parents:
diff changeset
364 vgbm\t%v0,%t1
kono
parents:
diff changeset
365 vgm\t%v0,%s1,%e1
kono
parents:
diff changeset
366 mvhi\t%0,0
kono
parents:
diff changeset
367 mvhi\t%0,-1
kono
parents:
diff changeset
368 lhi\t%0,0
kono
parents:
diff changeset
369 lhi\t%0,-1
kono
parents:
diff changeset
370 lrl\t%0,%1
kono
parents:
diff changeset
371 lr\t%0,%1
kono
parents:
diff changeset
372 l\t%0,%1
kono
parents:
diff changeset
373 ly\t%0,%1
kono
parents:
diff changeset
374 st\t%1,%0
kono
parents:
diff changeset
375 sty\t%1,%0
kono
parents:
diff changeset
376 strl\t%1,%0"
kono
parents:
diff changeset
377 [(set_attr "op_type" "RR,RXE,RXY,RX,RXY,VRR,VRS,VRS,VRX,VRX,RRE,VRI,VRI,VRI,VRI,SIL,SIL,RI,RI,
kono
parents:
diff changeset
378 RIL,RR,RX,RXY,RX,RXY,RIL")])
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 (define_insn "mov<mode>"
kono
parents:
diff changeset
381 [(set (match_operand:V_64 0 "nonimmediate_operand"
kono
parents:
diff changeset
382 "=f,f,f,R,T,v,v,d,v,R, f, v, v, v, v, Q, Q, d, d,f,d,d,d,d,T,b")
kono
parents:
diff changeset
383 (match_operand:V_64 1 "general_operand"
kono
parents:
diff changeset
384 " f,R,T,f,f,v,d,v,R,v,j00,j00,jm1,jyy,jxx,j00,jm1,j00,jm1,d,f,b,d,T,d,d"))]
kono
parents:
diff changeset
385 "TARGET_ZARCH"
kono
parents:
diff changeset
386 "@
kono
parents:
diff changeset
387 ldr\t%0,%1
kono
parents:
diff changeset
388 ld\t%0,%1
kono
parents:
diff changeset
389 ldy\t%0,%1
kono
parents:
diff changeset
390 std\t%1,%0
kono
parents:
diff changeset
391 stdy\t%1,%0
kono
parents:
diff changeset
392 vlr\t%v0,%v1
kono
parents:
diff changeset
393 vlvgg\t%v0,%1,0
kono
parents:
diff changeset
394 vlgvg\t%0,%v1,0
kono
parents:
diff changeset
395 vleg\t%v0,%1,0
kono
parents:
diff changeset
396 vsteg\t%v1,%0,0
kono
parents:
diff changeset
397 lzdr\t%0
kono
parents:
diff changeset
398 vzero\t%v0
kono
parents:
diff changeset
399 vone\t%v0
kono
parents:
diff changeset
400 vgbm\t%v0,%t1
kono
parents:
diff changeset
401 vgm\t%v0,%s1,%e1
kono
parents:
diff changeset
402 mvghi\t%0,0
kono
parents:
diff changeset
403 mvghi\t%0,-1
kono
parents:
diff changeset
404 lghi\t%0,0
kono
parents:
diff changeset
405 lghi\t%0,-1
kono
parents:
diff changeset
406 ldgr\t%0,%1
kono
parents:
diff changeset
407 lgdr\t%0,%1
kono
parents:
diff changeset
408 lgrl\t%0,%1
kono
parents:
diff changeset
409 lgr\t%0,%1
kono
parents:
diff changeset
410 lg\t%0,%1
kono
parents:
diff changeset
411 stg\t%1,%0
kono
parents:
diff changeset
412 stgrl\t%1,%0"
kono
parents:
diff changeset
413 [(set_attr "op_type" "RRE,RX,RXY,RX,RXY,VRR,VRS,VRS,VRX,VRX,RRE,VRI,VRI,VRI,VRI,
kono
parents:
diff changeset
414 SIL,SIL,RI,RI,RRE,RRE,RIL,RR,RXY,RXY,RIL")])
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 ; vec_load_lanes?
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 ; vec_store_lanes?
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 ; vec_set is supposed to *modify* an existing vector so operand 0 is
kono
parents:
diff changeset
422 ; duplicated as input operand.
kono
parents:
diff changeset
423 (define_expand "vec_set<mode>"
kono
parents:
diff changeset
424 [(set (match_operand:V 0 "register_operand" "")
kono
parents:
diff changeset
425 (unspec:V [(match_operand:<non_vec> 1 "general_operand" "")
kono
parents:
diff changeset
426 (match_operand:SI 2 "nonmemory_operand" "")
kono
parents:
diff changeset
427 (match_dup 0)]
kono
parents:
diff changeset
428 UNSPEC_VEC_SET))]
kono
parents:
diff changeset
429 "TARGET_VX")
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 ; FIXME: Support also vector mode operands for 1
kono
parents:
diff changeset
432 ; FIXME: A target memory operand seems to be useful otherwise we end
kono
parents:
diff changeset
433 ; up with vl vlvgg vst. Shouldn't the middle-end be able to handle
kono
parents:
diff changeset
434 ; that itself?
kono
parents:
diff changeset
435 ; vlvgb, vlvgh, vlvgf, vlvgg, vleb, vleh, vlef, vleg, vleib, vleih, vleif, vleig
kono
parents:
diff changeset
436 (define_insn "*vec_set<mode>"
kono
parents:
diff changeset
437 [(set (match_operand:V 0 "register_operand" "=v,v,v")
kono
parents:
diff changeset
438 (unspec:V [(match_operand:<non_vec> 1 "general_operand" "d,R,K")
kono
parents:
diff changeset
439 (match_operand:SI 2 "nonmemory_operand" "an,I,I")
kono
parents:
diff changeset
440 (match_operand:V 3 "register_operand" "0,0,0")]
kono
parents:
diff changeset
441 UNSPEC_VEC_SET))]
kono
parents:
diff changeset
442 "TARGET_VX
kono
parents:
diff changeset
443 && (!CONST_INT_P (operands[2])
kono
parents:
diff changeset
444 || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
kono
parents:
diff changeset
445 "@
kono
parents:
diff changeset
446 vlvg<bhfgq>\t%v0,%1,%Y2
kono
parents:
diff changeset
447 vle<bhfgq>\t%v0,%1,%2
kono
parents:
diff changeset
448 vlei<bhfgq>\t%v0,%1,%2"
kono
parents:
diff changeset
449 [(set_attr "op_type" "VRS,VRX,VRI")])
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 ; vlvgb, vlvgh, vlvgf, vlvgg
kono
parents:
diff changeset
452 (define_insn "*vec_set<mode>_plus"
kono
parents:
diff changeset
453 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
454 (unspec:V [(match_operand:<non_vec> 1 "general_operand" "d")
kono
parents:
diff changeset
455 (plus:SI (match_operand:SI 2 "register_operand" "a")
kono
parents:
diff changeset
456 (match_operand:SI 4 "const_int_operand" "n"))
kono
parents:
diff changeset
457 (match_operand:V 3 "register_operand" "0")]
kono
parents:
diff changeset
458 UNSPEC_VEC_SET))]
kono
parents:
diff changeset
459 "TARGET_VX"
kono
parents:
diff changeset
460 "vlvg<bhfgq>\t%v0,%1,%Y4(%2)"
kono
parents:
diff changeset
461 [(set_attr "op_type" "VRS")])
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 ; FIXME: Support also vector mode operands for 0
kono
parents:
diff changeset
465 ; FIXME: This should be (vec_select ..) or something but it does only allow constant selectors :(
kono
parents:
diff changeset
466 ; This is used via RTL standard name as well as for expanding the builtin
kono
parents:
diff changeset
467 (define_expand "vec_extract<mode><non_vec_l>"
kono
parents:
diff changeset
468 [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "")
kono
parents:
diff changeset
469 (unspec:<non_vec> [(match_operand:V 1 "register_operand" "")
kono
parents:
diff changeset
470 (match_operand:SI 2 "nonmemory_operand" "")]
kono
parents:
diff changeset
471 UNSPEC_VEC_EXTRACT))]
kono
parents:
diff changeset
472 "TARGET_VX")
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 ; vlgvb, vlgvh, vlgvf, vlgvg, vsteb, vsteh, vstef, vsteg
kono
parents:
diff changeset
475 (define_insn "*vec_extract<mode>"
kono
parents:
diff changeset
476 [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R")
kono
parents:
diff changeset
477 (unspec:<non_vec> [(match_operand:V 1 "register_operand" "v,v")
kono
parents:
diff changeset
478 (match_operand:SI 2 "nonmemory_operand" "an,I")]
kono
parents:
diff changeset
479 UNSPEC_VEC_EXTRACT))]
kono
parents:
diff changeset
480 "TARGET_VX
kono
parents:
diff changeset
481 && (!CONST_INT_P (operands[2])
kono
parents:
diff changeset
482 || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
kono
parents:
diff changeset
483 "@
kono
parents:
diff changeset
484 vlgv<bhfgq>\t%0,%v1,%Y2
kono
parents:
diff changeset
485 vste<bhfgq>\t%v1,%0,%2"
kono
parents:
diff changeset
486 [(set_attr "op_type" "VRS,VRX")])
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 ; vlgvb, vlgvh, vlgvf, vlgvg
kono
parents:
diff changeset
489 (define_insn "*vec_extract<mode>_plus"
kono
parents:
diff changeset
490 [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d")
kono
parents:
diff changeset
491 (unspec:<non_vec> [(match_operand:V 1 "register_operand" "v")
kono
parents:
diff changeset
492 (plus:SI (match_operand:SI 2 "nonmemory_operand" "a")
kono
parents:
diff changeset
493 (match_operand:SI 3 "const_int_operand" "n"))]
kono
parents:
diff changeset
494 UNSPEC_VEC_EXTRACT))]
kono
parents:
diff changeset
495 "TARGET_VX"
kono
parents:
diff changeset
496 "vlgv<bhfgq>\t%0,%v1,%Y3(%2)"
kono
parents:
diff changeset
497 [(set_attr "op_type" "VRS")])
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 (define_expand "vec_init<mode><non_vec_l>"
kono
parents:
diff changeset
500 [(match_operand:V_128 0 "register_operand" "")
kono
parents:
diff changeset
501 (match_operand:V_128 1 "nonmemory_operand" "")]
kono
parents:
diff changeset
502 "TARGET_VX"
kono
parents:
diff changeset
503 {
kono
parents:
diff changeset
504 s390_expand_vec_init (operands[0], operands[1]);
kono
parents:
diff changeset
505 DONE;
kono
parents:
diff changeset
506 })
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 (define_insn "*vec_vllezlf<mode>"
kono
parents:
diff changeset
509 [(set (match_operand:VI_HW_4 0 "register_operand" "=v")
kono
parents:
diff changeset
510 (vec_concat:VI_HW_4
kono
parents:
diff changeset
511 (vec_concat:<vec_halfnumelts>
kono
parents:
diff changeset
512 (match_operand:<non_vec> 1 "memory_operand" "R")
kono
parents:
diff changeset
513 (const_int 0))
kono
parents:
diff changeset
514 (vec_concat:<vec_halfnumelts>
kono
parents:
diff changeset
515 (const_int 0)
kono
parents:
diff changeset
516 (const_int 0))))]
kono
parents:
diff changeset
517 "TARGET_VXE"
kono
parents:
diff changeset
518 "vllezlf\t%v0,%1"
kono
parents:
diff changeset
519 [(set_attr "op_type" "VRX")])
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 ; Replicate from vector element
kono
parents:
diff changeset
522 ; vrepb, vreph, vrepf, vrepg
kono
parents:
diff changeset
523 (define_insn "*vec_splat<mode>"
kono
parents:
diff changeset
524 [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "=v")
kono
parents:
diff changeset
525 (vec_duplicate:V_128_NOSINGLE
kono
parents:
diff changeset
526 (vec_select:<non_vec>
kono
parents:
diff changeset
527 (match_operand:V_128_NOSINGLE 1 "register_operand" "v")
kono
parents:
diff changeset
528 (parallel
kono
parents:
diff changeset
529 [(match_operand:QI 2 "const_mask_operand" "C")]))))]
kono
parents:
diff changeset
530 "TARGET_VX && UINTVAL (operands[2]) < GET_MODE_NUNITS (<MODE>mode)"
kono
parents:
diff changeset
531 "vrep<bhfgq>\t%v0,%v1,%2"
kono
parents:
diff changeset
532 [(set_attr "op_type" "VRI")])
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 ; vlrepb, vlreph, vlrepf, vlrepg, vrepib, vrepih, vrepif, vrepig, vrepb, vreph, vrepf, vrepg
kono
parents:
diff changeset
535 (define_insn "*vec_splats<mode>"
kono
parents:
diff changeset
536 [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "=v,v,v,v")
kono
parents:
diff changeset
537 (vec_duplicate:V_128_NOSINGLE (match_operand:<non_vec> 1 "general_operand" " R,K,v,d")))]
kono
parents:
diff changeset
538 "TARGET_VX"
kono
parents:
diff changeset
539 "@
kono
parents:
diff changeset
540 vlrep<bhfgq>\t%v0,%1
kono
parents:
diff changeset
541 vrepi<bhfgq>\t%v0,%h1
kono
parents:
diff changeset
542 vrep<bhfgq>\t%v0,%v1,0
kono
parents:
diff changeset
543 #"
kono
parents:
diff changeset
544 [(set_attr "op_type" "VRX,VRI,VRI,*")])
kono
parents:
diff changeset
545
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
546 ; vlbrreph, vlbrrepf, vlbrrepg
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547 (define_insn "*vec_splats_bswap_vec<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548 [(set (match_operand:V_HW_HSD 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 (bswap:V_HW_HSD
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
550 (vec_duplicate:V_HW_HSD (match_operand:<non_vec> 1 "memory_operand" "R"))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551 (use (match_operand:V16QI 2 "permute_pattern_operand" "X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 "TARGET_VXE2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 "vlbrrep<bhfgq>\t%v0,%1"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554 [(set_attr "op_type" "VRX")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 ; Why do we need both? Shouldn't there be a canonical form?
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557 ; vlbrreph, vlbrrepf, vlbrrepg
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 (define_insn "*vec_splats_bswap_elem<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 [(set (match_operand:V_HW_HSD 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 (vec_duplicate:V_HW_HSD
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 (bswap:<non_vec> (match_operand:<non_vec> 1 "memory_operand" "R"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 "TARGET_VXE2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 "vlbrrep<bhfgq>\t%v0,%1"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 [(set_attr "op_type" "VRX")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565
111
kono
parents:
diff changeset
566 ; A TFmode operand resides in FPR register pairs while V1TF is in a
kono
parents:
diff changeset
567 ; single vector register.
kono
parents:
diff changeset
568 (define_insn "*vec_tf_to_v1tf"
kono
parents:
diff changeset
569 [(set (match_operand:V1TF 0 "nonimmediate_operand" "=v,v,R,v,v")
kono
parents:
diff changeset
570 (vec_duplicate:V1TF (match_operand:TF 1 "general_operand" "v,R,v,G,d")))]
kono
parents:
diff changeset
571 "TARGET_VX"
kono
parents:
diff changeset
572 "@
kono
parents:
diff changeset
573 vmrhg\t%v0,%1,%N1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
574 vl\t%v0,%1%A1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
575 vst\t%v1,%0%A0
111
kono
parents:
diff changeset
576 vzero\t%v0
kono
parents:
diff changeset
577 vlvgp\t%v0,%1,%N1"
kono
parents:
diff changeset
578 [(set_attr "op_type" "VRR,VRX,VRX,VRI,VRR")])
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 (define_insn "*vec_ti_to_v1ti"
kono
parents:
diff changeset
581 [(set (match_operand:V1TI 0 "nonimmediate_operand" "=v,v,R, v, v,v")
kono
parents:
diff changeset
582 (vec_duplicate:V1TI (match_operand:TI 1 "general_operand" "v,R,v,j00,jm1,d")))]
kono
parents:
diff changeset
583 "TARGET_VX"
kono
parents:
diff changeset
584 "@
kono
parents:
diff changeset
585 vlr\t%v0,%v1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 vl\t%v0,%1%A1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 vst\t%v1,%0%A0
111
kono
parents:
diff changeset
588 vzero\t%v0
kono
parents:
diff changeset
589 vone\t%v0
kono
parents:
diff changeset
590 vlvgp\t%v0,%1,%N1"
kono
parents:
diff changeset
591 [(set_attr "op_type" "VRR,VRX,VRX,VRI,VRI,VRR")])
kono
parents:
diff changeset
592
kono
parents:
diff changeset
593 ; vec_splats is supposed to replicate op1 into all elements of op0
kono
parents:
diff changeset
594 ; This splitter first sets the rightmost element of op0 to op1 and
kono
parents:
diff changeset
595 ; then does a vec_splat to replicate that element into all other
kono
parents:
diff changeset
596 ; elements.
kono
parents:
diff changeset
597 (define_split
kono
parents:
diff changeset
598 [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "")
kono
parents:
diff changeset
599 (vec_duplicate:V_128_NOSINGLE (match_operand:<non_vec> 1 "register_operand" "")))]
kono
parents:
diff changeset
600 "TARGET_VX && GENERAL_REG_P (operands[1])"
kono
parents:
diff changeset
601 [(set (match_dup 0)
kono
parents:
diff changeset
602 (unspec:V_128_NOSINGLE [(match_dup 1) (match_dup 2) (match_dup 0)] UNSPEC_VEC_SET))
kono
parents:
diff changeset
603 (set (match_dup 0)
kono
parents:
diff changeset
604 (vec_duplicate:V_128_NOSINGLE
kono
parents:
diff changeset
605 (vec_select:<non_vec>
kono
parents:
diff changeset
606 (match_dup 0) (parallel [(match_dup 2)]))))]
kono
parents:
diff changeset
607 {
kono
parents:
diff changeset
608 operands[2] = GEN_INT (GET_MODE_NUNITS (<MODE>mode) - 1);
kono
parents:
diff changeset
609 })
kono
parents:
diff changeset
610
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 (define_predicate "vcond_comparison_operator"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 (match_operand 0 "comparison_operator")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614 if (!HONOR_NANS (GET_MODE (XEXP (op, 0)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 && !HONOR_NANS (GET_MODE (XEXP (op, 1))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 switch (GET_CODE (op))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 case LE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 case LT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 case GE:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 case GT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 case LTGT:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624 /* Signaling vector comparisons are supported only on z14+. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 return TARGET_Z14;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
628 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 })
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630
111
kono
parents:
diff changeset
631 (define_expand "vcond<V_HW:mode><V_HW2:mode>"
kono
parents:
diff changeset
632 [(set (match_operand:V_HW 0 "register_operand" "")
kono
parents:
diff changeset
633 (if_then_else:V_HW
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 (match_operator 3 "vcond_comparison_operator"
111
kono
parents:
diff changeset
635 [(match_operand:V_HW2 4 "register_operand" "")
kono
parents:
diff changeset
636 (match_operand:V_HW2 5 "nonmemory_operand" "")])
kono
parents:
diff changeset
637 (match_operand:V_HW 1 "nonmemory_operand" "")
kono
parents:
diff changeset
638 (match_operand:V_HW 2 "nonmemory_operand" "")))]
kono
parents:
diff changeset
639 "TARGET_VX && GET_MODE_NUNITS (<V_HW:MODE>mode) == GET_MODE_NUNITS (<V_HW2:MODE>mode)"
kono
parents:
diff changeset
640 {
kono
parents:
diff changeset
641 s390_expand_vcond (operands[0], operands[1], operands[2],
kono
parents:
diff changeset
642 GET_CODE (operands[3]), operands[4], operands[5]);
kono
parents:
diff changeset
643 DONE;
kono
parents:
diff changeset
644 })
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 (define_expand "vcondu<V_HW:mode><V_HW2:mode>"
kono
parents:
diff changeset
647 [(set (match_operand:V_HW 0 "register_operand" "")
kono
parents:
diff changeset
648 (if_then_else:V_HW
kono
parents:
diff changeset
649 (match_operator 3 "comparison_operator"
kono
parents:
diff changeset
650 [(match_operand:V_HW2 4 "register_operand" "")
kono
parents:
diff changeset
651 (match_operand:V_HW2 5 "nonmemory_operand" "")])
kono
parents:
diff changeset
652 (match_operand:V_HW 1 "nonmemory_operand" "")
kono
parents:
diff changeset
653 (match_operand:V_HW 2 "nonmemory_operand" "")))]
kono
parents:
diff changeset
654 "TARGET_VX && GET_MODE_NUNITS (<V_HW:MODE>mode) == GET_MODE_NUNITS (<V_HW2:MODE>mode)"
kono
parents:
diff changeset
655 {
kono
parents:
diff changeset
656 s390_expand_vcond (operands[0], operands[1], operands[2],
kono
parents:
diff changeset
657 GET_CODE (operands[3]), operands[4], operands[5]);
kono
parents:
diff changeset
658 DONE;
kono
parents:
diff changeset
659 })
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 ; We only have HW support for byte vectors. The middle-end is
kono
parents:
diff changeset
662 ; supposed to lower the mode if required.
kono
parents:
diff changeset
663 (define_insn "vec_permv16qi"
kono
parents:
diff changeset
664 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
665 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
666 (match_operand:V16QI 2 "register_operand" "v")
kono
parents:
diff changeset
667 (match_operand:V16QI 3 "register_operand" "v")]
kono
parents:
diff changeset
668 UNSPEC_VEC_PERM))]
kono
parents:
diff changeset
669 "TARGET_VX"
kono
parents:
diff changeset
670 "vperm\t%v0,%v1,%v2,%v3"
kono
parents:
diff changeset
671 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
672
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 (define_insn "*vec_perm<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674 [(set (match_operand:VT_HW 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 (subreg:VT_HW (unspec:V16QI [(subreg:V16QI (match_operand:VT_HW 1 "register_operand" "v") 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 (subreg:V16QI (match_operand:VT_HW 2 "register_operand" "v") 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
677 (match_operand:V16QI 3 "register_operand" "v")]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
678 UNSPEC_VEC_PERM) 0))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
679 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680 "vperm\t%v0,%v1,%v2,%v3"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
681 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683
111
kono
parents:
diff changeset
684 ; vec_perm_const for V2DI using vpdi?
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 ;;
kono
parents:
diff changeset
687 ;; Vector integer arithmetic instructions
kono
parents:
diff changeset
688 ;;
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 ; vab, vah, vaf, vag, vaq
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 ; We use nonimmediate_operand instead of register_operand since it is
kono
parents:
diff changeset
693 ; better to have the reloads into VRs instead of splitting the
kono
parents:
diff changeset
694 ; operation into two DImode ADDs.
kono
parents:
diff changeset
695 (define_insn "<ti*>add<mode>3"
kono
parents:
diff changeset
696 [(set (match_operand:VIT 0 "nonimmediate_operand" "=v")
kono
parents:
diff changeset
697 (plus:VIT (match_operand:VIT 1 "nonimmediate_operand" "%v")
kono
parents:
diff changeset
698 (match_operand:VIT 2 "general_operand" "v")))]
kono
parents:
diff changeset
699 "TARGET_VX"
kono
parents:
diff changeset
700 "va<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
701 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 ; vsb, vsh, vsf, vsg, vsq
kono
parents:
diff changeset
704 (define_insn "<ti*>sub<mode>3"
kono
parents:
diff changeset
705 [(set (match_operand:VIT 0 "nonimmediate_operand" "=v")
kono
parents:
diff changeset
706 (minus:VIT (match_operand:VIT 1 "nonimmediate_operand" "v")
kono
parents:
diff changeset
707 (match_operand:VIT 2 "general_operand" "v")))]
kono
parents:
diff changeset
708 "TARGET_VX"
kono
parents:
diff changeset
709 "vs<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
710 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 ; vmlb, vmlhw, vmlf
kono
parents:
diff changeset
713 (define_insn "mul<mode>3"
kono
parents:
diff changeset
714 [(set (match_operand:VI_QHS 0 "register_operand" "=v")
kono
parents:
diff changeset
715 (mult:VI_QHS (match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
716 (match_operand:VI_QHS 2 "register_operand" "v")))]
kono
parents:
diff changeset
717 "TARGET_VX"
kono
parents:
diff changeset
718 "vml<bhfgq><w>\t%v0,%v1,%v2"
kono
parents:
diff changeset
719 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 ; vlcb, vlch, vlcf, vlcg
kono
parents:
diff changeset
722 (define_insn "neg<mode>2"
kono
parents:
diff changeset
723 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
724 (neg:VI (match_operand:VI 1 "register_operand" "v")))]
kono
parents:
diff changeset
725 "TARGET_VX"
kono
parents:
diff changeset
726 "vlc<bhfgq>\t%v0,%v1"
kono
parents:
diff changeset
727 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
728
kono
parents:
diff changeset
729 ; vlpb, vlph, vlpf, vlpg
kono
parents:
diff changeset
730 (define_insn "abs<mode>2"
kono
parents:
diff changeset
731 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
732 (abs:VI (match_operand:VI 1 "register_operand" "v")))]
kono
parents:
diff changeset
733 "TARGET_VX"
kono
parents:
diff changeset
734 "vlp<bhfgq>\t%v0,%v1"
kono
parents:
diff changeset
735 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 ; Vector sum across
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 ; Sum across DImode parts of the 1st operand and add the rightmost
kono
parents:
diff changeset
741 ; element of 2nd operand
kono
parents:
diff changeset
742 ; vsumgh, vsumgf
kono
parents:
diff changeset
743 (define_insn "*vec_sum2<mode>"
kono
parents:
diff changeset
744 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
745 (unspec:V2DI [(match_operand:VI_HW_HS 1 "register_operand" "v")
kono
parents:
diff changeset
746 (match_operand:VI_HW_HS 2 "register_operand" "v")]
kono
parents:
diff changeset
747 UNSPEC_VEC_VSUMG))]
kono
parents:
diff changeset
748 "TARGET_VX"
kono
parents:
diff changeset
749 "vsumg<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
750 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 ; vsumb, vsumh
kono
parents:
diff changeset
753 (define_insn "*vec_sum4<mode>"
kono
parents:
diff changeset
754 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
755 (unspec:V4SI [(match_operand:VI_HW_QH 1 "register_operand" "v")
kono
parents:
diff changeset
756 (match_operand:VI_HW_QH 2 "register_operand" "v")]
kono
parents:
diff changeset
757 UNSPEC_VEC_VSUM))]
kono
parents:
diff changeset
758 "TARGET_VX"
kono
parents:
diff changeset
759 "vsum<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
760 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 ;;
kono
parents:
diff changeset
763 ;; Vector bit instructions (int + fp)
kono
parents:
diff changeset
764 ;;
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 ; Vector and
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 (define_insn "and<mode>3"
kono
parents:
diff changeset
769 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
770 (and:VT (match_operand:VT 1 "register_operand" "%v")
kono
parents:
diff changeset
771 (match_operand:VT 2 "register_operand" "v")))]
kono
parents:
diff changeset
772 "TARGET_VX"
kono
parents:
diff changeset
773 "vn\t%v0,%v1,%v2"
kono
parents:
diff changeset
774 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 ; Vector not and
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 (define_insn "notand<mode>3"
kono
parents:
diff changeset
779 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
780 (ior:VT (not:VT (match_operand:VT 1 "register_operand" "%v"))
kono
parents:
diff changeset
781 (not:VT (match_operand:VT 2 "register_operand" "v"))))]
kono
parents:
diff changeset
782 "TARGET_VXE"
kono
parents:
diff changeset
783 "vnn\t%v0,%v1,%v2"
kono
parents:
diff changeset
784 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 ; Vector or
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 (define_insn "ior<mode>3"
kono
parents:
diff changeset
789 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
790 (ior:VT (match_operand:VT 1 "register_operand" "%v")
kono
parents:
diff changeset
791 (match_operand:VT 2 "register_operand" "v")))]
kono
parents:
diff changeset
792 "TARGET_VX"
kono
parents:
diff changeset
793 "vo\t%v0,%v1,%v2"
kono
parents:
diff changeset
794 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 ; Vector or with complement
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 (define_insn "ior_not<mode>3"
kono
parents:
diff changeset
799 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
800 (ior:VT (not:VT (match_operand:VT 2 "register_operand" "v"))
kono
parents:
diff changeset
801 (match_operand:VT 1 "register_operand" "%v")))]
kono
parents:
diff changeset
802 "TARGET_VXE"
kono
parents:
diff changeset
803 "voc\t%v0,%v1,%v2"
kono
parents:
diff changeset
804 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 ; Vector xor
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 (define_insn "xor<mode>3"
kono
parents:
diff changeset
809 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
810 (xor:VT (match_operand:VT 1 "register_operand" "%v")
kono
parents:
diff changeset
811 (match_operand:VT 2 "register_operand" "v")))]
kono
parents:
diff changeset
812 "TARGET_VX"
kono
parents:
diff changeset
813 "vx\t%v0,%v1,%v2"
kono
parents:
diff changeset
814 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 ; Vector not xor
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 (define_insn "notxor<mode>3"
kono
parents:
diff changeset
819 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
820 (not:VT (xor:VT (match_operand:VT 1 "register_operand" "%v")
kono
parents:
diff changeset
821 (match_operand:VT 2 "register_operand" "v"))))]
kono
parents:
diff changeset
822 "TARGET_VXE"
kono
parents:
diff changeset
823 "vnx\t%v0,%v1,%v2"
kono
parents:
diff changeset
824 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 ; Bitwise inversion of a vector
kono
parents:
diff changeset
827 (define_insn "one_cmpl<mode>2"
kono
parents:
diff changeset
828 [(set (match_operand:VT 0 "register_operand" "=v")
kono
parents:
diff changeset
829 (not:VT (match_operand:VT 1 "register_operand" "v")))]
kono
parents:
diff changeset
830 "TARGET_VX"
kono
parents:
diff changeset
831 "vnot\t%v0,%v1"
kono
parents:
diff changeset
832 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 ; Vector population count
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 (define_expand "popcount<mode>2"
kono
parents:
diff changeset
837 [(set (match_operand:VI_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
838 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v")]
kono
parents:
diff changeset
839 UNSPEC_POPCNT))]
kono
parents:
diff changeset
840 "TARGET_VX"
kono
parents:
diff changeset
841 {
kono
parents:
diff changeset
842 if (TARGET_VXE)
kono
parents:
diff changeset
843 emit_insn (gen_popcount<mode>2_vxe (operands[0], operands[1]));
kono
parents:
diff changeset
844 else
kono
parents:
diff changeset
845 emit_insn (gen_popcount<mode>2_vx (operands[0], operands[1]));
kono
parents:
diff changeset
846 DONE;
kono
parents:
diff changeset
847 })
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 ; vpopctb, vpopcth, vpopctf, vpopctg
kono
parents:
diff changeset
850 (define_insn "popcount<mode>2_vxe"
kono
parents:
diff changeset
851 [(set (match_operand:VI_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
852 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v")]
kono
parents:
diff changeset
853 UNSPEC_POPCNT))]
kono
parents:
diff changeset
854 "TARGET_VXE"
kono
parents:
diff changeset
855 "vpopct<bhfgq>\t%v0,%v1"
kono
parents:
diff changeset
856 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 (define_insn "popcountv16qi2_vx"
kono
parents:
diff changeset
859 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
860 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")]
kono
parents:
diff changeset
861 UNSPEC_POPCNT))]
kono
parents:
diff changeset
862 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
863 "vpopct\t%v0,%v1,0"
kono
parents:
diff changeset
864 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
865
kono
parents:
diff changeset
866 ; vpopct only counts bits in byte elements. Bigger element sizes need
kono
parents:
diff changeset
867 ; to be emulated. Word and doubleword elements can use the sum across
kono
parents:
diff changeset
868 ; instructions. For halfword sized elements we do a shift of a copy
kono
parents:
diff changeset
869 ; of the result, add it to the result and extend it to halfword
kono
parents:
diff changeset
870 ; element size (unpack).
kono
parents:
diff changeset
871
kono
parents:
diff changeset
872 (define_expand "popcountv8hi2_vx"
kono
parents:
diff changeset
873 [(set (match_dup 2)
kono
parents:
diff changeset
874 (unspec:V16QI [(subreg:V16QI (match_operand:V8HI 1 "register_operand" "v") 0)]
kono
parents:
diff changeset
875 UNSPEC_POPCNT))
kono
parents:
diff changeset
876 ; Make a copy of the result
kono
parents:
diff changeset
877 (set (match_dup 3) (match_dup 2))
kono
parents:
diff changeset
878 ; Generate the shift count operand in a VR (8->byte 7)
kono
parents:
diff changeset
879 (set (match_dup 4) (match_dup 5))
kono
parents:
diff changeset
880 (set (match_dup 4) (unspec:V16QI [(const_int 8)
kono
parents:
diff changeset
881 (const_int 7)
kono
parents:
diff changeset
882 (match_dup 4)] UNSPEC_VEC_SET))
kono
parents:
diff changeset
883 ; Vector shift right logical by one byte
kono
parents:
diff changeset
884 (set (match_dup 3)
kono
parents:
diff changeset
885 (unspec:V16QI [(match_dup 3) (match_dup 4)] UNSPEC_VEC_SRLB))
kono
parents:
diff changeset
886 ; Add the shifted and the original result
kono
parents:
diff changeset
887 (set (match_dup 2)
kono
parents:
diff changeset
888 (plus:V16QI (match_dup 2) (match_dup 3)))
kono
parents:
diff changeset
889 ; Generate mask for the odd numbered byte elements
kono
parents:
diff changeset
890 (set (match_dup 3)
kono
parents:
diff changeset
891 (const_vector:V16QI [(const_int 0) (const_int 255)
kono
parents:
diff changeset
892 (const_int 0) (const_int 255)
kono
parents:
diff changeset
893 (const_int 0) (const_int 255)
kono
parents:
diff changeset
894 (const_int 0) (const_int 255)
kono
parents:
diff changeset
895 (const_int 0) (const_int 255)
kono
parents:
diff changeset
896 (const_int 0) (const_int 255)
kono
parents:
diff changeset
897 (const_int 0) (const_int 255)
kono
parents:
diff changeset
898 (const_int 0) (const_int 255)]))
kono
parents:
diff changeset
899 ; Zero out the even indexed bytes
kono
parents:
diff changeset
900 (set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
901 (and:V8HI (subreg:V8HI (match_dup 2) 0)
kono
parents:
diff changeset
902 (subreg:V8HI (match_dup 3) 0)))
kono
parents:
diff changeset
903 ]
kono
parents:
diff changeset
904 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
905 {
kono
parents:
diff changeset
906 operands[2] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
907 operands[3] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
908 operands[4] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
909 operands[5] = CONST0_RTX (V16QImode);
kono
parents:
diff changeset
910 })
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 (define_expand "popcountv4si2_vx"
kono
parents:
diff changeset
913 [(set (match_dup 2)
kono
parents:
diff changeset
914 (unspec:V16QI [(subreg:V16QI (match_operand:V4SI 1 "register_operand" "v") 0)]
kono
parents:
diff changeset
915 UNSPEC_POPCNT))
kono
parents:
diff changeset
916 (set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
917 (unspec:V4SI [(match_dup 2) (match_dup 3)]
kono
parents:
diff changeset
918 UNSPEC_VEC_VSUM))]
kono
parents:
diff changeset
919 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
920 {
kono
parents:
diff changeset
921 operands[2] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
922 operands[3] = force_reg (V16QImode, CONST0_RTX (V16QImode));
kono
parents:
diff changeset
923 })
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 (define_expand "popcountv2di2_vx"
kono
parents:
diff changeset
926 [(set (match_dup 2)
kono
parents:
diff changeset
927 (unspec:V16QI [(subreg:V16QI (match_operand:V2DI 1 "register_operand" "v") 0)]
kono
parents:
diff changeset
928 UNSPEC_POPCNT))
kono
parents:
diff changeset
929 (set (match_dup 3)
kono
parents:
diff changeset
930 (unspec:V4SI [(match_dup 2) (match_dup 4)]
kono
parents:
diff changeset
931 UNSPEC_VEC_VSUM))
kono
parents:
diff changeset
932 (set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
933 (unspec:V2DI [(match_dup 3) (match_dup 5)]
kono
parents:
diff changeset
934 UNSPEC_VEC_VSUMG))]
kono
parents:
diff changeset
935 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
936 {
kono
parents:
diff changeset
937 operands[2] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
938 operands[3] = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
939 operands[4] = force_reg (V16QImode, CONST0_RTX (V16QImode));
kono
parents:
diff changeset
940 operands[5] = force_reg (V4SImode, CONST0_RTX (V4SImode));
kono
parents:
diff changeset
941 })
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 ; Count leading zeros
kono
parents:
diff changeset
944 ; vclzb, vclzh, vclzf, vclzg
kono
parents:
diff changeset
945 (define_insn "clz<mode>2"
kono
parents:
diff changeset
946 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
947 (clz:V (match_operand:V 1 "register_operand" "v")))]
kono
parents:
diff changeset
948 "TARGET_VX"
kono
parents:
diff changeset
949 "vclz<bhfgq>\t%v0,%v1"
kono
parents:
diff changeset
950 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
951
kono
parents:
diff changeset
952 ; Count trailing zeros
kono
parents:
diff changeset
953 ; vctzb, vctzh, vctzf, vctzg
kono
parents:
diff changeset
954 (define_insn "ctz<mode>2"
kono
parents:
diff changeset
955 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
956 (ctz:V (match_operand:V 1 "register_operand" "v")))]
kono
parents:
diff changeset
957 "TARGET_VX"
kono
parents:
diff changeset
958 "vctz<bhfgq>\t%v0,%v1"
kono
parents:
diff changeset
959 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962
kono
parents:
diff changeset
963 ; Each vector element rotated by the corresponding vector element
kono
parents:
diff changeset
964 ; verllvb, verllvh, verllvf, verllvg
kono
parents:
diff changeset
965 (define_insn "vrotl<mode>3"
kono
parents:
diff changeset
966 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
967 (rotate:VI (match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
968 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
969 "TARGET_VX"
kono
parents:
diff changeset
970 "verllv<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
971 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973
kono
parents:
diff changeset
974 ; Vector rotate and shift by scalar instructions
kono
parents:
diff changeset
975
kono
parents:
diff changeset
976 (define_code_iterator VEC_SHIFTS [ashift ashiftrt lshiftrt rotate])
kono
parents:
diff changeset
977 (define_code_attr vec_shifts_name [(ashift "ashl") (ashiftrt "ashr")
kono
parents:
diff changeset
978 (lshiftrt "lshr") (rotate "rotl")])
kono
parents:
diff changeset
979 (define_code_attr vec_shifts_mnem [(ashift "vesl") (ashiftrt "vesra")
kono
parents:
diff changeset
980 (lshiftrt "vesrl") (rotate "verll")])
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 ; Each vector element rotated by a scalar
kono
parents:
diff changeset
983 (define_expand "<vec_shifts_name><mode>3"
kono
parents:
diff changeset
984 [(set (match_operand:VI 0 "register_operand" "")
kono
parents:
diff changeset
985 (VEC_SHIFTS:VI (match_operand:VI 1 "register_operand" "")
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
986 (match_operand:QI 2 "shift_count_operand" "")))]
111
kono
parents:
diff changeset
987 "TARGET_VX")
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 ; verllb, verllh, verllf, verllg
kono
parents:
diff changeset
990 ; veslb, veslh, veslf, veslg
kono
parents:
diff changeset
991 ; vesrab, vesrah, vesraf, vesrag
kono
parents:
diff changeset
992 ; vesrlb, vesrlh, vesrlf, vesrlg
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
993 (define_insn "*<vec_shifts_name><mode>3"
111
kono
parents:
diff changeset
994 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
995 (VEC_SHIFTS:VI (match_operand:VI 1 "register_operand" "v")
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
996 (match_operand:QI 2 "shift_count_operand_vec" "jsc")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
997 "TARGET_VX
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
998 && s390_valid_shift_count (operands[2],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
999 GET_MODE_BITSIZE (GET_MODE_INNER (<MODE>mode)) - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1000 "
111
kono
parents:
diff changeset
1001 "<vec_shifts_mnem><bhfgq>\t%v0,%v1,%Y2"
kono
parents:
diff changeset
1002 [(set_attr "op_type" "VRS")])
kono
parents:
diff changeset
1003
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1004
111
kono
parents:
diff changeset
1005 ; Shift each element by corresponding vector element
kono
parents:
diff changeset
1006
kono
parents:
diff changeset
1007 ; veslvb, veslvh, veslvf, veslvg
kono
parents:
diff changeset
1008 (define_insn "vashl<mode>3"
kono
parents:
diff changeset
1009 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1010 (ashift:VI (match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
1011 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1012 "TARGET_VX"
kono
parents:
diff changeset
1013 "veslv<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1014 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1015
kono
parents:
diff changeset
1016 ; vesravb, vesravh, vesravf, vesravg
kono
parents:
diff changeset
1017 (define_insn "vashr<mode>3"
kono
parents:
diff changeset
1018 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1019 (ashiftrt:VI (match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
1020 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1021 "TARGET_VX"
kono
parents:
diff changeset
1022 "vesrav<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1023 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1024
kono
parents:
diff changeset
1025 ; vesrlvb, vesrlvh, vesrlvf, vesrlvg
kono
parents:
diff changeset
1026 (define_insn "vlshr<mode>3"
kono
parents:
diff changeset
1027 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1028 (lshiftrt:VI (match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
1029 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1030 "TARGET_VX"
kono
parents:
diff changeset
1031 "vesrlv<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1032 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1033
kono
parents:
diff changeset
1034 ; Vector shift right logical by byte
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 ; Pattern used by e.g. popcount
kono
parents:
diff changeset
1037 (define_insn "*vec_srb<mode>"
kono
parents:
diff changeset
1038 [(set (match_operand:V_128 0 "register_operand" "=v")
kono
parents:
diff changeset
1039 (unspec:V_128 [(match_operand:V_128 1 "register_operand" "v")
kono
parents:
diff changeset
1040 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1041 UNSPEC_VEC_SRLB))]
kono
parents:
diff changeset
1042 "TARGET_VX"
kono
parents:
diff changeset
1043 "vsrlb\t%v0,%v1,%v2"
kono
parents:
diff changeset
1044 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1045
kono
parents:
diff changeset
1046
kono
parents:
diff changeset
1047 ; Vector shift left by byte
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 (define_insn "*vec_slb<mode>"
kono
parents:
diff changeset
1050 [(set (match_operand:V_128 0 "register_operand" "=v")
kono
parents:
diff changeset
1051 (unspec:V_128 [(match_operand:V_128 1 "register_operand" "v")
kono
parents:
diff changeset
1052 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1053 UNSPEC_VEC_SLB))]
kono
parents:
diff changeset
1054 "TARGET_VX"
kono
parents:
diff changeset
1055 "vslb\t%v0,%v1,%v2"
kono
parents:
diff changeset
1056 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1057
kono
parents:
diff changeset
1058 ; vec_shr is defined as shift towards element 0
kono
parents:
diff changeset
1059 ; this means it is a left shift on BE targets!
kono
parents:
diff changeset
1060 (define_expand "vec_shr_<mode>"
kono
parents:
diff changeset
1061 [(set (match_dup 3)
kono
parents:
diff changeset
1062 (unspec:V16QI [(match_operand:SI 2 "const_shift_by_byte_operand" "")
kono
parents:
diff changeset
1063 (const_int 7)
kono
parents:
diff changeset
1064 (match_dup 3)]
kono
parents:
diff changeset
1065 UNSPEC_VEC_SET))
kono
parents:
diff changeset
1066 (set (match_operand:V_128 0 "register_operand" "")
kono
parents:
diff changeset
1067 (unspec:V_128 [(match_operand:V_128 1 "register_operand" "")
kono
parents:
diff changeset
1068 (match_dup 3)]
kono
parents:
diff changeset
1069 UNSPEC_VEC_SLB))]
kono
parents:
diff changeset
1070 "TARGET_VX"
kono
parents:
diff changeset
1071 {
kono
parents:
diff changeset
1072 operands[3] = gen_reg_rtx(V16QImode);
kono
parents:
diff changeset
1073 })
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 ; vmnb, vmnh, vmnf, vmng
kono
parents:
diff changeset
1076 (define_insn "smin<mode>3"
kono
parents:
diff changeset
1077 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1078 (smin:VI (match_operand:VI 1 "register_operand" "%v")
kono
parents:
diff changeset
1079 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1080 "TARGET_VX"
kono
parents:
diff changeset
1081 "vmn<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1082 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1083
kono
parents:
diff changeset
1084 ; vmxb, vmxh, vmxf, vmxg
kono
parents:
diff changeset
1085 (define_insn "smax<mode>3"
kono
parents:
diff changeset
1086 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1087 (smax:VI (match_operand:VI 1 "register_operand" "%v")
kono
parents:
diff changeset
1088 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1089 "TARGET_VX"
kono
parents:
diff changeset
1090 "vmx<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1091 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1092
kono
parents:
diff changeset
1093 ; vmnlb, vmnlh, vmnlf, vmnlg
kono
parents:
diff changeset
1094 (define_insn "umin<mode>3"
kono
parents:
diff changeset
1095 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1096 (umin:VI (match_operand:VI 1 "register_operand" "%v")
kono
parents:
diff changeset
1097 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1098 "TARGET_VX"
kono
parents:
diff changeset
1099 "vmnl<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1100 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1101
kono
parents:
diff changeset
1102 ; vmxlb, vmxlh, vmxlf, vmxlg
kono
parents:
diff changeset
1103 (define_insn "umax<mode>3"
kono
parents:
diff changeset
1104 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1105 (umax:VI (match_operand:VI 1 "register_operand" "%v")
kono
parents:
diff changeset
1106 (match_operand:VI 2 "register_operand" "v")))]
kono
parents:
diff changeset
1107 "TARGET_VX"
kono
parents:
diff changeset
1108 "vmxl<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1109 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1110
kono
parents:
diff changeset
1111 ; vmeb, vmeh, vmef
kono
parents:
diff changeset
1112 (define_insn "vec_widen_smult_even_<mode>"
kono
parents:
diff changeset
1113 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1114 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1115 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1116 UNSPEC_VEC_SMULT_EVEN))]
kono
parents:
diff changeset
1117 "TARGET_VX"
kono
parents:
diff changeset
1118 "vme<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1119 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1120
kono
parents:
diff changeset
1121 ; vmleb, vmleh, vmlef
kono
parents:
diff changeset
1122 (define_insn "vec_widen_umult_even_<mode>"
kono
parents:
diff changeset
1123 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1124 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1125 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1126 UNSPEC_VEC_UMULT_EVEN))]
kono
parents:
diff changeset
1127 "TARGET_VX"
kono
parents:
diff changeset
1128 "vmle<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1129 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1130
kono
parents:
diff changeset
1131 ; vmob, vmoh, vmof
kono
parents:
diff changeset
1132 (define_insn "vec_widen_smult_odd_<mode>"
kono
parents:
diff changeset
1133 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1134 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1135 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1136 UNSPEC_VEC_SMULT_ODD))]
kono
parents:
diff changeset
1137 "TARGET_VX"
kono
parents:
diff changeset
1138 "vmo<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1139 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1140
kono
parents:
diff changeset
1141 ; vmlob, vmloh, vmlof
kono
parents:
diff changeset
1142 (define_insn "vec_widen_umult_odd_<mode>"
kono
parents:
diff changeset
1143 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1144 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1145 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1146 UNSPEC_VEC_UMULT_ODD))]
kono
parents:
diff changeset
1147 "TARGET_VX"
kono
parents:
diff changeset
1148 "vmlo<bhfgq>\t%v0,%v1,%v2"
kono
parents:
diff changeset
1149 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1150
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 ; Widening hi/lo multiplications
kono
parents:
diff changeset
1153
kono
parents:
diff changeset
1154 ; The S/390 instructions vml and vmh return the low or high parts of
kono
parents:
diff changeset
1155 ; the double sized result elements in the corresponding elements of
kono
parents:
diff changeset
1156 ; the target register. That's NOT what the vec_widen_umult_lo/hi
kono
parents:
diff changeset
1157 ; patterns are expected to do.
kono
parents:
diff changeset
1158
kono
parents:
diff changeset
1159 ; We emulate the widening lo/hi multiplies with the even/odd versions
kono
parents:
diff changeset
1160 ; followed by a vector merge
kono
parents:
diff changeset
1161
kono
parents:
diff changeset
1162
kono
parents:
diff changeset
1163 (define_expand "vec_widen_umult_lo_<mode>"
kono
parents:
diff changeset
1164 [(set (match_dup 3)
kono
parents:
diff changeset
1165 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1166 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1167 UNSPEC_VEC_UMULT_EVEN))
kono
parents:
diff changeset
1168 (set (match_dup 4)
kono
parents:
diff changeset
1169 (unspec:<vec_double> [(match_dup 1) (match_dup 2)]
kono
parents:
diff changeset
1170 UNSPEC_VEC_UMULT_ODD))
kono
parents:
diff changeset
1171 (set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1172 (unspec:<vec_double> [(match_dup 3) (match_dup 4)]
kono
parents:
diff changeset
1173 UNSPEC_VEC_MERGEL))]
kono
parents:
diff changeset
1174 "TARGET_VX"
kono
parents:
diff changeset
1175 {
kono
parents:
diff changeset
1176 operands[3] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1177 operands[4] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1178 })
kono
parents:
diff changeset
1179
kono
parents:
diff changeset
1180 (define_expand "vec_widen_umult_hi_<mode>"
kono
parents:
diff changeset
1181 [(set (match_dup 3)
kono
parents:
diff changeset
1182 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1183 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1184 UNSPEC_VEC_UMULT_EVEN))
kono
parents:
diff changeset
1185 (set (match_dup 4)
kono
parents:
diff changeset
1186 (unspec:<vec_double> [(match_dup 1) (match_dup 2)]
kono
parents:
diff changeset
1187 UNSPEC_VEC_UMULT_ODD))
kono
parents:
diff changeset
1188 (set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1189 (unspec:<vec_double> [(match_dup 3) (match_dup 4)]
kono
parents:
diff changeset
1190 UNSPEC_VEC_MERGEH))]
kono
parents:
diff changeset
1191 "TARGET_VX"
kono
parents:
diff changeset
1192 {
kono
parents:
diff changeset
1193 operands[3] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1194 operands[4] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1195 })
kono
parents:
diff changeset
1196
kono
parents:
diff changeset
1197 (define_expand "vec_widen_smult_lo_<mode>"
kono
parents:
diff changeset
1198 [(set (match_dup 3)
kono
parents:
diff changeset
1199 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1200 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1201 UNSPEC_VEC_SMULT_EVEN))
kono
parents:
diff changeset
1202 (set (match_dup 4)
kono
parents:
diff changeset
1203 (unspec:<vec_double> [(match_dup 1) (match_dup 2)]
kono
parents:
diff changeset
1204 UNSPEC_VEC_SMULT_ODD))
kono
parents:
diff changeset
1205 (set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1206 (unspec:<vec_double> [(match_dup 3) (match_dup 4)]
kono
parents:
diff changeset
1207 UNSPEC_VEC_MERGEL))]
kono
parents:
diff changeset
1208 "TARGET_VX"
kono
parents:
diff changeset
1209 {
kono
parents:
diff changeset
1210 operands[3] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1211 operands[4] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1212 })
kono
parents:
diff changeset
1213
kono
parents:
diff changeset
1214 (define_expand "vec_widen_smult_hi_<mode>"
kono
parents:
diff changeset
1215 [(set (match_dup 3)
kono
parents:
diff changeset
1216 (unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "%v")
kono
parents:
diff changeset
1217 (match_operand:VI_QHS 2 "register_operand" "v")]
kono
parents:
diff changeset
1218 UNSPEC_VEC_SMULT_EVEN))
kono
parents:
diff changeset
1219 (set (match_dup 4)
kono
parents:
diff changeset
1220 (unspec:<vec_double> [(match_dup 1) (match_dup 2)]
kono
parents:
diff changeset
1221 UNSPEC_VEC_SMULT_ODD))
kono
parents:
diff changeset
1222 (set (match_operand:<vec_double> 0 "register_operand" "=v")
kono
parents:
diff changeset
1223 (unspec:<vec_double> [(match_dup 3) (match_dup 4)]
kono
parents:
diff changeset
1224 UNSPEC_VEC_MERGEH))]
kono
parents:
diff changeset
1225 "TARGET_VX"
kono
parents:
diff changeset
1226 {
kono
parents:
diff changeset
1227 operands[3] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1228 operands[4] = gen_reg_rtx (<vec_double>mode);
kono
parents:
diff changeset
1229 })
kono
parents:
diff changeset
1230
kono
parents:
diff changeset
1231 ; vec_widen_ushiftl_hi
kono
parents:
diff changeset
1232 ; vec_widen_ushiftl_lo
kono
parents:
diff changeset
1233 ; vec_widen_sshiftl_hi
kono
parents:
diff changeset
1234 ; vec_widen_sshiftl_lo
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 ;;
kono
parents:
diff changeset
1237 ;; Vector floating point arithmetic instructions
kono
parents:
diff changeset
1238 ;;
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 ; vfasb, vfadb, wfasb, wfadb, wfaxb
kono
parents:
diff changeset
1241 (define_insn "add<mode>3"
kono
parents:
diff changeset
1242 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1243 (plus:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1244 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1245 "TARGET_VX"
kono
parents:
diff changeset
1246 "<vw>fa<sdx>b\t%v0,%v1,%v2"
kono
parents:
diff changeset
1247 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 ; vfssb, vfsdb, wfssb, wfsdb, wfsxb
kono
parents:
diff changeset
1250 (define_insn "sub<mode>3"
kono
parents:
diff changeset
1251 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1252 (minus:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1253 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1254 "TARGET_VX"
kono
parents:
diff changeset
1255 "<vw>fs<sdx>b\t%v0,%v1,%v2"
kono
parents:
diff changeset
1256 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1257
kono
parents:
diff changeset
1258 ; vfmsb, vfmdb, wfmsb, wfmdb, wfmxb
kono
parents:
diff changeset
1259 (define_insn "mul<mode>3"
kono
parents:
diff changeset
1260 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1261 (mult:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1262 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1263 "TARGET_VX"
kono
parents:
diff changeset
1264 "<vw>fm<sdx>b\t%v0,%v1,%v2"
kono
parents:
diff changeset
1265 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1266
kono
parents:
diff changeset
1267 ; vfdsb, vfddb, wfdsb, wfddb, wfdxb
kono
parents:
diff changeset
1268 (define_insn "div<mode>3"
kono
parents:
diff changeset
1269 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1270 (div:VF_HW (match_operand:VF_HW 1 "register_operand" "v")
kono
parents:
diff changeset
1271 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1272 "TARGET_VX"
kono
parents:
diff changeset
1273 "<vw>fd<sdx>b\t%v0,%v1,%v2"
kono
parents:
diff changeset
1274 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1275
kono
parents:
diff changeset
1276 ; vfsqsb, vfsqdb, wfsqsb, wfsqdb, wfsqxb
kono
parents:
diff changeset
1277 (define_insn "sqrt<mode>2"
kono
parents:
diff changeset
1278 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1279 (sqrt:VF_HW (match_operand:VF_HW 1 "register_operand" "v")))]
kono
parents:
diff changeset
1280 "TARGET_VX"
kono
parents:
diff changeset
1281 "<vw>fsq<sdx>b\t%v0,%v1"
kono
parents:
diff changeset
1282 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1283
kono
parents:
diff changeset
1284 ; vfmasb, vfmadb, wfmasb, wfmadb, wfmaxb
kono
parents:
diff changeset
1285 (define_insn "fma<mode>4"
kono
parents:
diff changeset
1286 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1287 (fma:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1288 (match_operand:VF_HW 2 "register_operand" "v")
kono
parents:
diff changeset
1289 (match_operand:VF_HW 3 "register_operand" "v")))]
kono
parents:
diff changeset
1290 "TARGET_VX"
kono
parents:
diff changeset
1291 "<vw>fma<sdx>b\t%v0,%v1,%v2,%v3"
kono
parents:
diff changeset
1292 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1293
kono
parents:
diff changeset
1294 ; vfmssb, vfmsdb, wfmssb, wfmsdb, wfmsxb
kono
parents:
diff changeset
1295 (define_insn "fms<mode>4"
kono
parents:
diff changeset
1296 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1297 (fma:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1298 (match_operand:VF_HW 2 "register_operand" "v")
kono
parents:
diff changeset
1299 (neg:VF_HW (match_operand:VF_HW 3 "register_operand" "v"))))]
kono
parents:
diff changeset
1300 "TARGET_VX"
kono
parents:
diff changeset
1301 "<vw>fms<sdx>b\t%v0,%v1,%v2,%v3"
kono
parents:
diff changeset
1302 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1303
kono
parents:
diff changeset
1304 ; vfnmasb, vfnmadb, wfnmasb, wfnmadb, wfnmaxb
kono
parents:
diff changeset
1305 (define_insn "neg_fma<mode>4"
kono
parents:
diff changeset
1306 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1307 (neg:VF_HW
kono
parents:
diff changeset
1308 (fma:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1309 (match_operand:VF_HW 2 "register_operand" "v")
kono
parents:
diff changeset
1310 (match_operand:VF_HW 3 "register_operand" "v"))))]
kono
parents:
diff changeset
1311 "TARGET_VXE"
kono
parents:
diff changeset
1312 "<vw>fnma<sdx>b\t%v0,%v1,%v2,%v3"
kono
parents:
diff changeset
1313 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1314
kono
parents:
diff changeset
1315 ; vfnmssb, vfnmsdb, wfnmssb, wfnmsdb, wfnmsxb
kono
parents:
diff changeset
1316 (define_insn "neg_fms<mode>4"
kono
parents:
diff changeset
1317 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1318 (neg:VF_HW
kono
parents:
diff changeset
1319 (fma:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1320 (match_operand:VF_HW 2 "register_operand" "v")
kono
parents:
diff changeset
1321 (neg:VF_HW (match_operand:VF_HW 3 "register_operand" "v")))))]
kono
parents:
diff changeset
1322 "TARGET_VXE"
kono
parents:
diff changeset
1323 "<vw>fnms<sdx>b\t%v0,%v1,%v2,%v3"
kono
parents:
diff changeset
1324 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1325
kono
parents:
diff changeset
1326 ; vflcsb, vflcdb, wflcsb, wflcdb, wflcxb
kono
parents:
diff changeset
1327 (define_insn "neg<mode>2"
kono
parents:
diff changeset
1328 [(set (match_operand:VFT 0 "register_operand" "=v")
kono
parents:
diff changeset
1329 (neg:VFT (match_operand:VFT 1 "register_operand" "v")))]
kono
parents:
diff changeset
1330 "TARGET_VX"
kono
parents:
diff changeset
1331 "<vw>flc<sdx>b\t%v0,%v1"
kono
parents:
diff changeset
1332 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 ; vflpsb, vflpdb, wflpsb, wflpdb, wflpxb
kono
parents:
diff changeset
1335 (define_insn "abs<mode>2"
kono
parents:
diff changeset
1336 [(set (match_operand:VFT 0 "register_operand" "=v")
kono
parents:
diff changeset
1337 (abs:VFT (match_operand:VFT 1 "register_operand" "v")))]
kono
parents:
diff changeset
1338 "TARGET_VX"
kono
parents:
diff changeset
1339 "<vw>flp<sdx>b\t%v0,%v1"
kono
parents:
diff changeset
1340 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1341
kono
parents:
diff changeset
1342 ; vflnsb, vflndb, wflnsb, wflndb, wflnxb
kono
parents:
diff changeset
1343 (define_insn "negabs<mode>2"
kono
parents:
diff changeset
1344 [(set (match_operand:VFT 0 "register_operand" "=v")
kono
parents:
diff changeset
1345 (neg:VFT (abs:VFT (match_operand:VFT 1 "register_operand" "v"))))]
kono
parents:
diff changeset
1346 "TARGET_VX"
kono
parents:
diff changeset
1347 "<vw>fln<sdx>b\t%v0,%v1"
kono
parents:
diff changeset
1348 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1349
kono
parents:
diff changeset
1350 (define_expand "smax<mode>3"
kono
parents:
diff changeset
1351 [(set (match_operand:VF_HW 0 "register_operand")
kono
parents:
diff changeset
1352 (smax:VF_HW (match_operand:VF_HW 1 "register_operand")
kono
parents:
diff changeset
1353 (match_operand:VF_HW 2 "register_operand")))]
kono
parents:
diff changeset
1354 "TARGET_VX")
kono
parents:
diff changeset
1355
kono
parents:
diff changeset
1356 ; vfmaxsb, vfmaxdb, wfmaxsb, wfmaxdb, wfmaxxb
kono
parents:
diff changeset
1357 (define_insn "*smax<mode>3_vxe"
kono
parents:
diff changeset
1358 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1359 (smax:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1360 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1361 "TARGET_VXE"
kono
parents:
diff changeset
1362 "<vw>fmax<sdx>b\t%v0,%v1,%v2,4"
kono
parents:
diff changeset
1363 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1364
kono
parents:
diff changeset
1365 ; Emulate with compare + select
kono
parents:
diff changeset
1366 (define_insn_and_split "*smaxv2df3_vx"
kono
parents:
diff changeset
1367 [(set (match_operand:V2DF 0 "register_operand" "=v")
kono
parents:
diff changeset
1368 (smax:V2DF (match_operand:V2DF 1 "register_operand" "%v")
kono
parents:
diff changeset
1369 (match_operand:V2DF 2 "register_operand" "v")))]
kono
parents:
diff changeset
1370 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
1371 "#"
kono
parents:
diff changeset
1372 "&& 1"
kono
parents:
diff changeset
1373 [(set (match_dup 3)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1374 (not:V2DI
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1375 (unge:V2DI (match_dup 2) (match_dup 1))))
111
kono
parents:
diff changeset
1376 (set (match_dup 0)
kono
parents:
diff changeset
1377 (if_then_else:V2DF
kono
parents:
diff changeset
1378 (eq (match_dup 3) (match_dup 4))
kono
parents:
diff changeset
1379 (match_dup 2)
kono
parents:
diff changeset
1380 (match_dup 1)))]
kono
parents:
diff changeset
1381 {
kono
parents:
diff changeset
1382 operands[3] = gen_reg_rtx (V2DImode);
kono
parents:
diff changeset
1383 operands[4] = CONST0_RTX (V2DImode);
kono
parents:
diff changeset
1384 })
kono
parents:
diff changeset
1385
kono
parents:
diff changeset
1386 (define_expand "smin<mode>3"
kono
parents:
diff changeset
1387 [(set (match_operand:VF_HW 0 "register_operand")
kono
parents:
diff changeset
1388 (smin:VF_HW (match_operand:VF_HW 1 "register_operand")
kono
parents:
diff changeset
1389 (match_operand:VF_HW 2 "register_operand")))]
kono
parents:
diff changeset
1390 "TARGET_VX")
kono
parents:
diff changeset
1391
kono
parents:
diff changeset
1392 ; vfminsb, vfmindb, wfminsb, wfmindb, wfminxb
kono
parents:
diff changeset
1393 (define_insn "*smin<mode>3_vxe"
kono
parents:
diff changeset
1394 [(set (match_operand:VF_HW 0 "register_operand" "=v")
kono
parents:
diff changeset
1395 (smin:VF_HW (match_operand:VF_HW 1 "register_operand" "%v")
kono
parents:
diff changeset
1396 (match_operand:VF_HW 2 "register_operand" "v")))]
kono
parents:
diff changeset
1397 "TARGET_VXE"
kono
parents:
diff changeset
1398 "<vw>fmin<sdx>b\t%v0,%v1,%v2,4"
kono
parents:
diff changeset
1399 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1400
kono
parents:
diff changeset
1401 ; Emulate with compare + select
kono
parents:
diff changeset
1402 (define_insn_and_split "*sminv2df3_vx"
kono
parents:
diff changeset
1403 [(set (match_operand:V2DF 0 "register_operand" "=v")
kono
parents:
diff changeset
1404 (smin:V2DF (match_operand:V2DF 1 "register_operand" "%v")
kono
parents:
diff changeset
1405 (match_operand:V2DF 2 "register_operand" "v")))]
kono
parents:
diff changeset
1406 "TARGET_VX && !TARGET_VXE"
kono
parents:
diff changeset
1407 "#"
kono
parents:
diff changeset
1408 "&& 1"
kono
parents:
diff changeset
1409 [(set (match_dup 3)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1410 (not:V2DI
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1411 (unge:V2DI (match_dup 2) (match_dup 1))))
111
kono
parents:
diff changeset
1412 (set (match_dup 0)
kono
parents:
diff changeset
1413 (if_then_else:V2DF
kono
parents:
diff changeset
1414 (eq (match_dup 3) (match_dup 4))
kono
parents:
diff changeset
1415 (match_dup 1)
kono
parents:
diff changeset
1416 (match_dup 2)))]
kono
parents:
diff changeset
1417 {
kono
parents:
diff changeset
1418 operands[3] = gen_reg_rtx (V2DImode);
kono
parents:
diff changeset
1419 operands[4] = CONST0_RTX (V2DImode);
kono
parents:
diff changeset
1420 })
kono
parents:
diff changeset
1421
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1422 ; Vector copysign, implement using vector select
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1423 (define_expand "copysign<mode>3"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1424 [(set (match_operand:VFT 0 "register_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1425 (if_then_else:VFT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1426 (eq (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1427 (match_dup 4))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1428 (match_operand:VFT 1 "register_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1429 (match_operand:VFT 2 "register_operand" "")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1430 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1431 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1432 int sz = GET_MODE_BITSIZE (GET_MODE_INNER (<MODE>mode));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1433 int prec = GET_MODE_PRECISION (GET_MODE_INNER (<tointvec>mode));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1434 wide_int mask_val = wi::shwi (1l << (sz - 1), prec);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1435
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1436 rtx mask = gen_reg_rtx (<tointvec>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1437
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1438 int nunits = GET_MODE_NUNITS (<tointvec>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1439 rtvec v = rtvec_alloc (nunits);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1440 for (int i = 0; i < nunits; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1441 RTVEC_ELT (v, i) = GEN_INT (mask_val.to_shwi ());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1442
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1443 mask = gen_rtx_CONST_VECTOR (<tointvec>mode, v);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1444 operands[3] = force_reg (<tointvec>mode, mask);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1445 operands[4] = CONST0_RTX (<tointvec>mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1446 })
111
kono
parents:
diff changeset
1447
kono
parents:
diff changeset
1448 ;;
kono
parents:
diff changeset
1449 ;; Integer compares
kono
parents:
diff changeset
1450 ;;
kono
parents:
diff changeset
1451
kono
parents:
diff changeset
1452 (define_insn "*vec_cmp<VICMP_HW_OP:code><VI:mode>_nocc"
kono
parents:
diff changeset
1453 [(set (match_operand:VI 2 "register_operand" "=v")
kono
parents:
diff changeset
1454 (VICMP_HW_OP:VI (match_operand:VI 0 "register_operand" "v")
kono
parents:
diff changeset
1455 (match_operand:VI 1 "register_operand" "v")))]
kono
parents:
diff changeset
1456 "TARGET_VX"
kono
parents:
diff changeset
1457 "vc<VICMP_HW_OP:insn_cmp_op><VI:bhfgq>\t%v2,%v0,%v1"
kono
parents:
diff changeset
1458 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1459
kono
parents:
diff changeset
1460
kono
parents:
diff changeset
1461 ;;
kono
parents:
diff changeset
1462 ;; Floating point compares
kono
parents:
diff changeset
1463 ;;
kono
parents:
diff changeset
1464
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1465 ; vfcesb, vfcedb, wfcexb: non-signaling "==" comparison (a == b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1466 (define_insn "*vec_cmpeq<mode>_quiet_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1467 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1468 (eq:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1469 (match_operand:VFT 2 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1470 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1471 "<vw>fce<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1472 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1473
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1474 ; vfchsb, vfchdb, wfchxb: non-signaling > comparison (!(b u>= a))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1475 (define_insn "vec_cmpgt<mode>_quiet_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1476 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1477 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1478 (unge:<tointvec> (match_operand:VFT 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1479 (match_operand:VFT 1 "register_operand" "v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1480 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1481 "<vw>fch<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1482 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1483
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1484 (define_expand "vec_cmplt<mode>_quiet_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1485 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1486 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1487 (unge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1488 (match_operand:VFT 2 "register_operand" "v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1489 "TARGET_VX")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1490
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1491 ; vfchesb, vfchedb, wfchexb: non-signaling >= comparison (!(a u< b))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1492 (define_insn "vec_cmpge<mode>_quiet_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1493 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1494 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1495 (unlt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1496 (match_operand:VFT 2 "register_operand" "v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1497 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1498 "<vw>fche<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1499 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1500
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1501 (define_expand "vec_cmple<mode>_quiet_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1502 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1503 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1504 (unlt:<tointvec> (match_operand:VFT 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1505 (match_operand:VFT 1 "register_operand" "v"))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1506 "TARGET_VX")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1507
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1508 ; vfkesb, vfkedb, wfkexb: signaling == comparison ((a >= b) & (b >= a))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1509 (define_insn "*vec_cmpeq<mode>_signaling_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1510 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1511 (and:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1512 (ge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1513 (match_operand:VFT 2 "register_operand" "v"))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1514 (ge:<tointvec> (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1515 (match_dup 1))))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1516 "TARGET_VXE"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1517 "<vw>fke<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1518 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1519
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1520 ; vfkhsb, vfkhdb, wfkhxb: signaling > comparison (a > b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1521 (define_insn "*vec_cmpgt<mode>_signaling_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1522 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1523 (gt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1524 (match_operand:VFT 2 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1525 "TARGET_VXE"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1526 "<vw>fkh<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1527 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1528
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1529 (define_insn "*vec_cmpgt<mode>_signaling_finite_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1530 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1531 (gt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1532 (match_operand:VFT 2 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1533 "TARGET_VX && !TARGET_VXE && flag_finite_math_only"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1534 "<vw>fch<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1535 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1536
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1537 ; vfkhesb, vfkhedb, wfkhexb: signaling >= comparison (a >= b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1538 (define_insn "*vec_cmpge<mode>_signaling_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1539 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1540 (ge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1541 (match_operand:VFT 2 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1542 "TARGET_VXE"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1543 "<vw>fkhe<sdx>b\t%v0,%v1,%v2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1544 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1545
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1546 (define_insn "*vec_cmpge<mode>_signaling_finite_nocc"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1547 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1548 (ge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1549 (match_operand:VFT 2 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1550 "TARGET_VX && !TARGET_VXE && flag_finite_math_only"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1551 "<vw>fche<sdx>b\t%v0,%v1,%v2"
111
kono
parents:
diff changeset
1552 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1553
kono
parents:
diff changeset
1554 ; Expanders for not directly supported comparisons
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1555 ; Signaling comparisons must be expressed via signaling rtxes only,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1556 ; and quiet comparisons must be expressed via quiet rtxes only.
111
kono
parents:
diff changeset
1557
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1558 ; UNGT a u> b -> !!(b u< a)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1559 (define_expand "vec_cmpungt<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1560 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1561 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1562 (unlt:<tointvec> (match_operand:VFT 2 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1563 (match_operand:VFT 1 "register_operand" "v"))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1564 (set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1565 (not:<tointvec> (match_dup 0)))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1566 "TARGET_VX")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1567
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1568 ; UNGE a u>= b -> !!(a u>= b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1569 (define_expand "vec_cmpunge<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1570 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1571 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1572 (unge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1573 (match_operand:VFT 2 "register_operand" "v"))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1574 (set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1575 (not:<tointvec> (match_dup 0)))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1576 "TARGET_VX")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1577
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1578 ; UNEQ a u== b -> !(!(a u>= b) | !(b u>= a))
111
kono
parents:
diff changeset
1579 (define_expand "vec_cmpuneq<mode>"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1580 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1581 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1582 (unge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1583 (match_operand:VFT 2 "register_operand" "v"))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1584 (set (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1585 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1586 (unge:<tointvec> (match_dup 2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1587 (match_dup 1))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1588 (set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1589 (ior:<tointvec> (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1590 (match_dup 3)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1591 (set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1592 (not:<tointvec> (match_dup 0)))]
111
kono
parents:
diff changeset
1593 "TARGET_VX"
kono
parents:
diff changeset
1594 {
kono
parents:
diff changeset
1595 operands[3] = gen_reg_rtx (<tointvec>mode);
kono
parents:
diff changeset
1596 })
kono
parents:
diff changeset
1597
kono
parents:
diff changeset
1598 ; LTGT a <> b -> a > b | b > a
kono
parents:
diff changeset
1599 (define_expand "vec_cmpltgt<mode>"
kono
parents:
diff changeset
1600 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
kono
parents:
diff changeset
1601 (gt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
kono
parents:
diff changeset
1602 (match_operand:VFT 2 "register_operand" "v")))
kono
parents:
diff changeset
1603 (set (match_dup 3) (gt:<tointvec> (match_dup 2) (match_dup 1)))
kono
parents:
diff changeset
1604 (set (match_dup 0) (ior:<tointvec> (match_dup 0) (match_dup 3)))]
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1605 "TARGET_VXE"
111
kono
parents:
diff changeset
1606 {
kono
parents:
diff changeset
1607 operands[3] = gen_reg_rtx (<tointvec>mode);
kono
parents:
diff changeset
1608 })
kono
parents:
diff changeset
1609
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1610 ; ORDERED (a, b): !(a u< b) | !(a u>= b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1611 (define_expand "vec_cmpordered<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1612 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1613 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1614 (unlt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1615 (match_operand:VFT 2 "register_operand" "v"))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1616 (set (match_dup 3)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1617 (not:<tointvec>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1618 (unge:<tointvec> (match_dup 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1619 (match_dup 2))))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1620 (set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1621 (ior:<tointvec> (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1622 (match_dup 3)))]
111
kono
parents:
diff changeset
1623 "TARGET_VX"
kono
parents:
diff changeset
1624 {
kono
parents:
diff changeset
1625 operands[3] = gen_reg_rtx (<tointvec>mode);
kono
parents:
diff changeset
1626 })
kono
parents:
diff changeset
1627
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1628 ; UNORDERED (a, b): !ORDERED (a, b)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1629 (define_expand "vec_cmpunordered<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1630 [(match_operand:<tointvec> 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1631 (match_operand:VFT 1 "register_operand" "v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1632 (match_operand:VFT 2 "register_operand" "v")]
111
kono
parents:
diff changeset
1633 "TARGET_VX"
kono
parents:
diff changeset
1634 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1635 emit_insn (gen_vec_cmpordered<mode> (operands[0], operands[1], operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1636 emit_insn (gen_rtx_SET (operands[0],
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1637 gen_rtx_NOT (<tointvec>mode, operands[0])));
111
kono
parents:
diff changeset
1638 DONE;
kono
parents:
diff changeset
1639 })
kono
parents:
diff changeset
1640
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1641 (define_code_iterator VEC_CMP_EXPAND
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1642 [ungt unge uneq ltgt ordered unordered])
111
kono
parents:
diff changeset
1643
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1644 (define_expand "vec_cmp<code>"
111
kono
parents:
diff changeset
1645 [(match_operand 0 "register_operand" "")
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1646 (VEC_CMP_EXPAND (match_operand 1 "register_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1647 (match_operand 2 "register_operand" ""))]
111
kono
parents:
diff changeset
1648 "TARGET_VX"
kono
parents:
diff changeset
1649 {
kono
parents:
diff changeset
1650 if (GET_MODE (operands[1]) == V4SFmode)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1651 emit_insn (gen_vec_cmp<code>v4sf (operands[0], operands[1], operands[2]));
111
kono
parents:
diff changeset
1652 else if (GET_MODE (operands[1]) == V2DFmode)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1653 emit_insn (gen_vec_cmp<code>v2df (operands[0], operands[1], operands[2]));
111
kono
parents:
diff changeset
1654 else
kono
parents:
diff changeset
1655 gcc_unreachable ();
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 DONE;
kono
parents:
diff changeset
1658 })
kono
parents:
diff changeset
1659
kono
parents:
diff changeset
1660 (define_insn "*vec_load_pair<mode>"
kono
parents:
diff changeset
1661 [(set (match_operand:V_HW_64 0 "register_operand" "=v,v")
kono
parents:
diff changeset
1662 (vec_concat:V_HW_64 (match_operand:<non_vec> 1 "register_operand" "d,v")
kono
parents:
diff changeset
1663 (match_operand:<non_vec> 2 "register_operand" "d,v")))]
kono
parents:
diff changeset
1664 "TARGET_VX"
kono
parents:
diff changeset
1665 "@
kono
parents:
diff changeset
1666 vlvgp\t%v0,%1,%2
kono
parents:
diff changeset
1667 vmrhg\t%v0,%v1,%v2"
kono
parents:
diff changeset
1668 [(set_attr "op_type" "VRR,VRR")])
kono
parents:
diff changeset
1669
kono
parents:
diff changeset
1670 (define_insn "vllv16qi"
kono
parents:
diff changeset
1671 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1672 (unspec:V16QI [(match_operand:SI 1 "register_operand" "d")
kono
parents:
diff changeset
1673 (match_operand:BLK 2 "memory_operand" "Q")]
kono
parents:
diff changeset
1674 UNSPEC_VEC_LOAD_LEN))]
kono
parents:
diff changeset
1675 "TARGET_VX"
kono
parents:
diff changeset
1676 "vll\t%v0,%1,%2"
kono
parents:
diff changeset
1677 [(set_attr "op_type" "VRS")])
kono
parents:
diff changeset
1678
kono
parents:
diff changeset
1679 ; vfenebs, vfenehs, vfenefs
kono
parents:
diff changeset
1680 ; vfenezbs, vfenezhs, vfenezfs
kono
parents:
diff changeset
1681 (define_insn "vec_vfenes<mode>"
kono
parents:
diff changeset
1682 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
kono
parents:
diff changeset
1683 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
kono
parents:
diff changeset
1684 (match_operand:VI_HW_QHS 2 "register_operand" "v")
kono
parents:
diff changeset
1685 (match_operand:QI 3 "const_mask_operand" "C")]
kono
parents:
diff changeset
1686 UNSPEC_VEC_VFENE))
kono
parents:
diff changeset
1687 (set (reg:CCRAW CC_REGNUM)
kono
parents:
diff changeset
1688 (unspec:CCRAW [(match_dup 1)
kono
parents:
diff changeset
1689 (match_dup 2)
kono
parents:
diff changeset
1690 (match_dup 3)]
kono
parents:
diff changeset
1691 UNSPEC_VEC_VFENECC))]
kono
parents:
diff changeset
1692 "TARGET_VX"
kono
parents:
diff changeset
1693 {
kono
parents:
diff changeset
1694 unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
kono
parents:
diff changeset
1695
kono
parents:
diff changeset
1696 gcc_assert (!(flags & ~(VSTRING_FLAG_ZS | VSTRING_FLAG_CS)));
kono
parents:
diff changeset
1697 flags &= ~VSTRING_FLAG_CS;
kono
parents:
diff changeset
1698
kono
parents:
diff changeset
1699 if (flags == VSTRING_FLAG_ZS)
kono
parents:
diff changeset
1700 return "vfenez<bhfgq>s\t%v0,%v1,%v2";
kono
parents:
diff changeset
1701 return "vfene<bhfgq>s\t%v0,%v1,%v2";
kono
parents:
diff changeset
1702 }
kono
parents:
diff changeset
1703 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1704
kono
parents:
diff changeset
1705
kono
parents:
diff changeset
1706 ; Vector select
kono
parents:
diff changeset
1707
kono
parents:
diff changeset
1708 ; The following splitters simplify vec_sel for constant 0 or -1
kono
parents:
diff changeset
1709 ; selection sources. This is required to generate efficient code for
kono
parents:
diff changeset
1710 ; vcond.
kono
parents:
diff changeset
1711
kono
parents:
diff changeset
1712 ; a = b == c;
kono
parents:
diff changeset
1713 (define_split
kono
parents:
diff changeset
1714 [(set (match_operand:V 0 "register_operand" "")
kono
parents:
diff changeset
1715 (if_then_else:V
kono
parents:
diff changeset
1716 (eq (match_operand:<tointvec> 3 "register_operand" "")
kono
parents:
diff changeset
1717 (match_operand:V 4 "const0_operand" ""))
kono
parents:
diff changeset
1718 (match_operand:V 1 "const0_operand" "")
kono
parents:
diff changeset
1719 (match_operand:V 2 "all_ones_operand" "")))]
kono
parents:
diff changeset
1720 "TARGET_VX"
kono
parents:
diff changeset
1721 [(set (match_dup 0) (match_dup 3))]
kono
parents:
diff changeset
1722 {
kono
parents:
diff changeset
1723 PUT_MODE (operands[3], <V:MODE>mode);
kono
parents:
diff changeset
1724 })
kono
parents:
diff changeset
1725
kono
parents:
diff changeset
1726 ; a = ~(b == c)
kono
parents:
diff changeset
1727 (define_split
kono
parents:
diff changeset
1728 [(set (match_operand:V 0 "register_operand" "")
kono
parents:
diff changeset
1729 (if_then_else:V
kono
parents:
diff changeset
1730 (eq (match_operand:<tointvec> 3 "register_operand" "")
kono
parents:
diff changeset
1731 (match_operand:V 4 "const0_operand" ""))
kono
parents:
diff changeset
1732 (match_operand:V 1 "all_ones_operand" "")
kono
parents:
diff changeset
1733 (match_operand:V 2 "const0_operand" "")))]
kono
parents:
diff changeset
1734 "TARGET_VX"
kono
parents:
diff changeset
1735 [(set (match_dup 0) (not:V (match_dup 3)))]
kono
parents:
diff changeset
1736 {
kono
parents:
diff changeset
1737 PUT_MODE (operands[3], <V:MODE>mode);
kono
parents:
diff changeset
1738 })
kono
parents:
diff changeset
1739
kono
parents:
diff changeset
1740 ; a = b != c
kono
parents:
diff changeset
1741 (define_split
kono
parents:
diff changeset
1742 [(set (match_operand:V 0 "register_operand" "")
kono
parents:
diff changeset
1743 (if_then_else:V
kono
parents:
diff changeset
1744 (ne (match_operand:<tointvec> 3 "register_operand" "")
kono
parents:
diff changeset
1745 (match_operand:V 4 "const0_operand" ""))
kono
parents:
diff changeset
1746 (match_operand:V 1 "all_ones_operand" "")
kono
parents:
diff changeset
1747 (match_operand:V 2 "const0_operand" "")))]
kono
parents:
diff changeset
1748 "TARGET_VX"
kono
parents:
diff changeset
1749 [(set (match_dup 0) (match_dup 3))]
kono
parents:
diff changeset
1750 {
kono
parents:
diff changeset
1751 PUT_MODE (operands[3], <V:MODE>mode);
kono
parents:
diff changeset
1752 })
kono
parents:
diff changeset
1753
kono
parents:
diff changeset
1754 ; a = ~(b != c)
kono
parents:
diff changeset
1755 (define_split
kono
parents:
diff changeset
1756 [(set (match_operand:V 0 "register_operand" "")
kono
parents:
diff changeset
1757 (if_then_else:V
kono
parents:
diff changeset
1758 (ne (match_operand:<tointvec> 3 "register_operand" "")
kono
parents:
diff changeset
1759 (match_operand:V 4 "const0_operand" ""))
kono
parents:
diff changeset
1760 (match_operand:V 1 "const0_operand" "")
kono
parents:
diff changeset
1761 (match_operand:V 2 "all_ones_operand" "")))]
kono
parents:
diff changeset
1762 "TARGET_VX"
kono
parents:
diff changeset
1763 [(set (match_dup 0) (not:V (match_dup 3)))]
kono
parents:
diff changeset
1764 {
kono
parents:
diff changeset
1765 PUT_MODE (operands[3], <V:MODE>mode);
kono
parents:
diff changeset
1766 })
kono
parents:
diff changeset
1767
kono
parents:
diff changeset
1768 ; op0 = op3 == 0 ? op1 : op2
kono
parents:
diff changeset
1769 (define_insn "*vec_sel0<mode>"
kono
parents:
diff changeset
1770 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
1771 (if_then_else:V
kono
parents:
diff changeset
1772 (eq (match_operand:<tointvec> 3 "register_operand" "v")
kono
parents:
diff changeset
1773 (match_operand:<tointvec> 4 "const0_operand" ""))
kono
parents:
diff changeset
1774 (match_operand:V 1 "register_operand" "v")
kono
parents:
diff changeset
1775 (match_operand:V 2 "register_operand" "v")))]
kono
parents:
diff changeset
1776 "TARGET_VX"
kono
parents:
diff changeset
1777 "vsel\t%v0,%2,%1,%3"
kono
parents:
diff changeset
1778 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1779
kono
parents:
diff changeset
1780 ; op0 = !op3 == 0 ? op1 : op2
kono
parents:
diff changeset
1781 (define_insn "*vec_sel0<mode>"
kono
parents:
diff changeset
1782 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
1783 (if_then_else:V
kono
parents:
diff changeset
1784 (eq (not:<tointvec> (match_operand:<tointvec> 3 "register_operand" "v"))
kono
parents:
diff changeset
1785 (match_operand:<tointvec> 4 "const0_operand" ""))
kono
parents:
diff changeset
1786 (match_operand:V 1 "register_operand" "v")
kono
parents:
diff changeset
1787 (match_operand:V 2 "register_operand" "v")))]
kono
parents:
diff changeset
1788 "TARGET_VX"
kono
parents:
diff changeset
1789 "vsel\t%v0,%1,%2,%3"
kono
parents:
diff changeset
1790 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1791
kono
parents:
diff changeset
1792 ; op0 = op3 == -1 ? op1 : op2
kono
parents:
diff changeset
1793 (define_insn "*vec_sel1<mode>"
kono
parents:
diff changeset
1794 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
1795 (if_then_else:V
kono
parents:
diff changeset
1796 (eq (match_operand:<tointvec> 3 "register_operand" "v")
kono
parents:
diff changeset
1797 (match_operand:<tointvec> 4 "all_ones_operand" ""))
kono
parents:
diff changeset
1798 (match_operand:V 1 "register_operand" "v")
kono
parents:
diff changeset
1799 (match_operand:V 2 "register_operand" "v")))]
kono
parents:
diff changeset
1800 "TARGET_VX"
kono
parents:
diff changeset
1801 "vsel\t%v0,%1,%2,%3"
kono
parents:
diff changeset
1802 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1803
kono
parents:
diff changeset
1804 ; op0 = !op3 == -1 ? op1 : op2
kono
parents:
diff changeset
1805 (define_insn "*vec_sel1<mode>"
kono
parents:
diff changeset
1806 [(set (match_operand:V 0 "register_operand" "=v")
kono
parents:
diff changeset
1807 (if_then_else:V
kono
parents:
diff changeset
1808 (eq (not:<tointvec> (match_operand:<tointvec> 3 "register_operand" "v"))
kono
parents:
diff changeset
1809 (match_operand:<tointvec> 4 "all_ones_operand" ""))
kono
parents:
diff changeset
1810 (match_operand:V 1 "register_operand" "v")
kono
parents:
diff changeset
1811 (match_operand:V 2 "register_operand" "v")))]
kono
parents:
diff changeset
1812 "TARGET_VX"
kono
parents:
diff changeset
1813 "vsel\t%v0,%2,%1,%3"
kono
parents:
diff changeset
1814 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1815
kono
parents:
diff changeset
1816 ; vec_pack_trunc
kono
parents:
diff changeset
1817
kono
parents:
diff changeset
1818 ; vpkh, vpkf, vpkg
kono
parents:
diff changeset
1819 (define_insn "vec_pack_trunc_<mode>"
kono
parents:
diff changeset
1820 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
kono
parents:
diff changeset
1821 (vec_concat:<vec_half>
kono
parents:
diff changeset
1822 (truncate:<vec_halfhalf>
kono
parents:
diff changeset
1823 (match_operand:VI_HW_HSD 1 "register_operand" "v"))
kono
parents:
diff changeset
1824 (truncate:<vec_halfhalf>
kono
parents:
diff changeset
1825 (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
kono
parents:
diff changeset
1826 "TARGET_VX"
kono
parents:
diff changeset
1827 "vpk<bhfgq>\t%0,%1,%2"
kono
parents:
diff changeset
1828 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1829
kono
parents:
diff changeset
1830 ; vpksh, vpksf, vpksg
kono
parents:
diff changeset
1831 (define_insn "vec_pack_ssat_<mode>"
kono
parents:
diff changeset
1832 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
kono
parents:
diff changeset
1833 (vec_concat:<vec_half>
kono
parents:
diff changeset
1834 (ss_truncate:<vec_halfhalf>
kono
parents:
diff changeset
1835 (match_operand:VI_HW_HSD 1 "register_operand" "v"))
kono
parents:
diff changeset
1836 (ss_truncate:<vec_halfhalf>
kono
parents:
diff changeset
1837 (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
kono
parents:
diff changeset
1838 "TARGET_VX"
kono
parents:
diff changeset
1839 "vpks<bhfgq>\t%0,%1,%2"
kono
parents:
diff changeset
1840 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1841
kono
parents:
diff changeset
1842 ; vpklsh, vpklsf, vpklsg
kono
parents:
diff changeset
1843 (define_insn "vec_pack_usat_<mode>"
kono
parents:
diff changeset
1844 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
kono
parents:
diff changeset
1845 (vec_concat:<vec_half>
kono
parents:
diff changeset
1846 (us_truncate:<vec_halfhalf>
kono
parents:
diff changeset
1847 (match_operand:VI_HW_HSD 1 "register_operand" "v"))
kono
parents:
diff changeset
1848 (us_truncate:<vec_halfhalf>
kono
parents:
diff changeset
1849 (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
kono
parents:
diff changeset
1850 "TARGET_VX"
kono
parents:
diff changeset
1851 "vpkls<bhfgq>\t%0,%1,%2"
kono
parents:
diff changeset
1852 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1853
kono
parents:
diff changeset
1854 ;; vector unpack v16qi
kono
parents:
diff changeset
1855
kono
parents:
diff changeset
1856 ; signed
kono
parents:
diff changeset
1857
kono
parents:
diff changeset
1858 (define_insn "vec_unpacks_hi_v16qi"
kono
parents:
diff changeset
1859 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1860 (sign_extend:V8HI
kono
parents:
diff changeset
1861 (vec_select:V8QI
kono
parents:
diff changeset
1862 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1863 (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)
kono
parents:
diff changeset
1864 (const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
kono
parents:
diff changeset
1865 "TARGET_VX"
kono
parents:
diff changeset
1866 "vuphb\t%0,%1"
kono
parents:
diff changeset
1867 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1868
kono
parents:
diff changeset
1869 (define_insn "vec_unpacks_lo_v16qi"
kono
parents:
diff changeset
1870 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1871 (sign_extend:V8HI
kono
parents:
diff changeset
1872 (vec_select:V8QI
kono
parents:
diff changeset
1873 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1874 (parallel [(const_int 8) (const_int 9) (const_int 10)(const_int 11)
kono
parents:
diff changeset
1875 (const_int 12)(const_int 13)(const_int 14)(const_int 15)]))))]
kono
parents:
diff changeset
1876 "TARGET_VX"
kono
parents:
diff changeset
1877 "vuplb\t%0,%1"
kono
parents:
diff changeset
1878 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1879
kono
parents:
diff changeset
1880 ; unsigned
kono
parents:
diff changeset
1881
kono
parents:
diff changeset
1882 (define_insn "vec_unpacku_hi_v16qi"
kono
parents:
diff changeset
1883 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1884 (zero_extend:V8HI
kono
parents:
diff changeset
1885 (vec_select:V8QI
kono
parents:
diff changeset
1886 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1887 (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)
kono
parents:
diff changeset
1888 (const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
kono
parents:
diff changeset
1889 "TARGET_VX"
kono
parents:
diff changeset
1890 "vuplhb\t%0,%1"
kono
parents:
diff changeset
1891 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1892
kono
parents:
diff changeset
1893 (define_insn "vec_unpacku_lo_v16qi"
kono
parents:
diff changeset
1894 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1895 (zero_extend:V8HI
kono
parents:
diff changeset
1896 (vec_select:V8QI
kono
parents:
diff changeset
1897 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1898 (parallel [(const_int 8) (const_int 9) (const_int 10)(const_int 11)
kono
parents:
diff changeset
1899 (const_int 12)(const_int 13)(const_int 14)(const_int 15)]))))]
kono
parents:
diff changeset
1900 "TARGET_VX"
kono
parents:
diff changeset
1901 "vupllb\t%0,%1"
kono
parents:
diff changeset
1902 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1903
kono
parents:
diff changeset
1904 ;; vector unpack v8hi
kono
parents:
diff changeset
1905
kono
parents:
diff changeset
1906 ; signed
kono
parents:
diff changeset
1907
kono
parents:
diff changeset
1908 (define_insn "vec_unpacks_hi_v8hi"
kono
parents:
diff changeset
1909 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1910 (sign_extend:V4SI
kono
parents:
diff changeset
1911 (vec_select:V4HI
kono
parents:
diff changeset
1912 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1913 (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)]))))]
kono
parents:
diff changeset
1914 "TARGET_VX"
kono
parents:
diff changeset
1915 "vuphh\t%0,%1"
kono
parents:
diff changeset
1916 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1917
kono
parents:
diff changeset
1918 (define_insn "vec_unpacks_lo_v8hi"
kono
parents:
diff changeset
1919 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1920 (sign_extend:V4SI
kono
parents:
diff changeset
1921 (vec_select:V4HI
kono
parents:
diff changeset
1922 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1923 (parallel [(const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
kono
parents:
diff changeset
1924 "TARGET_VX"
kono
parents:
diff changeset
1925 "vuplhw\t%0,%1"
kono
parents:
diff changeset
1926 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1927
kono
parents:
diff changeset
1928 ; unsigned
kono
parents:
diff changeset
1929
kono
parents:
diff changeset
1930 (define_insn "vec_unpacku_hi_v8hi"
kono
parents:
diff changeset
1931 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1932 (zero_extend:V4SI
kono
parents:
diff changeset
1933 (vec_select:V4HI
kono
parents:
diff changeset
1934 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1935 (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)]))))]
kono
parents:
diff changeset
1936 "TARGET_VX"
kono
parents:
diff changeset
1937 "vuplhh\t%0,%1"
kono
parents:
diff changeset
1938 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1939
kono
parents:
diff changeset
1940 (define_insn "vec_unpacku_lo_v8hi"
kono
parents:
diff changeset
1941 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1942 (zero_extend:V4SI
kono
parents:
diff changeset
1943 (vec_select:V4HI
kono
parents:
diff changeset
1944 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1945 (parallel [(const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
kono
parents:
diff changeset
1946 "TARGET_VX"
kono
parents:
diff changeset
1947 "vupllh\t%0,%1"
kono
parents:
diff changeset
1948 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1949
kono
parents:
diff changeset
1950 ;; vector unpack v4si
kono
parents:
diff changeset
1951
kono
parents:
diff changeset
1952 ; signed
kono
parents:
diff changeset
1953
kono
parents:
diff changeset
1954 (define_insn "vec_unpacks_hi_v4si"
kono
parents:
diff changeset
1955 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
1956 (sign_extend:V2DI
kono
parents:
diff changeset
1957 (vec_select:V2SI
kono
parents:
diff changeset
1958 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1959 (parallel [(const_int 0)(const_int 1)]))))]
kono
parents:
diff changeset
1960 "TARGET_VX"
kono
parents:
diff changeset
1961 "vuphf\t%0,%1"
kono
parents:
diff changeset
1962 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1963
kono
parents:
diff changeset
1964 (define_insn "vec_unpacks_lo_v4si"
kono
parents:
diff changeset
1965 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
1966 (sign_extend:V2DI
kono
parents:
diff changeset
1967 (vec_select:V2SI
kono
parents:
diff changeset
1968 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1969 (parallel [(const_int 2)(const_int 3)]))))]
kono
parents:
diff changeset
1970 "TARGET_VX"
kono
parents:
diff changeset
1971 "vuplf\t%0,%1"
kono
parents:
diff changeset
1972 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1973
kono
parents:
diff changeset
1974 ; unsigned
kono
parents:
diff changeset
1975
kono
parents:
diff changeset
1976 (define_insn "vec_unpacku_hi_v4si"
kono
parents:
diff changeset
1977 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
1978 (zero_extend:V2DI
kono
parents:
diff changeset
1979 (vec_select:V2SI
kono
parents:
diff changeset
1980 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1981 (parallel [(const_int 0)(const_int 1)]))))]
kono
parents:
diff changeset
1982 "TARGET_VX"
kono
parents:
diff changeset
1983 "vuplhf\t%0,%1"
kono
parents:
diff changeset
1984 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1985
kono
parents:
diff changeset
1986 (define_insn "vec_unpacku_lo_v4si"
kono
parents:
diff changeset
1987 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
1988 (zero_extend:V2DI
kono
parents:
diff changeset
1989 (vec_select:V2SI
kono
parents:
diff changeset
1990 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1991 (parallel [(const_int 2)(const_int 3)]))))]
kono
parents:
diff changeset
1992 "TARGET_VX"
kono
parents:
diff changeset
1993 "vupllf\t%0,%1"
kono
parents:
diff changeset
1994 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
1995
kono
parents:
diff changeset
1996 ;; vector load lengthened
kono
parents:
diff changeset
1997
kono
parents:
diff changeset
1998 ; vflls float -> double
kono
parents:
diff changeset
1999 (define_insn "*vec_extendv4sf"
kono
parents:
diff changeset
2000 [(set (match_operand:V2DF 0 "register_operand" "=v")
kono
parents:
diff changeset
2001 (float_extend:V2DF
kono
parents:
diff changeset
2002 (vec_select:V2SF
kono
parents:
diff changeset
2003 (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2004 (parallel [(const_int 0) (const_int 2)]))))]
kono
parents:
diff changeset
2005 "TARGET_VX"
kono
parents:
diff changeset
2006 "vldeb\t%v0,%v1"
kono
parents:
diff changeset
2007 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
2008
kono
parents:
diff changeset
2009 (define_expand "vec_unpacks_lo_v4sf"
kono
parents:
diff changeset
2010 [(set (match_dup 2)
kono
parents:
diff changeset
2011 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2012 (match_dup 1)]
kono
parents:
diff changeset
2013 UNSPEC_VEC_MERGEL))
kono
parents:
diff changeset
2014 (set (match_operand:V2DF 0 "register_operand" "=v")
kono
parents:
diff changeset
2015 (float_extend:V2DF
kono
parents:
diff changeset
2016 (vec_select:V2SF
kono
parents:
diff changeset
2017 (match_dup 2)
kono
parents:
diff changeset
2018 (parallel [(const_int 0) (const_int 2)]))))]
kono
parents:
diff changeset
2019 "TARGET_VX"
kono
parents:
diff changeset
2020 { operands[2] = gen_reg_rtx(V4SFmode); })
kono
parents:
diff changeset
2021
kono
parents:
diff changeset
2022 (define_expand "vec_unpacks_hi_v4sf"
kono
parents:
diff changeset
2023 [(set (match_dup 2)
kono
parents:
diff changeset
2024 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2025 (match_dup 1)]
kono
parents:
diff changeset
2026 UNSPEC_VEC_MERGEH))
kono
parents:
diff changeset
2027 (set (match_operand:V2DF 0 "register_operand" "=v")
kono
parents:
diff changeset
2028 (float_extend:V2DF
kono
parents:
diff changeset
2029 (vec_select:V2SF
kono
parents:
diff changeset
2030 (match_dup 2)
kono
parents:
diff changeset
2031 (parallel [(const_int 0) (const_int 2)]))))]
kono
parents:
diff changeset
2032 "TARGET_VX"
kono
parents:
diff changeset
2033 { operands[2] = gen_reg_rtx(V4SFmode); })
kono
parents:
diff changeset
2034
kono
parents:
diff changeset
2035
kono
parents:
diff changeset
2036 ; double -> long double
kono
parents:
diff changeset
2037 (define_insn "*vec_extendv2df"
kono
parents:
diff changeset
2038 [(set (match_operand:V1TF 0 "register_operand" "=v")
kono
parents:
diff changeset
2039 (float_extend:V1TF
kono
parents:
diff changeset
2040 (vec_select:V1DF
kono
parents:
diff changeset
2041 (match_operand:V2DF 1 "register_operand" "v")
kono
parents:
diff changeset
2042 (parallel [(const_int 0)]))))]
kono
parents:
diff changeset
2043 "TARGET_VXE"
kono
parents:
diff changeset
2044 "wflld\t%v0,%v1"
kono
parents:
diff changeset
2045 [(set_attr "op_type" "VRR")])
kono
parents:
diff changeset
2046
kono
parents:
diff changeset
2047 (define_expand "vec_unpacks_lo_v2df"
kono
parents:
diff changeset
2048 [(set (match_dup 2)
kono
parents:
diff changeset
2049 (unspec:V2DF [(match_operand:V2DF 1 "register_operand" "v")
kono
parents:
diff changeset
2050 (match_dup 1)]
kono
parents:
diff changeset
2051 UNSPEC_VEC_MERGEL))
kono
parents:
diff changeset
2052 (set (match_operand:V1TF 0 "register_operand" "=v")
kono
parents:
diff changeset
2053 (float_extend:V1TF
kono
parents:
diff changeset
2054 (vec_select:V1DF
kono
parents:
diff changeset
2055 (match_dup 2)
kono
parents:
diff changeset
2056 (parallel [(const_int 0)]))))]
kono
parents:
diff changeset
2057 "TARGET_VXE"
kono
parents:
diff changeset
2058 { operands[2] = gen_reg_rtx (V2DFmode); })
kono
parents:
diff changeset
2059
kono
parents:
diff changeset
2060 (define_expand "vec_unpacks_hi_v2df"
kono
parents:
diff changeset
2061 [(set (match_dup 2)
kono
parents:
diff changeset
2062 (unspec:V2DF [(match_operand:V2DF 1 "register_operand" "v")
kono
parents:
diff changeset
2063 (match_dup 1)]
kono
parents:
diff changeset
2064 UNSPEC_VEC_MERGEH))
kono
parents:
diff changeset
2065 (set (match_operand:V1TF 0 "register_operand" "=v")
kono
parents:
diff changeset
2066 (float_extend:V1TF
kono
parents:
diff changeset
2067 (vec_select:V1DF
kono
parents:
diff changeset
2068 (match_dup 2)
kono
parents:
diff changeset
2069 (parallel [(const_int 0)]))))]
kono
parents:
diff changeset
2070 "TARGET_VXE"
kono
parents:
diff changeset
2071 { operands[2] = gen_reg_rtx (V2DFmode); })
kono
parents:
diff changeset
2072
kono
parents:
diff changeset
2073
kono
parents:
diff changeset
2074 ; 2 x v2df -> 1 x v4sf
kono
parents:
diff changeset
2075 (define_expand "vec_pack_trunc_v2df"
kono
parents:
diff changeset
2076 [(set (match_dup 3)
kono
parents:
diff changeset
2077 (unspec:V4SF [(match_operand:V2DF 1 "register_operand" "")
kono
parents:
diff changeset
2078 (const_int VEC_INEXACT)
kono
parents:
diff changeset
2079 (const_int VEC_RND_CURRENT)]
kono
parents:
diff changeset
2080 UNSPEC_VEC_VFLR))
kono
parents:
diff changeset
2081 (set (match_dup 4)
kono
parents:
diff changeset
2082 (unspec:V4SF [(match_operand:V2DF 2 "register_operand" "")
kono
parents:
diff changeset
2083 (const_int VEC_INEXACT)
kono
parents:
diff changeset
2084 (const_int VEC_RND_CURRENT)]
kono
parents:
diff changeset
2085 UNSPEC_VEC_VFLR))
kono
parents:
diff changeset
2086 (set (match_dup 6)
kono
parents:
diff changeset
2087 (unspec:V16QI [(subreg:V16QI (match_dup 3) 0)
kono
parents:
diff changeset
2088 (subreg:V16QI (match_dup 4) 0)
kono
parents:
diff changeset
2089 (match_dup 5)]
kono
parents:
diff changeset
2090 UNSPEC_VEC_PERM))
kono
parents:
diff changeset
2091 (set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
2092 (subreg:V4SF (match_dup 6) 0))]
kono
parents:
diff changeset
2093 "TARGET_VX"
kono
parents:
diff changeset
2094 {
kono
parents:
diff changeset
2095 rtx constv, perm[16];
kono
parents:
diff changeset
2096 int i;
kono
parents:
diff changeset
2097
kono
parents:
diff changeset
2098 for (i = 0; i < 4; ++i)
kono
parents:
diff changeset
2099 {
kono
parents:
diff changeset
2100 perm[i] = GEN_INT (i);
kono
parents:
diff changeset
2101 perm[i + 4] = GEN_INT (i + 8);
kono
parents:
diff changeset
2102 perm[i + 8] = GEN_INT (i + 16);
kono
parents:
diff changeset
2103 perm[i + 12] = GEN_INT (i + 24);
kono
parents:
diff changeset
2104 }
kono
parents:
diff changeset
2105 constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
kono
parents:
diff changeset
2106
kono
parents:
diff changeset
2107 operands[3] = gen_reg_rtx (V4SFmode);
kono
parents:
diff changeset
2108 operands[4] = gen_reg_rtx (V4SFmode);
kono
parents:
diff changeset
2109 operands[5] = force_reg (V16QImode, constv);
kono
parents:
diff changeset
2110 operands[6] = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2111 })
kono
parents:
diff changeset
2112
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2113 ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2114 ; BFP <-> integer conversions
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2115 ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2116
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2117 ; signed integer to floating point
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2118
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2119 ; op2: inexact exception not suppressed (IEEE 754 2008)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2120 ; op3: according to current rounding mode
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2121 ; vcdgb, vcefb
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2122 (define_insn "float<VX_VEC_CONV_INT:mode><VX_VEC_CONV_BFP:mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2123 [(set (match_operand:VX_VEC_CONV_BFP 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2124 (float:VX_VEC_CONV_BFP (match_operand:VX_VEC_CONV_INT 1 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2125 "TARGET_VX
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2126 && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2127 "vc<VX_VEC_CONV_BFP:xde><VX_VEC_CONV_INT:bhfgq>b\t%v0,%v1,0,0"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2128 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2129
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2130 ; unsigned integer to floating point
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2131
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2132 ; op2: inexact exception not suppressed (IEEE 754 2008)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2133 ; op3: according to current rounding mode
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2134 ; vcdlgb, vcelfb
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2135 (define_insn "floatuns<VX_VEC_CONV_INT:mode><VX_VEC_CONV_BFP:mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2136 [(set (match_operand:VX_VEC_CONV_BFP 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2137 (unsigned_float:VX_VEC_CONV_BFP (match_operand:VX_VEC_CONV_INT 1 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2138 "TARGET_VX
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2139 && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2140 "vc<VX_VEC_CONV_BFP:xde>l<VX_VEC_CONV_INT:bhfgq>b\t%v0,%v1,0,0"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2141 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2142
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2143 ; floating point to signed integer
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2144
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2145 ; op2: inexact exception not suppressed (IEEE 754 2008)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2146 ; op3: rounding mode 5 (round towards 0 C11 6.3.1.4)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2147 ; vcgdb, vcfeb
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2148 (define_insn "fix_trunc<VX_VEC_CONV_BFP:mode><VX_VEC_CONV_INT:mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2149 [(set (match_operand:VX_VEC_CONV_INT 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2150 (fix:VX_VEC_CONV_INT (match_operand:VX_VEC_CONV_BFP 1 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2151 "TARGET_VX
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2152 && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2153 "vc<VX_VEC_CONV_INT:bhfgq><VX_VEC_CONV_BFP:xde>b\t%v0,%v1,0,5"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2154 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2155
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2156 ; floating point to unsigned integer
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2157
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2158 ; op2: inexact exception not suppressed (IEEE 754 2008)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2159 ; op3: rounding mode 5 (round towards 0 C11 6.3.1.4)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2160 ; vclgdb, vclfeb
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2161 (define_insn "fixuns_trunc<VX_VEC_CONV_BFP:mode><VX_VEC_CONV_INT:mode>2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2162 [(set (match_operand:VX_VEC_CONV_INT 0 "register_operand" "=v")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2163 (unsigned_fix:VX_VEC_CONV_INT (match_operand:VX_VEC_CONV_BFP 1 "register_operand" "v")))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2164 "TARGET_VX
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2165 && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2166 "vcl<VX_VEC_CONV_INT:bhfgq><VX_VEC_CONV_BFP:xde>b\t%v0,%v1,0,5"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2167 [(set_attr "op_type" "VRR")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2168
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2169 ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2170 ; Vector byte swap patterns
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2171 ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2172
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2173 ; FIXME: The bswap rtl standard name currently does not appear to be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2174 ; used for vector modes.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2175 (define_expand "bswap<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2176 [(parallel
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2177 [(set (match_operand:VT_HW_HSDT 0 "nonimmediate_operand" "")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2178 (bswap:VT_HW_HSDT (match_operand:VT_HW_HSDT 1 "nonimmediate_operand" "")))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2179 (use (match_dup 2))])]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2180 "TARGET_VX"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2181 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2182 static char p[4][16] =
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2183 { { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 }, /* H */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2184 { 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12 }, /* S */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2185 { 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 }, /* D */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2186 { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } }; /* T */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2187 char *perm;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2188 rtx perm_rtx[16];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2189
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2190 switch (GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2191 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2192 case 2: perm = p[0]; break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2193 case 4: perm = p[1]; break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2194 case 8: perm = p[2]; break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2195 case 16: perm = p[3]; break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2196 default: gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2197 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2198 for (int i = 0; i < 16; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2199 perm_rtx[i] = GEN_INT (perm[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2200
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2201 operands[2] = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm_rtx));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2202
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2203 /* Without vxe2 we do not have byte swap instructions dealing
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2204 directly with memory operands. So instead of waiting until
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2205 reload to fix that up switch over to vector permute right
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2206 now. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2207 if (!TARGET_VXE2)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2208 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2209 rtx in = force_reg (V16QImode, simplify_gen_subreg (V16QImode, operands[1], <MODE>mode, 0));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2210 rtx permute = force_reg (V16QImode, force_const_mem (V16QImode, operands[2]));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2211 rtx out = gen_reg_rtx (V16QImode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2212
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2213 emit_insn (gen_vec_permv16qi (out, in, in, permute));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2214 emit_move_insn (operands[0], simplify_gen_subreg (<MODE>mode, out, V16QImode, 0));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2215 DONE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2216 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2217 })
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2218
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2219 ; Switching late to the reg-reg variant requires the vector permute
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2220 ; pattern to be pushed into literal pool and allocating a vector
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2221 ; register to load it into. We rely on both being provided by LRA
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2222 ; when fixing up the v constraint for operand 2.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2223
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2224 ; permute_pattern_operand: general_operand would reject the permute
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2225 ; pattern constants since these are not accepted by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2226 ; s390_legimitate_constant_p
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2227
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2228 ; ^R: Prevent these alternatives from being chosen if it would require
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2229 ; pushing the operand into memory first
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2230
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2231 ; vlbrh, vlbrf, vlbrg, vlbrq, vstbrh, vstbrf, vstbrg, vstbrq
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2232 (define_insn_and_split "*bswap<mode>"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2233 [(set (match_operand:VT_HW_HSDT 0 "nonimmediate_operand" "=v, v,^R")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2234 (bswap:VT_HW_HSDT (match_operand:VT_HW_HSDT 1 "nonimmediate_operand" "v,^R, v")))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2235 (use (match_operand:V16QI 2 "permute_pattern_operand" "v, X, X"))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2236 "TARGET_VXE2"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2237 "@
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2238 #
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2239 vlbr<bhfgq>\t%v0,%v1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2240 vstbr<bhfgq>\t%v1,%v0"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2241 "&& reload_completed
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2242 && !memory_operand (operands[0], <MODE>mode)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2243 && !memory_operand (operands[1], <MODE>mode)"
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2244 [(set (match_dup 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2245 (subreg:VT_HW_HSDT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2246 (unspec:V16QI [(subreg:V16QI (match_dup 1) 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2247 (subreg:V16QI (match_dup 1) 0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2248 (match_dup 2)]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2249 UNSPEC_VEC_PERM) 0))]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2250 ""
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2251 [(set_attr "op_type" "*,VRX,VRX")])
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2252
111
kono
parents:
diff changeset
2253 ; reduc_smin
kono
parents:
diff changeset
2254 ; reduc_smax
kono
parents:
diff changeset
2255 ; reduc_umin
kono
parents:
diff changeset
2256 ; reduc_umax
kono
parents:
diff changeset
2257
kono
parents:
diff changeset
2258 ; vec_pack_sfix_trunc: convert + pack ?
kono
parents:
diff changeset
2259 ; vec_pack_ufix_trunc
kono
parents:
diff changeset
2260 ; vec_unpacks_float_hi
kono
parents:
diff changeset
2261 ; vec_unpacks_float_lo
kono
parents:
diff changeset
2262 ; vec_unpacku_float_hi
kono
parents:
diff changeset
2263 ; vec_unpacku_float_lo