dfp.md revision 1.6.4.2 1 1.1 mrg ;; Decimal Floating Point (DFP) patterns.
2 1.6.4.2 martin ;; Copyright (C) 2007-2017 Free Software Foundation, Inc.
3 1.1 mrg ;; Contributed by Ben Elliston (bje (a] au.ibm.com) and Peter Bergner
4 1.1 mrg ;; (bergner (a] vnet.ibm.com).
5 1.1 mrg
6 1.1 mrg ;; This file is part of GCC.
7 1.1 mrg
8 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify it
9 1.1 mrg ;; under the terms of the GNU General Public License as published
10 1.1 mrg ;; by the Free Software Foundation; either version 3, or (at your
11 1.1 mrg ;; option) any later version.
12 1.1 mrg
13 1.1 mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT
14 1.1 mrg ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 1.1 mrg ;; License for more details.
17 1.1 mrg
18 1.1 mrg ;; You should have received a copy of the GNU General Public License
19 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
20 1.1 mrg ;; <http://www.gnu.org/licenses/>.
21 1.1 mrg
22 1.1 mrg ;;
23 1.1 mrg ;; UNSPEC usage
24 1.1 mrg ;;
25 1.1 mrg
26 1.3 mrg (define_c_enum "unspec"
27 1.3 mrg [UNSPEC_MOVSD_LOAD
28 1.3 mrg UNSPEC_MOVSD_STORE
29 1.1 mrg ])
30 1.1 mrg
31 1.1 mrg
32 1.1 mrg (define_insn "movsd_store"
33 1.1 mrg [(set (match_operand:DD 0 "nonimmediate_operand" "=m")
34 1.1 mrg (unspec:DD [(match_operand:SD 1 "input_operand" "d")]
35 1.1 mrg UNSPEC_MOVSD_STORE))]
36 1.1 mrg "(gpc_reg_operand (operands[0], DDmode)
37 1.1 mrg || gpc_reg_operand (operands[1], SDmode))
38 1.1 mrg && TARGET_HARD_FLOAT && TARGET_FPRS"
39 1.1 mrg "stfd%U0%X0 %1,%0"
40 1.5 mrg [(set_attr "type" "fpstore")
41 1.1 mrg (set_attr "length" "4")])
42 1.1 mrg
43 1.1 mrg (define_insn "movsd_load"
44 1.1 mrg [(set (match_operand:SD 0 "nonimmediate_operand" "=f")
45 1.1 mrg (unspec:SD [(match_operand:DD 1 "input_operand" "m")]
46 1.1 mrg UNSPEC_MOVSD_LOAD))]
47 1.1 mrg "(gpc_reg_operand (operands[0], SDmode)
48 1.1 mrg || gpc_reg_operand (operands[1], DDmode))
49 1.1 mrg && TARGET_HARD_FLOAT && TARGET_FPRS"
50 1.1 mrg "lfd%U1%X1 %0,%1"
51 1.5 mrg [(set_attr "type" "fpload")
52 1.1 mrg (set_attr "length" "4")])
53 1.1 mrg
54 1.1 mrg ;; Hardware support for decimal floating point operations.
55 1.1 mrg
56 1.1 mrg (define_insn "extendsddd2"
57 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
58 1.1 mrg (float_extend:DD (match_operand:SD 1 "gpc_reg_operand" "f")))]
59 1.1 mrg "TARGET_DFP"
60 1.1 mrg "dctdp %0,%1"
61 1.6.4.1 christos [(set_attr "type" "dfp")])
62 1.1 mrg
63 1.1 mrg (define_expand "extendsdtd2"
64 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
65 1.1 mrg (float_extend:TD (match_operand:SD 1 "gpc_reg_operand" "d")))]
66 1.1 mrg "TARGET_DFP"
67 1.1 mrg {
68 1.1 mrg rtx tmp = gen_reg_rtx (DDmode);
69 1.1 mrg emit_insn (gen_extendsddd2 (tmp, operands[1]));
70 1.1 mrg emit_insn (gen_extendddtd2 (operands[0], tmp));
71 1.1 mrg DONE;
72 1.1 mrg })
73 1.1 mrg
74 1.1 mrg (define_insn "truncddsd2"
75 1.1 mrg [(set (match_operand:SD 0 "gpc_reg_operand" "=f")
76 1.1 mrg (float_truncate:SD (match_operand:DD 1 "gpc_reg_operand" "d")))]
77 1.1 mrg "TARGET_DFP"
78 1.1 mrg "drsp %0,%1"
79 1.6.4.1 christos [(set_attr "type" "dfp")])
80 1.1 mrg
81 1.1 mrg (define_expand "negdd2"
82 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "")
83 1.1 mrg (neg:DD (match_operand:DD 1 "gpc_reg_operand" "")))]
84 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
85 1.1 mrg "")
86 1.1 mrg
87 1.1 mrg (define_insn "*negdd2_fpr"
88 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
89 1.1 mrg (neg:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
90 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
91 1.1 mrg "fneg %0,%1"
92 1.6.4.1 christos [(set_attr "type" "fpsimple")])
93 1.1 mrg
94 1.1 mrg (define_expand "absdd2"
95 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "")
96 1.1 mrg (abs:DD (match_operand:DD 1 "gpc_reg_operand" "")))]
97 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
98 1.1 mrg "")
99 1.1 mrg
100 1.1 mrg (define_insn "*absdd2_fpr"
101 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
102 1.1 mrg (abs:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
103 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
104 1.1 mrg "fabs %0,%1"
105 1.6.4.1 christos [(set_attr "type" "fpsimple")])
106 1.1 mrg
107 1.1 mrg (define_insn "*nabsdd2_fpr"
108 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
109 1.1 mrg (neg:DD (abs:DD (match_operand:DD 1 "gpc_reg_operand" "d"))))]
110 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
111 1.1 mrg "fnabs %0,%1"
112 1.6.4.1 christos [(set_attr "type" "fpsimple")])
113 1.1 mrg
114 1.1 mrg (define_expand "negtd2"
115 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "")
116 1.1 mrg (neg:TD (match_operand:TD 1 "gpc_reg_operand" "")))]
117 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
118 1.1 mrg "")
119 1.1 mrg
120 1.1 mrg (define_insn "*negtd2_fpr"
121 1.3 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
122 1.3 mrg (neg:TD (match_operand:TD 1 "gpc_reg_operand" "0,d")))]
123 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
124 1.3 mrg "@
125 1.3 mrg fneg %0,%1
126 1.3 mrg fneg %0,%1\;fmr %L0,%L1"
127 1.6.4.1 christos [(set_attr "type" "fpsimple")
128 1.3 mrg (set_attr "length" "4,8")])
129 1.1 mrg
130 1.1 mrg (define_expand "abstd2"
131 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "")
132 1.1 mrg (abs:TD (match_operand:TD 1 "gpc_reg_operand" "")))]
133 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
134 1.1 mrg "")
135 1.1 mrg
136 1.1 mrg (define_insn "*abstd2_fpr"
137 1.3 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
138 1.3 mrg (abs:TD (match_operand:TD 1 "gpc_reg_operand" "0,d")))]
139 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
140 1.3 mrg "@
141 1.3 mrg fabs %0,%1
142 1.3 mrg fabs %0,%1\;fmr %L0,%L1"
143 1.6.4.1 christos [(set_attr "type" "fpsimple")
144 1.3 mrg (set_attr "length" "4,8")])
145 1.1 mrg
146 1.1 mrg (define_insn "*nabstd2_fpr"
147 1.3 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
148 1.3 mrg (neg:TD (abs:TD (match_operand:TD 1 "gpc_reg_operand" "0,d"))))]
149 1.1 mrg "TARGET_HARD_FLOAT && TARGET_FPRS"
150 1.3 mrg "@
151 1.3 mrg fnabs %0,%1
152 1.3 mrg fnabs %0,%1\;fmr %L0,%L1"
153 1.6.4.1 christos [(set_attr "type" "fpsimple")
154 1.3 mrg (set_attr "length" "4,8")])
155 1.1 mrg
156 1.1 mrg ;; Hardware support for decimal floating point operations.
157 1.1 mrg
158 1.1 mrg (define_insn "extendddtd2"
159 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
160 1.1 mrg (float_extend:TD (match_operand:DD 1 "gpc_reg_operand" "d")))]
161 1.1 mrg "TARGET_DFP"
162 1.1 mrg "dctqpq %0,%1"
163 1.6.4.1 christos [(set_attr "type" "dfp")])
164 1.1 mrg
165 1.1 mrg ;; The result of drdpq is an even/odd register pair with the converted
166 1.1 mrg ;; value in the even register and zero in the odd register.
167 1.1 mrg ;; FIXME: Avoid the register move by using a reload constraint to ensure
168 1.1 mrg ;; that the result is the first of the pair receiving the result of drdpq.
169 1.1 mrg
170 1.1 mrg (define_insn "trunctddd2"
171 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
172 1.1 mrg (float_truncate:DD (match_operand:TD 1 "gpc_reg_operand" "d")))
173 1.1 mrg (clobber (match_scratch:TD 2 "=d"))]
174 1.1 mrg "TARGET_DFP"
175 1.1 mrg "drdpq %2,%1\;fmr %0,%2"
176 1.6.4.2 martin [(set_attr "type" "dfp")
177 1.6.4.2 martin (set_attr "length" "8")])
178 1.1 mrg
179 1.1 mrg (define_insn "adddd3"
180 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
181 1.1 mrg (plus:DD (match_operand:DD 1 "gpc_reg_operand" "%d")
182 1.1 mrg (match_operand:DD 2 "gpc_reg_operand" "d")))]
183 1.1 mrg "TARGET_DFP"
184 1.1 mrg "dadd %0,%1,%2"
185 1.6.4.1 christos [(set_attr "type" "dfp")])
186 1.1 mrg
187 1.1 mrg (define_insn "addtd3"
188 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
189 1.1 mrg (plus:TD (match_operand:TD 1 "gpc_reg_operand" "%d")
190 1.1 mrg (match_operand:TD 2 "gpc_reg_operand" "d")))]
191 1.1 mrg "TARGET_DFP"
192 1.1 mrg "daddq %0,%1,%2"
193 1.6.4.1 christos [(set_attr "type" "dfp")])
194 1.1 mrg
195 1.1 mrg (define_insn "subdd3"
196 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
197 1.1 mrg (minus:DD (match_operand:DD 1 "gpc_reg_operand" "d")
198 1.1 mrg (match_operand:DD 2 "gpc_reg_operand" "d")))]
199 1.1 mrg "TARGET_DFP"
200 1.1 mrg "dsub %0,%1,%2"
201 1.6.4.1 christos [(set_attr "type" "dfp")])
202 1.1 mrg
203 1.1 mrg (define_insn "subtd3"
204 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
205 1.1 mrg (minus:TD (match_operand:TD 1 "gpc_reg_operand" "d")
206 1.1 mrg (match_operand:TD 2 "gpc_reg_operand" "d")))]
207 1.1 mrg "TARGET_DFP"
208 1.1 mrg "dsubq %0,%1,%2"
209 1.6.4.1 christos [(set_attr "type" "dfp")])
210 1.1 mrg
211 1.1 mrg (define_insn "muldd3"
212 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
213 1.1 mrg (mult:DD (match_operand:DD 1 "gpc_reg_operand" "%d")
214 1.1 mrg (match_operand:DD 2 "gpc_reg_operand" "d")))]
215 1.1 mrg "TARGET_DFP"
216 1.1 mrg "dmul %0,%1,%2"
217 1.6.4.1 christos [(set_attr "type" "dfp")])
218 1.1 mrg
219 1.1 mrg (define_insn "multd3"
220 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
221 1.1 mrg (mult:TD (match_operand:TD 1 "gpc_reg_operand" "%d")
222 1.1 mrg (match_operand:TD 2 "gpc_reg_operand" "d")))]
223 1.1 mrg "TARGET_DFP"
224 1.1 mrg "dmulq %0,%1,%2"
225 1.6.4.1 christos [(set_attr "type" "dfp")])
226 1.1 mrg
227 1.1 mrg (define_insn "divdd3"
228 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
229 1.1 mrg (div:DD (match_operand:DD 1 "gpc_reg_operand" "d")
230 1.1 mrg (match_operand:DD 2 "gpc_reg_operand" "d")))]
231 1.1 mrg "TARGET_DFP"
232 1.1 mrg "ddiv %0,%1,%2"
233 1.6.4.1 christos [(set_attr "type" "dfp")])
234 1.1 mrg
235 1.1 mrg (define_insn "divtd3"
236 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
237 1.1 mrg (div:TD (match_operand:TD 1 "gpc_reg_operand" "d")
238 1.1 mrg (match_operand:TD 2 "gpc_reg_operand" "d")))]
239 1.1 mrg "TARGET_DFP"
240 1.1 mrg "ddivq %0,%1,%2"
241 1.6.4.1 christos [(set_attr "type" "dfp")])
242 1.1 mrg
243 1.1 mrg (define_insn "*cmpdd_internal1"
244 1.1 mrg [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
245 1.1 mrg (compare:CCFP (match_operand:DD 1 "gpc_reg_operand" "d")
246 1.1 mrg (match_operand:DD 2 "gpc_reg_operand" "d")))]
247 1.1 mrg "TARGET_DFP"
248 1.1 mrg "dcmpu %0,%1,%2"
249 1.6.4.1 christos [(set_attr "type" "dfp")])
250 1.1 mrg
251 1.1 mrg (define_insn "*cmptd_internal1"
252 1.1 mrg [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
253 1.1 mrg (compare:CCFP (match_operand:TD 1 "gpc_reg_operand" "d")
254 1.1 mrg (match_operand:TD 2 "gpc_reg_operand" "d")))]
255 1.1 mrg "TARGET_DFP"
256 1.1 mrg "dcmpuq %0,%1,%2"
257 1.6.4.1 christos [(set_attr "type" "dfp")])
258 1.1 mrg
259 1.3 mrg (define_insn "floatdidd2"
260 1.3 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
261 1.3 mrg (float:DD (match_operand:DI 1 "gpc_reg_operand" "d")))]
262 1.3 mrg "TARGET_DFP && TARGET_POPCNTD"
263 1.3 mrg "dcffix %0,%1"
264 1.6.4.1 christos [(set_attr "type" "dfp")])
265 1.3 mrg
266 1.1 mrg (define_insn "floatditd2"
267 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
268 1.1 mrg (float:TD (match_operand:DI 1 "gpc_reg_operand" "d")))]
269 1.1 mrg "TARGET_DFP"
270 1.1 mrg "dcffixq %0,%1"
271 1.6.4.1 christos [(set_attr "type" "dfp")])
272 1.1 mrg
273 1.1 mrg ;; Convert a decimal64 to a decimal64 whose value is an integer.
274 1.1 mrg ;; This is the first stage of converting it to an integer type.
275 1.1 mrg
276 1.1 mrg (define_insn "ftruncdd2"
277 1.1 mrg [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
278 1.1 mrg (fix:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
279 1.1 mrg "TARGET_DFP"
280 1.1 mrg "drintn. 0,%0,%1,1"
281 1.6.4.1 christos [(set_attr "type" "dfp")])
282 1.1 mrg
283 1.1 mrg ;; Convert a decimal64 whose value is an integer to an actual integer.
284 1.1 mrg ;; This is the second stage of converting decimal float to integer type.
285 1.1 mrg
286 1.1 mrg (define_insn "fixdddi2"
287 1.1 mrg [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
288 1.1 mrg (fix:DI (match_operand:DD 1 "gpc_reg_operand" "d")))]
289 1.1 mrg "TARGET_DFP"
290 1.1 mrg "dctfix %0,%1"
291 1.6.4.1 christos [(set_attr "type" "dfp")])
292 1.1 mrg
293 1.1 mrg ;; Convert a decimal128 to a decimal128 whose value is an integer.
294 1.1 mrg ;; This is the first stage of converting it to an integer type.
295 1.1 mrg
296 1.1 mrg (define_insn "ftrunctd2"
297 1.1 mrg [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
298 1.1 mrg (fix:TD (match_operand:TD 1 "gpc_reg_operand" "d")))]
299 1.1 mrg "TARGET_DFP"
300 1.1 mrg "drintnq. 0,%0,%1,1"
301 1.6.4.1 christos [(set_attr "type" "dfp")])
302 1.1 mrg
303 1.1 mrg ;; Convert a decimal128 whose value is an integer to an actual integer.
304 1.1 mrg ;; This is the second stage of converting decimal float to integer type.
305 1.1 mrg
306 1.1 mrg (define_insn "fixtddi2"
307 1.1 mrg [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
308 1.1 mrg (fix:DI (match_operand:TD 1 "gpc_reg_operand" "d")))]
309 1.1 mrg "TARGET_DFP"
310 1.1 mrg "dctfixq %0,%1"
311 1.6.4.1 christos [(set_attr "type" "dfp")])
312 1.3 mrg
313 1.3 mrg
315 1.3 mrg ;; Decimal builtin support
316 1.3 mrg
317 1.3 mrg (define_c_enum "unspec"
318 1.3 mrg [UNSPEC_DDEDPD
319 1.3 mrg UNSPEC_DENBCD
320 1.3 mrg UNSPEC_DXEX
321 1.3 mrg UNSPEC_DIEX
322 1.6.4.1 christos UNSPEC_DSCLI
323 1.3 mrg UNSPEC_DTSTSFI
324 1.3 mrg UNSPEC_DSCRI])
325 1.6.4.1 christos
326 1.6.4.1 christos (define_code_iterator DFP_TEST [eq lt gt unordered])
327 1.3 mrg
328 1.3 mrg (define_mode_iterator D64_D128 [DD TD])
329 1.3 mrg
330 1.3 mrg (define_mode_attr dfp_suffix [(DD "")
331 1.3 mrg (TD "q")])
332 1.3 mrg
333 1.3 mrg (define_insn "dfp_ddedpd_<mode>"
334 1.3 mrg [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
335 1.3 mrg (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_3_operand" "i")
336 1.3 mrg (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
337 1.3 mrg UNSPEC_DDEDPD))]
338 1.3 mrg "TARGET_DFP"
339 1.6.4.1 christos "ddedpd<dfp_suffix> %1,%0,%2"
340 1.3 mrg [(set_attr "type" "dfp")])
341 1.3 mrg
342 1.3 mrg (define_insn "dfp_denbcd_<mode>"
343 1.3 mrg [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
344 1.3 mrg (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_1_operand" "i")
345 1.3 mrg (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
346 1.3 mrg UNSPEC_DENBCD))]
347 1.3 mrg "TARGET_DFP"
348 1.6.4.1 christos "denbcd<dfp_suffix> %1,%0,%2"
349 1.3 mrg [(set_attr "type" "dfp")])
350 1.3 mrg
351 1.6 mrg (define_insn "dfp_dxex_<mode>"
352 1.6 mrg [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
353 1.6 mrg (unspec:DI [(match_operand:D64_D128 1 "gpc_reg_operand" "d")]
354 1.3 mrg UNSPEC_DXEX))]
355 1.3 mrg "TARGET_DFP"
356 1.6.4.1 christos "dxex<dfp_suffix> %0,%1"
357 1.3 mrg [(set_attr "type" "dfp")])
358 1.3 mrg
359 1.3 mrg (define_insn "dfp_diex_<mode>"
360 1.6 mrg [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
361 1.3 mrg (unspec:D64_D128 [(match_operand:DI 1 "gpc_reg_operand" "d")
362 1.3 mrg (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
363 1.3 mrg UNSPEC_DXEX))]
364 1.3 mrg "TARGET_DFP"
365 1.6.4.1 christos "diex<dfp_suffix> %0,%1,%2"
366 1.6.4.1 christos [(set_attr "type" "dfp")])
367 1.6.4.1 christos
368 1.6.4.1 christos (define_expand "dfptstsfi_<code>_<mode>"
369 1.6.4.1 christos [(set (match_dup 3)
370 1.6.4.1 christos (compare:CCFP
371 1.6.4.1 christos (unspec:D64_D128
372 1.6.4.1 christos [(match_operand:SI 1 "const_int_operand" "n")
373 1.6.4.1 christos (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
374 1.6.4.1 christos UNSPEC_DTSTSFI)
375 1.6.4.1 christos (match_dup 4)))
376 1.6.4.1 christos (set (match_operand:SI 0 "register_operand" "")
377 1.6.4.1 christos (DFP_TEST:SI (match_dup 3)
378 1.6.4.1 christos (const_int 0)))
379 1.6.4.1 christos ]
380 1.6.4.1 christos "TARGET_P9_MISC"
381 1.6.4.1 christos {
382 1.6.4.1 christos operands[3] = gen_reg_rtx (CCFPmode);
383 1.6.4.1 christos operands[4] = const0_rtx;
384 1.6.4.1 christos })
385 1.6.4.1 christos
386 1.6.4.1 christos (define_insn "*dfp_sgnfcnc_<mode>"
387 1.6.4.1 christos [(set (match_operand:CCFP 0 "" "=y")
388 1.6.4.1 christos (compare:CCFP
389 1.6.4.1 christos (unspec:D64_D128 [(match_operand:SI 1 "const_int_operand" "n")
390 1.6.4.1 christos (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
391 1.6.4.1 christos UNSPEC_DTSTSFI)
392 1.6.4.1 christos (match_operand:SI 3 "zero_constant" "j")))]
393 1.6.4.1 christos "TARGET_P9_MISC"
394 1.6.4.1 christos {
395 1.6.4.1 christos /* If immediate operand is greater than 63, it will behave as if
396 1.6.4.1 christos the value had been 63. The code generator does not support
397 1.6.4.1 christos immediate operand values greater than 63. */
398 1.6.4.1 christos if (!(IN_RANGE (INTVAL (operands[1]), 0, 63)))
399 1.6.4.1 christos operands[1] = GEN_INT (63);
400 1.6.4.1 christos return "dtstsfi<dfp_suffix> %0,%1,%2";
401 1.3 mrg }
402 1.3 mrg [(set_attr "type" "fp")])
403 1.3 mrg
404 1.3 mrg (define_insn "dfp_dscli_<mode>"
405 1.3 mrg [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
406 1.3 mrg (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
407 1.3 mrg (match_operand:QI 2 "immediate_operand" "i")]
408 1.3 mrg UNSPEC_DSCLI))]
409 1.3 mrg "TARGET_DFP"
410 1.6.4.1 christos "dscli<dfp_suffix> %0,%1,%2"
411 1.3 mrg [(set_attr "type" "dfp")])
412 1.3 mrg
413 1.3 mrg (define_insn "dfp_dscri_<mode>"
414 1.3 mrg [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
415 1.3 mrg (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
416 1.3 mrg (match_operand:QI 2 "immediate_operand" "i")]
417 1.3 mrg UNSPEC_DSCRI))]
418 1.3 mrg "TARGET_DFP"
419 1.6.4.1 christos "dscri<dfp_suffix> %0,%1,%2"
420 [(set_attr "type" "dfp")])
421