1;; Copyright (C) 2007-2015 Free Software Foundation, Inc.
2;;
3;; This file is part of GCC.
4;;
5;; GCC is free software; you can redistribute it and/or modify
6;; it under the terms of the GNU General Public License as published by
7;; the Free Software Foundation; either version 3, or (at your option)
8;; any later version.
9;;
10;; GCC is distributed in the hope that it will be useful,
11;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13;; GNU General Public License for more details.
14;;
15;; You should have received a copy of the GNU General Public License
16;; along with GCC; see the file COPYING3.  If not see
17;; <http://www.gnu.org/licenses/>.
18;;
19; MIPS DSP ASE REV 2 Revision 0.02 11/24/2006
20
21(define_c_enum "unspec" [
22  UNSPEC_ABSQ_S_QB
23  UNSPEC_ADDU_PH
24  UNSPEC_ADDU_S_PH
25  UNSPEC_ADDUH_QB
26  UNSPEC_ADDUH_R_QB
27  UNSPEC_APPEND
28  UNSPEC_BALIGN
29  UNSPEC_CMPGDU_EQ_QB
30  UNSPEC_CMPGDU_LT_QB
31  UNSPEC_CMPGDU_LE_QB
32  UNSPEC_DPA_W_PH
33  UNSPEC_DPS_W_PH
34  UNSPEC_MADD
35  UNSPEC_MADDU
36  UNSPEC_MSUB
37  UNSPEC_MSUBU
38  UNSPEC_MUL_PH
39  UNSPEC_MUL_S_PH
40  UNSPEC_MULQ_RS_W
41  UNSPEC_MULQ_S_PH
42  UNSPEC_MULQ_S_W
43  UNSPEC_MULSA_W_PH
44  UNSPEC_MULT
45  UNSPEC_MULTU
46  UNSPEC_PRECR_QB_PH
47  UNSPEC_PRECR_SRA_PH_W
48  UNSPEC_PRECR_SRA_R_PH_W
49  UNSPEC_PREPEND
50  UNSPEC_SHRA_QB
51  UNSPEC_SHRA_R_QB
52  UNSPEC_SHRL_PH
53  UNSPEC_SUBU_PH
54  UNSPEC_SUBU_S_PH
55  UNSPEC_SUBUH_QB
56  UNSPEC_SUBUH_R_QB
57  UNSPEC_ADDQH_PH
58  UNSPEC_ADDQH_R_PH
59  UNSPEC_ADDQH_W
60  UNSPEC_ADDQH_R_W
61  UNSPEC_SUBQH_PH
62  UNSPEC_SUBQH_R_PH
63  UNSPEC_SUBQH_W
64  UNSPEC_SUBQH_R_W
65  UNSPEC_DPAX_W_PH
66  UNSPEC_DPSX_W_PH
67  UNSPEC_DPAQX_S_W_PH
68  UNSPEC_DPAQX_SA_W_PH
69  UNSPEC_DPSQX_S_W_PH
70  UNSPEC_DPSQX_SA_W_PH
71])
72
73(define_insn "mips_absq_s_qb"
74  [(set (match_operand:V4QI 0 "register_operand" "=d")
75	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")]
76		     UNSPEC_ABSQ_S_QB))
77   (set (reg:CCDSP CCDSP_OU_REGNUM)
78	(unspec:CCDSP [(match_dup 1)] UNSPEC_ABSQ_S_QB))]
79  "ISA_HAS_DSPR2"
80  "absq_s.qb\t%0,%z1"
81  [(set_attr "type"	"dspalusat")
82   (set_attr "mode"	"SI")])
83
84(define_insn "mips_addu_ph"
85  [(set (match_operand:V2HI 0 "register_operand" "=d")
86	(plus:V2HI (match_operand:V2HI 1 "reg_or_0_operand" "dYG")
87		   (match_operand:V2HI 2 "reg_or_0_operand" "dYG")))
88   (set (reg:CCDSP CCDSP_OU_REGNUM)
89	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_PH))]
90  "ISA_HAS_DSPR2"
91  "addu.ph\t%0,%z1,%z2"
92  [(set_attr "type"	"dspalu")
93   (set_attr "mode"	"SI")])
94
95(define_insn "mips_addu_s_ph"
96  [(set (match_operand:V2HI 0 "register_operand" "=d")
97	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
98		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
99		     UNSPEC_ADDU_S_PH))
100   (set (reg:CCDSP CCDSP_OU_REGNUM)
101	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_S_PH))]
102  "ISA_HAS_DSPR2"
103  "addu_s.ph\t%0,%z1,%z2"
104  [(set_attr "type"	"dspalusat")
105   (set_attr "mode"	"SI")])
106
107(define_insn "mips_adduh_qb"
108  [(set (match_operand:V4QI 0 "register_operand" "=d")
109	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
110		      (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
111		     UNSPEC_ADDUH_QB))]
112  "ISA_HAS_DSPR2"
113  "adduh.qb\t%0,%z1,%z2"
114  [(set_attr "type"	"dspalu")
115   (set_attr "mode"	"SI")])
116
117(define_insn "mips_adduh_r_qb"
118  [(set (match_operand:V4QI 0 "register_operand" "=d")
119	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
120		      (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
121		     UNSPEC_ADDUH_R_QB))]
122  "ISA_HAS_DSPR2"
123  "adduh_r.qb\t%0,%z1,%z2"
124  [(set_attr "type"	"dspalusat")
125   (set_attr "mode"	"SI")])
126
127(define_insn "mips_append"
128  [(set (match_operand:SI 0 "register_operand" "=d")
129	(unspec:SI [(match_operand:SI 1 "register_operand" "0")
130		    (match_operand:SI 2 "reg_or_0_operand" "dJ")
131		    (match_operand:SI 3 "const_int_operand" "n")]
132		   UNSPEC_APPEND))]
133  "ISA_HAS_DSPR2"
134{
135  if (INTVAL (operands[3]) & ~(unsigned HOST_WIDE_INT) 31)
136    operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
137  return "append\t%0,%z2,%3";
138}
139  [(set_attr "type"	"dspalu")
140   (set_attr "mode"	"SI")])
141
142(define_insn "mips_balign"
143  [(set (match_operand:SI 0 "register_operand" "=d")
144	(unspec:SI [(match_operand:SI 1 "register_operand" "0")
145		    (match_operand:SI 2 "reg_or_0_operand" "dJ")
146		    (match_operand:SI 3 "const_int_operand" "n")]
147		   UNSPEC_BALIGN))]
148  "ISA_HAS_DSPR2"
149{
150  if (INTVAL (operands[3]) & ~(unsigned HOST_WIDE_INT) 3)
151    operands[2] = GEN_INT (INTVAL (operands[2]) & 3);
152  return "balign\t%0,%z2,%3";
153}
154  [(set_attr "type"	"dspalu")
155   (set_attr "mode"	"SI")])
156
157(define_insn "mips_cmpgdu_eq_qb"
158  [(set (match_operand:SI 0 "register_operand" "=d")
159	(unspec:SI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
160		    (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
161		   UNSPEC_CMPGDU_EQ_QB))
162   (set (reg:CCDSP CCDSP_CC_REGNUM)
163	(unspec:CCDSP [(match_dup 1) (match_dup 2)
164		       (reg:CCDSP CCDSP_CC_REGNUM)]
165		      UNSPEC_CMPGDU_EQ_QB))]
166  "ISA_HAS_DSPR2"
167  "cmpgdu.eq.qb\t%0,%z1,%z2"
168  [(set_attr "type"	"dspalu")
169   (set_attr "mode"	"SI")])
170
171(define_insn "mips_cmpgdu_lt_qb"
172  [(set (match_operand:SI 0 "register_operand" "=d")
173	(unspec:SI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
174		    (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
175		   UNSPEC_CMPGDU_LT_QB))
176   (set (reg:CCDSP CCDSP_CC_REGNUM)
177	(unspec:CCDSP [(match_dup 1) (match_dup 2)
178		       (reg:CCDSP CCDSP_CC_REGNUM)]
179		      UNSPEC_CMPGDU_LT_QB))]
180  "ISA_HAS_DSPR2"
181  "cmpgdu.lt.qb\t%0,%z1,%z2"
182  [(set_attr "type"	"dspalu")
183   (set_attr "mode"	"SI")])
184
185(define_insn "mips_cmpgdu_le_qb"
186  [(set (match_operand:SI 0 "register_operand" "=d")
187	(unspec:SI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
188		    (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
189		   UNSPEC_CMPGDU_LE_QB))
190   (set (reg:CCDSP CCDSP_CC_REGNUM)
191	(unspec:CCDSP [(match_dup 1) (match_dup 2)
192		       (reg:CCDSP CCDSP_CC_REGNUM)]
193		      UNSPEC_CMPGDU_LE_QB))]
194  "ISA_HAS_DSPR2"
195  "cmpgdu.le.qb\t%0,%z1,%z2"
196  [(set_attr "type"	"dspalu")
197   (set_attr "mode"	"SI")])
198
199(define_insn "mips_dpa_w_ph"
200  [(set (match_operand:DI 0 "register_operand" "=a")
201	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
202		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
203		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
204		   UNSPEC_DPA_W_PH))]
205  "ISA_HAS_DSPR2 && !TARGET_64BIT"
206  "dpa.w.ph\t%q0,%z2,%z3"
207  [(set_attr "type"	"dspmac")
208   (set_attr "accum_in" "1")
209   (set_attr "mode"	"SI")])
210
211(define_insn "mips_dps_w_ph"
212  [(set (match_operand:DI 0 "register_operand" "=a")
213	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
214		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
215		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
216		   UNSPEC_DPS_W_PH))]
217  "ISA_HAS_DSPR2 && !TARGET_64BIT"
218  "dps.w.ph\t%q0,%z2,%z3"
219  [(set_attr "type"	"dspmac")
220   (set_attr "accum_in" "1")
221   (set_attr "mode"	"SI")])
222
223(define_insn "mulv2hi3"
224  [(set (match_operand:V2HI 0 "register_operand" "=d")
225	(mult:V2HI (match_operand:V2HI 1 "register_operand" "d")
226		   (match_operand:V2HI 2 "register_operand" "d")))
227   (set (reg:CCDSP CCDSP_OU_REGNUM)
228	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_MUL_PH))
229   (clobber (match_scratch:DI 3 "=x"))]
230  "ISA_HAS_DSPR2"
231  "mul.ph\t%0,%1,%2"
232  [(set_attr "type"	"imul3")
233   (set_attr "mode"	"SI")])
234
235(define_insn "mips_mul_s_ph"
236  [(set (match_operand:V2HI 0 "register_operand" "=d")
237	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
238		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
239		     UNSPEC_MUL_S_PH))
240   (set (reg:CCDSP CCDSP_OU_REGNUM)
241	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_MUL_S_PH))
242   (clobber (match_scratch:DI 3 "=x"))]
243  "ISA_HAS_DSPR2"
244  "mul_s.ph\t%0,%z1,%z2"
245  [(set_attr "type"	"imul3")
246   (set_attr "mode"	"SI")])
247
248(define_insn "mips_mulq_rs_w"
249  [(set (match_operand:SI 0 "register_operand" "=d")
250	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
251		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
252		   UNSPEC_MULQ_RS_W))
253   (set (reg:CCDSP CCDSP_OU_REGNUM)
254	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_MULQ_RS_W))
255   (clobber (match_scratch:DI 3 "=x"))]
256  "ISA_HAS_DSPR2"
257  "mulq_rs.w\t%0,%z1,%z2"
258  [(set_attr "type"	"imul3")
259   (set_attr "mode"	"SI")])
260
261(define_insn "mips_mulq_s_ph"
262  [(set (match_operand:V2HI 0 "register_operand" "=d")
263	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
264		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
265		     UNSPEC_MULQ_S_PH))
266   (set (reg:CCDSP CCDSP_OU_REGNUM)
267	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_MULQ_S_PH))
268   (clobber (match_scratch:DI 3 "=x"))]
269  "ISA_HAS_DSPR2"
270  "mulq_s.ph\t%0,%z1,%z2"
271  [(set_attr "type"	"imul3")
272   (set_attr "mode"	"SI")])
273
274(define_insn "mips_mulq_s_w"
275  [(set (match_operand:SI 0 "register_operand" "=d")
276	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
277		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
278		   UNSPEC_MULQ_S_W))
279   (set (reg:CCDSP CCDSP_OU_REGNUM)
280	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_MULQ_S_W))
281   (clobber (match_scratch:DI 3 "=x"))]
282  "ISA_HAS_DSPR2"
283  "mulq_s.w\t%0,%z1,%z2"
284  [(set_attr "type"	"imul3")
285   (set_attr "mode"	"SI")])
286
287(define_insn "mips_mulsa_w_ph"
288  [(set (match_operand:DI 0 "register_operand" "=a")
289	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
290		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
291		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
292		   UNSPEC_MULSA_W_PH))]
293  "ISA_HAS_DSPR2 && !TARGET_64BIT"
294  "mulsa.w.ph\t%q0,%z2,%z3"
295  [(set_attr "type"	"dspmac")
296   (set_attr "accum_in" "1")
297   (set_attr "mode"	"SI")])
298
299(define_insn "mips_precr_qb_ph"
300  [(set (match_operand:V4QI 0 "register_operand" "=d")
301	(unspec:V4QI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
302		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
303		     UNSPEC_PRECR_QB_PH))]
304  "ISA_HAS_DSPR2"
305  "precr.qb.ph\t%0,%z1,%z2"
306  [(set_attr "type"	"dspalu")
307   (set_attr "mode"	"SI")])
308
309(define_insn "mips_precr_sra_ph_w"
310  [(set (match_operand:V2HI 0 "register_operand" "=d")
311	(unspec:V2HI [(match_operand:SI 1 "register_operand" "0")
312		      (match_operand:SI 2 "reg_or_0_operand" "dJ")
313		      (match_operand:SI 3 "const_int_operand" "n")]
314		     UNSPEC_PRECR_SRA_PH_W))]
315  "ISA_HAS_DSPR2"
316{
317  if (INTVAL (operands[3]) & ~(unsigned HOST_WIDE_INT) 31)
318    operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
319  return "precr_sra.ph.w\t%0,%z2,%3";
320}
321  [(set_attr "type"	"dspalu")
322   (set_attr "mode"	"SI")])
323
324(define_insn "mips_precr_sra_r_ph_w"
325  [(set (match_operand:V2HI 0 "register_operand" "=d")
326	(unspec:V2HI [(match_operand:SI 1 "register_operand" "0")
327		      (match_operand:SI 2 "reg_or_0_operand" "dJ")
328		      (match_operand:SI 3 "const_int_operand" "n")]
329		     UNSPEC_PRECR_SRA_R_PH_W))]
330  "ISA_HAS_DSPR2"
331{
332  if (INTVAL (operands[3]) & ~(unsigned HOST_WIDE_INT) 31)
333    operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
334  return "precr_sra_r.ph.w\t%0,%z2,%3";
335}
336  [(set_attr "type"	"dspalu")
337   (set_attr "mode"	"SI")])
338
339(define_insn "mips_prepend"
340  [(set (match_operand:SI 0 "register_operand" "=d")
341	(unspec:SI [(match_operand:SI 1 "register_operand" "0")
342		    (match_operand:SI 2 "reg_or_0_operand" "dJ")
343		    (match_operand:SI 3 "const_int_operand" "n")]
344		   UNSPEC_PREPEND))]
345  "ISA_HAS_DSPR2"
346{
347  if (INTVAL (operands[3]) & ~(unsigned HOST_WIDE_INT) 31)
348    operands[3] = GEN_INT (INTVAL (operands[3]) & 31);
349  return "prepend\t%0,%z2,%3";
350}
351  [(set_attr "type"	"dspalu")
352   (set_attr "mode"	"SI")])
353
354(define_insn "mips_shra_qb"
355  [(set (match_operand:V4QI 0 "register_operand" "=d,d")
356	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG,dYG")
357		      (match_operand:SI 2 "arith_operand" "I,d")]
358		     UNSPEC_SHRA_QB))]
359  "ISA_HAS_DSPR2"
360{
361  if (which_alternative == 0)
362    {
363      if (INTVAL (operands[2]) & ~(unsigned HOST_WIDE_INT) 7)
364	operands[2] = GEN_INT (INTVAL (operands[2]) & 7);
365      return "shra.qb\t%0,%z1,%2";
366    }
367  return "shrav.qb\t%0,%z1,%2";
368}
369  [(set_attr "type"	"dspalu")
370   (set_attr "mode"	"SI")])
371
372
373(define_insn "mips_shra_r_qb"
374  [(set (match_operand:V4QI 0 "register_operand" "=d,d")
375	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG,dYG")
376		      (match_operand:SI 2 "arith_operand" "I,d")]
377		     UNSPEC_SHRA_R_QB))]
378  "ISA_HAS_DSPR2"
379{
380  if (which_alternative == 0)
381    {
382      if (INTVAL (operands[2]) & ~(unsigned HOST_WIDE_INT) 7)
383	operands[2] = GEN_INT (INTVAL (operands[2]) & 7);
384      return "shra_r.qb\t%0,%z1,%2";
385    }
386  return "shrav_r.qb\t%0,%z1,%2";
387}
388  [(set_attr "type"	"dspalu")
389   (set_attr "mode"	"SI")])
390
391(define_insn "mips_shrl_ph"
392  [(set (match_operand:V2HI 0 "register_operand" "=d,d")
393	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG,dYG")
394		      (match_operand:SI 2 "arith_operand" "I,d")]
395		     UNSPEC_SHRL_PH))]
396  "ISA_HAS_DSPR2"
397{
398  if (which_alternative == 0)
399    {
400      if (INTVAL (operands[2]) & ~(unsigned HOST_WIDE_INT) 15)
401	operands[2] = GEN_INT (INTVAL (operands[2]) & 15);
402      return "shrl.ph\t%0,%z1,%2";
403    }
404  return "shrlv.ph\t%0,%z1,%2";
405}
406  [(set_attr "type"	"dspalu")
407   (set_attr "mode"	"SI")])
408
409(define_insn "mips_subu_ph"
410  [(set (match_operand:V2HI 0 "register_operand" "=d")
411	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
412		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
413		     UNSPEC_SUBU_PH))
414   (set (reg:CCDSP CCDSP_OU_REGNUM)
415	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_PH))]
416  "ISA_HAS_DSPR2"
417  "subu.ph\t%0,%z1,%z2"
418  [(set_attr "type"	"dspalu")
419   (set_attr "mode"	"SI")])
420
421(define_insn "mips_subu_s_ph"
422  [(set (match_operand:V2HI 0 "register_operand" "=d")
423	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
424		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
425		     UNSPEC_SUBU_S_PH))
426   (set (reg:CCDSP CCDSP_OU_REGNUM)
427	(unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_S_PH))]
428  "ISA_HAS_DSPR2"
429  "subu_s.ph\t%0,%z1,%z2"
430  [(set_attr "type"	"dspalusat")
431   (set_attr "mode"	"SI")])
432
433(define_insn "mips_subuh_qb"
434  [(set (match_operand:V4QI 0 "register_operand" "=d")
435	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
436		      (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
437		     UNSPEC_SUBUH_QB))]
438  "ISA_HAS_DSPR2"
439  "subuh.qb\t%0,%z1,%z2"
440  [(set_attr "type"	"dspalu")
441   (set_attr "mode"	"SI")])
442
443(define_insn "mips_subuh_r_qb"
444  [(set (match_operand:V4QI 0 "register_operand" "=d")
445	(unspec:V4QI [(match_operand:V4QI 1 "reg_or_0_operand" "dYG")
446		      (match_operand:V4QI 2 "reg_or_0_operand" "dYG")]
447		     UNSPEC_SUBUH_R_QB))]
448  "ISA_HAS_DSPR2"
449  "subuh_r.qb\t%0,%z1,%z2"
450  [(set_attr "type"	"dspalu")
451   (set_attr "mode"	"SI")])
452
453(define_insn "mips_addqh_ph"
454  [(set (match_operand:V2HI 0 "register_operand" "=d")
455	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
456		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
457		     UNSPEC_ADDQH_PH))]
458  "ISA_HAS_DSPR2"
459  "addqh.ph\t%0,%z1,%z2"
460  [(set_attr "type"	"dspalu")
461   (set_attr "mode"	"SI")])
462
463(define_insn "mips_addqh_r_ph"
464  [(set (match_operand:V2HI 0 "register_operand" "=d")
465	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
466		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
467		     UNSPEC_ADDQH_R_PH))]
468  "ISA_HAS_DSPR2"
469  "addqh_r.ph\t%0,%z1,%z2"
470  [(set_attr "type"	"dspalu")
471   (set_attr "mode"	"SI")])
472
473(define_insn "mips_addqh_w"
474  [(set (match_operand:SI 0 "register_operand" "=d")
475	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
476		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
477		   UNSPEC_ADDQH_W))]
478  "ISA_HAS_DSPR2"
479  "addqh.w\t%0,%z1,%z2"
480  [(set_attr "type"	"dspalu")
481   (set_attr "mode"	"SI")])
482
483(define_insn "mips_addqh_r_w"
484  [(set (match_operand:SI 0 "register_operand" "=d")
485	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
486		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
487		   UNSPEC_ADDQH_R_W))]
488  "ISA_HAS_DSPR2"
489  "addqh_r.w\t%0,%z1,%z2"
490  [(set_attr "type"	"dspalu")
491   (set_attr "mode"	"SI")])
492
493(define_insn "mips_subqh_ph"
494  [(set (match_operand:V2HI 0 "register_operand" "=d")
495	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
496		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
497		     UNSPEC_SUBQH_PH))]
498  "ISA_HAS_DSPR2"
499  "subqh.ph\t%0,%z1,%z2"
500  [(set_attr "type"	"dspalu")
501   (set_attr "mode"	"SI")])
502
503(define_insn "mips_subqh_r_ph"
504  [(set (match_operand:V2HI 0 "register_operand" "=d")
505	(unspec:V2HI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
506		      (match_operand:V2HI 2 "reg_or_0_operand" "dYG")]
507		     UNSPEC_SUBQH_R_PH))]
508  "ISA_HAS_DSPR2"
509  "subqh_r.ph\t%0,%z1,%z2"
510  [(set_attr "type"	"dspalu")
511   (set_attr "mode"	"SI")])
512
513(define_insn "mips_subqh_w"
514  [(set (match_operand:SI 0 "register_operand" "=d")
515	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
516		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
517		   UNSPEC_SUBQH_W))]
518  "ISA_HAS_DSPR2"
519  "subqh.w\t%0,%z1,%z2"
520  [(set_attr "type"	"dspalu")
521   (set_attr "mode"	"SI")])
522
523(define_insn "mips_subqh_r_w"
524  [(set (match_operand:SI 0 "register_operand" "=d")
525	(unspec:SI [(match_operand:SI 1 "reg_or_0_operand" "dJ")
526		    (match_operand:SI 2 "reg_or_0_operand" "dJ")]
527		   UNSPEC_SUBQH_R_W))]
528  "ISA_HAS_DSPR2"
529  "subqh_r.w\t%0,%z1,%z2"
530  [(set_attr "type"	"dspalu")
531   (set_attr "mode"	"SI")])
532
533(define_insn "mips_dpax_w_ph"
534  [(set (match_operand:DI 0 "register_operand" "=a")
535	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
536		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
537		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
538		   UNSPEC_DPAX_W_PH))]
539  "ISA_HAS_DSPR2 && !TARGET_64BIT"
540  "dpax.w.ph\t%q0,%z2,%z3"
541  [(set_attr "type"	"dspmac")
542   (set_attr "accum_in" "1")
543   (set_attr "mode"	"SI")])
544
545(define_insn "mips_dpsx_w_ph"
546  [(set (match_operand:DI 0 "register_operand" "=a")
547	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
548		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
549		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
550		   UNSPEC_DPSX_W_PH))]
551  "ISA_HAS_DSPR2 && !TARGET_64BIT"
552  "dpsx.w.ph\t%q0,%z2,%z3"
553  [(set_attr "type"	"dspmac")
554   (set_attr "accum_in" "1")
555   (set_attr "mode"	"SI")])
556
557(define_insn "mips_dpaqx_s_w_ph"
558  [(set (match_operand:DI 0 "register_operand" "=a")
559	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
560		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
561		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
562		   UNSPEC_DPAQX_S_W_PH))
563   (set (reg:CCDSP CCDSP_OU_REGNUM)
564	(unspec:CCDSP [(match_dup 1) (match_dup 2) (match_dup 3)]
565		      UNSPEC_DPAQX_S_W_PH))]
566  "ISA_HAS_DSPR2 && !TARGET_64BIT"
567  "dpaqx_s.w.ph\t%q0,%z2,%z3"
568  [(set_attr "type"	"dspmac")
569   (set_attr "accum_in" "1")
570   (set_attr "mode"	"SI")])
571
572(define_insn "mips_dpaqx_sa_w_ph"
573  [(set (match_operand:DI 0 "register_operand" "=a")
574	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
575		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
576		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
577		   UNSPEC_DPAQX_SA_W_PH))
578   (set (reg:CCDSP CCDSP_OU_REGNUM)
579	(unspec:CCDSP [(match_dup 1) (match_dup 2) (match_dup 3)]
580		      UNSPEC_DPAQX_SA_W_PH))]
581  "ISA_HAS_DSPR2 && !TARGET_64BIT"
582  "dpaqx_sa.w.ph\t%q0,%z2,%z3"
583  [(set_attr "type"	"dspmacsat")
584   (set_attr "accum_in" "1")
585   (set_attr "mode"	"SI")])
586
587(define_insn "mips_dpsqx_s_w_ph"
588  [(set (match_operand:DI 0 "register_operand" "=a")
589	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
590		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
591		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
592		   UNSPEC_DPSQX_S_W_PH))
593   (set (reg:CCDSP CCDSP_OU_REGNUM)
594	(unspec:CCDSP [(match_dup 1) (match_dup 2) (match_dup 3)]
595		      UNSPEC_DPSQX_S_W_PH))]
596  "ISA_HAS_DSPR2 && !TARGET_64BIT"
597  "dpsqx_s.w.ph\t%q0,%z2,%z3"
598  [(set_attr "type"	"dspmac")
599   (set_attr "accum_in" "1")
600   (set_attr "mode"	"SI")])
601
602(define_insn "mips_dpsqx_sa_w_ph"
603  [(set (match_operand:DI 0 "register_operand" "=a")
604	(unspec:DI [(match_operand:DI 1 "register_operand" "0")
605		    (match_operand:V2HI 2 "reg_or_0_operand" "dYG")
606		    (match_operand:V2HI 3 "reg_or_0_operand" "dYG")]
607		   UNSPEC_DPSQX_SA_W_PH))
608   (set (reg:CCDSP CCDSP_OU_REGNUM)
609	(unspec:CCDSP [(match_dup 1) (match_dup 2) (match_dup 3)]
610		      UNSPEC_DPSQX_SA_W_PH))]
611  "ISA_HAS_DSPR2 && !TARGET_64BIT"
612  "dpsqx_sa.w.ph\t%q0,%z2,%z3"
613  [(set_attr "type"	"dspmacsat")
614   (set_attr "accum_in" "1")
615   (set_attr "mode"	"SI")])
616