annotate gcc/config/nds32/nds32-intrinsic.md @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; Intrinsic patterns description of Andes NDS32 cpu for GNU compiler
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 ;; Copyright (C) 2012-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Andes Technology Corporation.
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
kono
parents:
diff changeset
8 ;; under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 ;; by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 ;; option) any later version.
kono
parents:
diff changeset
11 ;;
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 ;; License for more details.
kono
parents:
diff changeset
16 ;;
kono
parents:
diff changeset
17 ;; You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 ;; along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 ;; <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 ;; ------------------------------------------------------------------------
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 ;; Register Transfer.
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 (define_insn "unspec_volatile_mfsr"
kono
parents:
diff changeset
26 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
27 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_MFSR))]
kono
parents:
diff changeset
28 ""
kono
parents:
diff changeset
29 "mfsr\t%0, %V1"
kono
parents:
diff changeset
30 [(set_attr "type" "misc")
kono
parents:
diff changeset
31 (set_attr "length" "4")]
kono
parents:
diff changeset
32 )
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 (define_insn "unspec_volatile_mfusr"
kono
parents:
diff changeset
35 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
36 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_MFUSR))]
kono
parents:
diff changeset
37 ""
kono
parents:
diff changeset
38 "mfusr\t%0, %V1"
kono
parents:
diff changeset
39 [(set_attr "type" "misc")
kono
parents:
diff changeset
40 (set_attr "length" "4")]
kono
parents:
diff changeset
41 )
kono
parents:
diff changeset
42
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
43 (define_expand "mtsr_isb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
44 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 (match_operand:SI 1 "immediate_operand" ""))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
46 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
47 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
48 emit_insn (gen_unspec_volatile_mtsr (operands[0], operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
49 emit_insn (gen_unspec_volatile_isb());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
50 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
51 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 (define_expand "mtsr_dsb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
55 (match_operand:SI 1 "immediate_operand" ""))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
56 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
57 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
58 emit_insn (gen_unspec_volatile_mtsr (operands[0], operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
59 emit_insn (gen_unspec_dsb());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
60 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
61 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
62
111
kono
parents:
diff changeset
63 (define_insn "unspec_volatile_mtsr"
kono
parents:
diff changeset
64 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")
kono
parents:
diff changeset
65 (match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_MTSR)]
kono
parents:
diff changeset
66 ""
kono
parents:
diff changeset
67 "mtsr\t%0, %V1"
kono
parents:
diff changeset
68 [(set_attr "type" "misc")
kono
parents:
diff changeset
69 (set_attr "length" "4")]
kono
parents:
diff changeset
70 )
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 (define_insn "unspec_volatile_mtusr"
kono
parents:
diff changeset
73 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")
kono
parents:
diff changeset
74 (match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_MTUSR)]
kono
parents:
diff changeset
75 ""
kono
parents:
diff changeset
76 "mtusr\t%0, %V1"
kono
parents:
diff changeset
77 [(set_attr "type" "misc")
kono
parents:
diff changeset
78 (set_attr "length" "4")]
kono
parents:
diff changeset
79 )
kono
parents:
diff changeset
80
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 ;; FPU Register Transfer.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 (define_insn "unspec_fcpynsd"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 [(set (match_operand:DF 0 "register_operand" "=f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 (unspec:DF [(match_operand:DF 1 "register_operand" "f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 (match_operand:DF 2 "register_operand" "f")] UNSPEC_FCPYNSD))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 "fcpynsd\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 (define_insn "unspec_fcpynss"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94 [(set (match_operand:SF 0 "register_operand" "=f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 (unspec:SF [(match_operand:SF 1 "register_operand" "f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 (match_operand:SF 2 "register_operand" "f")] UNSPEC_FCPYNSS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 "fcpynss\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 (define_insn "unspec_fcpysd"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 [(set (match_operand:DF 0 "register_operand" "=f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 (unspec:DF [(match_operand:DF 1 "register_operand" "f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 (match_operand:DF 2 "register_operand" "f")] UNSPEC_FCPYSD))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108 "fcpysd\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 (define_insn "unspec_fcpyss"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 [(set (match_operand:SF 0 "register_operand" "=f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 (unspec:SF [(match_operand:SF 1 "register_operand" "f")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 (match_operand:SF 2 "register_operand" "f")] UNSPEC_FCPYSS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 "fcpyss\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 (define_insn "unspec_fmfcsr"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 (unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_FMFCSR))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 "fmfcsr\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 (define_insn "unspec_fmtcsr"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_FMTCSR)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 "fmtcsr\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 (define_insn "unspec_fmfcfg"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 (unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_FMFCFG))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 "fmfcfg\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148
111
kono
parents:
diff changeset
149 ;; ------------------------------------------------------------------------
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 ;; Interrupt Instructions.
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 (define_insn "unspec_volatile_setgie_en"
kono
parents:
diff changeset
154 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_SETGIE_EN)]
kono
parents:
diff changeset
155 ""
kono
parents:
diff changeset
156 "setgie.e"
kono
parents:
diff changeset
157 [(set_attr "type" "misc")]
kono
parents:
diff changeset
158 )
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 (define_insn "unspec_volatile_setgie_dis"
kono
parents:
diff changeset
161 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_SETGIE_DIS)]
kono
parents:
diff changeset
162 ""
kono
parents:
diff changeset
163 "setgie.d"
kono
parents:
diff changeset
164 [(set_attr "type" "misc")]
kono
parents:
diff changeset
165 )
kono
parents:
diff changeset
166
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 (define_expand "unspec_enable_int"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")] UNSPEC_VOLATILE_ENABLE_INT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 rtx system_reg;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 /* Set system register form nds32_intrinsic_register_names[]. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 if ((INTVAL (operands[0]) >= NDS32_INT_H16)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 && (INTVAL (operands[0]) <= NDS32_INT_H31))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 system_reg = GEN_INT (__NDS32_REG_INT_MASK2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179 operands[0] = GEN_INT (1 << (INTVAL (operands[0])));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
180 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
181 else if ((INTVAL (operands[0]) >= NDS32_INT_H32)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 && (INTVAL (operands[0]) <= NDS32_INT_H63))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 system_reg = GEN_INT (__NDS32_REG_INT_MASK3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
185 operands[0] = GEN_INT (1 << (INTVAL (operands[0]) - 32));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
186 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
187 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
188 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
189 system_reg = GEN_INT (__NDS32_REG_INT_MASK__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
190
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
191 if (INTVAL (operands[0]) == NDS32_INT_SWI)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
192 operands[0] = GEN_INT (1 << 16);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
193 else if ((INTVAL (operands[0]) >= NDS32_INT_ALZ)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 && (INTVAL (operands[0]) <= NDS32_INT_DSSIM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
195 operands[0] = GEN_INT (1 << (INTVAL (operands[0]) - 4));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
196 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
197 operands[0] = GEN_INT (1 << (INTVAL (operands[0])));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
198 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
199
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
200 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
201 emit_insn (gen_iorsi3 (temp_reg, temp_reg, operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
202 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
203 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
204 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
205 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
206
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
207 (define_expand "unspec_disable_int"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
208 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")] UNSPEC_VOLATILE_DISABLE_INT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
209 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
210 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 rtx system_reg;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
212 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
213
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
214 /* Set system register form nds32_intrinsic_register_names[]. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
215 if ((INTVAL (operands[0]) >= NDS32_INT_H16)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
216 && (INTVAL (operands[0]) <= NDS32_INT_H31))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
217 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
218 system_reg = GEN_INT (__NDS32_REG_INT_MASK2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
219 operands[0] = GEN_INT (~(1 << INTVAL (operands[0])));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
220 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
221 else if ((INTVAL (operands[0]) >= NDS32_INT_H32)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
222 && (INTVAL (operands[0]) <= NDS32_INT_H63))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
223 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
224 system_reg = GEN_INT (__NDS32_REG_INT_MASK3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
225 operands[0] = GEN_INT (~(1 << (INTVAL (operands[0]) - 32)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
226 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
227 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
228 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
229 system_reg = GEN_INT (__NDS32_REG_INT_MASK__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
230
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
231 if (INTVAL (operands[0]) == NDS32_INT_SWI)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
232 operands[0] = GEN_INT (~(1 << 16));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
233 else if ((INTVAL (operands[0]) >= NDS32_INT_ALZ)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234 && (INTVAL (operands[0]) <= NDS32_INT_DSSIM))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
235 operands[0] = GEN_INT (~(1 << (INTVAL (operands[0]) - 4)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
236 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
237 operands[0] = GEN_INT (~(1 << INTVAL (operands[0])));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
238 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
239
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
240 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
241 emit_insn (gen_andsi3 (temp_reg, temp_reg, operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
242 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
243 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
244 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
245 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
246
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
247 (define_expand "unspec_set_pending_swint"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
248 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_SET_PENDING_SWINT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
249 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
251 /* Get $INT_PEND system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
252 rtx system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
253 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
254
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
255 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
256 emit_insn (gen_iorsi3 (temp_reg, temp_reg, GEN_INT (65536)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
257 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
258 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
259 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
260 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
261
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
262 (define_expand "unspec_clr_pending_swint"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
263 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_CLR_PENDING_SWINT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
264 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
265 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
266 /* Get $INT_PEND system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
267 rtx system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
268 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
269
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
270 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
271 emit_insn (gen_andsi3 (temp_reg, temp_reg, GEN_INT (~(1 << 16))));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
272 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
273 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
274 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
275 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
276
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277 (define_expand "unspec_clr_pending_hwint"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")] UNSPEC_VOLATILE_CLR_PENDING_HWINT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283 rtx clr_hwint;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
286 /* Set system register form nds32_intrinsic_register_names[]. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
287 if ((INTVAL (operands[0]) >= NDS32_INT_H0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
288 && (INTVAL (operands[0]) <= NDS32_INT_H15))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
289 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
290 system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
291 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
292 else if ((INTVAL (operands[0]) >= NDS32_INT_H16)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
293 && (INTVAL (operands[0]) <= NDS32_INT_H31))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
294 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
295 system_reg = GEN_INT (__NDS32_REG_INT_PEND2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
296 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
297 else if ((INTVAL (operands[0]) >= NDS32_INT_H32)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
298 && (INTVAL (operands[0]) <= NDS32_INT_H63))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
299 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
300 system_reg = GEN_INT (__NDS32_REG_INT_PEND3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
301 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
302 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
303 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
304 error ("__nds32__clr_pending_hwint not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
306
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
307 /* $INT_PEND type is write one clear. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
308 clr_hwint = GEN_INT (1 << (INTVAL (operands[0]) - offset));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
309
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
310 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
311 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
312 emit_move_insn (temp_reg, clr_hwint);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
313 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
314 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
315 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
316 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
317 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
318
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319 (define_expand "unspec_get_all_pending_int"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 (unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_GET_ALL_PENDING_INT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
322 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
324 rtx system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
325 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
326 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
328 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
329
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
330 (define_expand "unspec_get_pending_int"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
331 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
332 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "")] UNSPEC_VOLATILE_GET_PENDING_INT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
335 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337 /* Set system register form nds32_intrinsic_register_names[]. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
338 if ((INTVAL (operands[1]) >= NDS32_INT_H0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
339 && (INTVAL (operands[1]) <= NDS32_INT_H15))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
340 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
341 system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
342 operands[2] = GEN_INT (31 - INTVAL (operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
343 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
344 else if (INTVAL (operands[1]) == NDS32_INT_SWI)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
345 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
346 system_reg = GEN_INT (__NDS32_REG_INT_PEND__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
347 operands[2] = GEN_INT (15);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
348 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
349 else if ((INTVAL (operands[1]) >= NDS32_INT_H16)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
350 && (INTVAL (operands[1]) <= NDS32_INT_H31))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
351 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
352 system_reg = GEN_INT (__NDS32_REG_INT_PEND2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353 operands[2] = GEN_INT (31 - INTVAL (operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
355 else if ((INTVAL (operands[1]) >= NDS32_INT_H32)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
356 && (INTVAL (operands[1]) <= NDS32_INT_H63))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
357 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 system_reg = GEN_INT (__NDS32_REG_INT_PEND3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359 operands[2] = GEN_INT (31 - (INTVAL (operands[1]) - 32));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
360 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
361 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
362 error ("get_pending_int not support NDS32_INT_ALZ,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
363 " NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
364
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
365 /* mfsr op0, sytem_reg */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
368 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 emit_insn (gen_ashlsi3 (operands[0], operands[0], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 emit_insn (gen_lshrsi3 (operands[0], operands[0], GEN_INT (31)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
374 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
375
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
376 (define_expand "unspec_set_int_priority"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
377 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
378 (match_operand:SI 1 "immediate_operand" "")] UNSPEC_VOLATILE_SET_INT_PRIORITY)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
379 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
380 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
381 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
382 rtx priority = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
383 rtx mask = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
384 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
385 rtx mask_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
386 rtx set_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
387 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
388
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
389 /* Get system register form nds32_intrinsic_register_names[]. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
390 if (INTVAL (operands[0]) <= NDS32_INT_H15)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
391 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
392 system_reg = GEN_INT (__NDS32_REG_INT_PRI__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
393 offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
394 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
395 else if (INTVAL (operands[0]) >= NDS32_INT_H16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
396 && INTVAL (operands[0]) <= NDS32_INT_H31)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
397 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
398 system_reg = GEN_INT (__NDS32_REG_INT_PRI2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
399 /* The $INT_PRI2 first bit correspond to H16, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
400 subtract 16. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
401 offset = 16;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
403 else if (INTVAL (operands[0]) >= NDS32_INT_H32
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404 && INTVAL (operands[0]) <= NDS32_INT_H47)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
405 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 system_reg = GEN_INT (__NDS32_REG_INT_PRI3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 /* The $INT_PRI3 first bit correspond to H32, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
408 subtract 32. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
409 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
410 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
411 else if (INTVAL (operands[0]) >= NDS32_INT_H48
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
412 && INTVAL (operands[0]) <= NDS32_INT_H63)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
413 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
414 system_reg = GEN_INT (__NDS32_REG_INT_PRI4__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
415 /* The $INT_PRI3 first bit correspond to H48, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
416 subtract 48. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
417 offset = 48;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
418 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
419 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
420 error ("set_int_priority not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
421 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
422
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
423 mask = GEN_INT (~(3 << 2 * (INTVAL (operands[0]) - offset)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 priority = GEN_INT ((int) (INTVAL (operands[1])
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 << ((INTVAL (operands[0]) - offset) * 2)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 emit_move_insn (mask_reg, mask);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 emit_move_insn (set_reg, priority);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432 emit_insn (gen_andsi3 (temp_reg, temp_reg, mask_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 emit_insn (gen_iorsi3 (temp_reg, temp_reg, set_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
434 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
435 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
436 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
437 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
438 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
439
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
440 (define_expand "unspec_get_int_priority"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
442 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "")] UNSPEC_VOLATILE_GET_INT_PRIORITY))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 rtx priority = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
447 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
448
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
449 /* Get system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
450 if (INTVAL (operands[1]) <= NDS32_INT_H15)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
451 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
452 system_reg = GEN_INT (__NDS32_REG_INT_PRI__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
453 offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
454 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 else if (INTVAL (operands[1]) >= NDS32_INT_H16
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
456 && INTVAL (operands[1]) <= NDS32_INT_H31)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
458 system_reg = GEN_INT (__NDS32_REG_INT_PRI2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459 /* The $INT_PRI2 first bit correspond to H16, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 subtract 16. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461 offset = 16;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
462 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
463 else if (INTVAL (operands[1]) >= NDS32_INT_H32
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
464 && INTVAL (operands[1]) <= NDS32_INT_H47)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
465 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
466 system_reg = GEN_INT (__NDS32_REG_INT_PRI3__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
467 /* The $INT_PRI3 first bit correspond to H32, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 subtract 32. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
470 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 else if (INTVAL (operands[1]) >= NDS32_INT_H48
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
472 && INTVAL (operands[1]) <= NDS32_INT_H63)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
473 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 system_reg = GEN_INT (__NDS32_REG_INT_PRI4__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475 /* The $INT_PRI4 first bit correspond to H48, so need
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
476 subtract 48. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
477 offset = 48;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
479 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
480 error ("set_int_priority not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
481 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
482
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
483 priority = GEN_INT (31 - 2 * (INTVAL (operands[1]) - offset));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
484
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
485 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
486 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
487 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
488 emit_insn (gen_ashlsi3 (operands[0], operands[0], priority));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
489 emit_insn (gen_lshrsi3 (operands[0], operands[0], GEN_INT (30)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
490 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
491 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
492 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
493 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
494
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
495 (define_expand "unspec_set_trig_level"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
496 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")] UNSPEC_VOLATILE_SET_TRIG_LEVEL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
497 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
498 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
499 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
500 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
501 rtx set_level;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
502 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
504 if (INTVAL (operands[0]) >= NDS32_INT_H0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
505 && INTVAL (operands[0]) <= NDS32_INT_H31)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
506 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
507 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
508 offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
509 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
510 else if (INTVAL (operands[0]) >= NDS32_INT_H32
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
511 && INTVAL (operands[0]) <= NDS32_INT_H63)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
512 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
513 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
514 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
515 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
516 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
517 error ("__nds32__set_trig_type_level not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
518 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
520 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
521 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
522 /* TRIGGER register, 0 mean level triggered and 1 mean edge triggered. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 set_level = GEN_INT (~(1 << (INTVAL (operands[0]) - offset)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
525 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
526 emit_insn (gen_andsi3 (temp_reg, temp_reg, set_level));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
527 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
529 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
530 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
531
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 (define_expand "unspec_set_trig_edge"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
533 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "")] UNSPEC_VOLATILE_SET_TRIG_EDGE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
534 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
535 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
537 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
538 rtx set_level;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
539 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
540
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
541 if (INTVAL (operands[0]) >= NDS32_INT_H0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
542 && INTVAL (operands[0]) <= NDS32_INT_H31)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
543 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
545 offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
546 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
547 else if (INTVAL (operands[0]) >= NDS32_INT_H32
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
548 && INTVAL (operands[0]) <= NDS32_INT_H63)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 error ("__nds32__set_trig_type_edge not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 /* TRIGGER register, 0 mean level triggered and 1 mean edge triggered. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560 set_level = GEN_INT ((1 << (INTVAL (operands[0]) - offset)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 emit_insn (gen_iorsi3 (temp_reg, temp_reg, set_level));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
569 (define_expand "unspec_get_trig_type"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
570 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
571 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "")] UNSPEC_VOLATILE_GET_TRIG_TYPE))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574 rtx system_reg = NULL_RTX;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
575 rtx trig_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
576 unsigned offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
578 if (INTVAL (operands[1]) >= NDS32_INT_H0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579 && INTVAL (operands[1]) <= NDS32_INT_H31)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
580 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
581 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
582 offset = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584 else if (INTVAL (operands[1]) >= NDS32_INT_H32
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
585 && INTVAL (operands[1]) <= NDS32_INT_H63)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
586 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
587 system_reg = GEN_INT (__NDS32_REG_INT_TRIGGER2__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
588 offset = 32;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
589 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
590 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591 error ("__nds32__get_trig_type not support NDS32_INT_SWI,"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
592 " NDS32_INT_ALZ, NDS32_INT_IDIVZE, NDS32_INT_DSSIM");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
593
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
594 if (system_reg != NULL_RTX)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
595 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596 trig_type = GEN_INT (31 - (INTVAL (operands[1]) - offset));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
599 emit_insn (gen_ashlsi3 (operands[0], operands[0], trig_type));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 emit_insn (gen_lshrsi3 (operands[0], operands[0], GEN_INT (31)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605
111
kono
parents:
diff changeset
606 ;; ------------------------------------------------------------------------
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 ;; Cache Synchronization Instructions
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 (define_insn "unspec_volatile_isync"
kono
parents:
diff changeset
611 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_ISYNC)]
kono
parents:
diff changeset
612 ""
kono
parents:
diff changeset
613 "isync\t%0"
kono
parents:
diff changeset
614 [(set_attr "type" "misc")]
kono
parents:
diff changeset
615 )
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 (define_insn "unspec_volatile_isb"
kono
parents:
diff changeset
618 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_ISB)]
kono
parents:
diff changeset
619 ""
kono
parents:
diff changeset
620 "isb"
kono
parents:
diff changeset
621 [(set_attr "type" "misc")]
kono
parents:
diff changeset
622 )
kono
parents:
diff changeset
623
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 (define_insn "unspec_dsb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
625 [(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_DSB)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
627 "dsb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631 (define_insn "unspec_msync"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632 [(unspec_volatile [(match_operand:SI 0 "immediate_operand" "i")] UNSPEC_VOLATILE_MSYNC)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 "msync\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 (define_insn "unspec_msync_all"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 [(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_MSYNC_ALL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 "msync\tall"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
643 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
644
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645 (define_insn "unspec_msync_store"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
646 [(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_MSYNC_STORE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
647 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
648 "msync\tstore"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
649 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
650 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652 ;; Load and Store
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
654 (define_insn "unspec_volatile_llw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
655 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 (unspec_volatile:SI [(mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 (match_operand:SI 2 "register_operand" "r")))] UNSPEC_VOLATILE_LLW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 "llw\t%0, [%1 + %2]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
663 (define_insn "unspec_lwup"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
665 (unspec_volatile:SI [(mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 (match_operand:SI 2 "register_operand" "r")))] UNSPEC_LWUP))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668 "lwup\t%0, [%1 + %2]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
669 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
670 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 (define_insn "unspec_lbup"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 (unspec_volatile:SI [(mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 (match_operand:SI 2 "register_operand" "r")))] UNSPEC_LBUP))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
676 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
677 "lbup\t%0, [%1 + %2]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
678 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
679 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
680
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
681 (define_insn "unspec_volatile_scw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
682 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
683 (unspec_volatile:SI [(mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
684 (match_operand:SI 2 "register_operand" "r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685 (match_operand:SI 3 "register_operand" "0")] UNSPEC_VOLATILE_SCW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
686 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
687 "scw\t%0, [%1 + %2]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
688 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
689 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
690
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
691 (define_insn "unspec_swup"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
692 [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
693 (match_operand:SI 1 "register_operand" "r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
694 (unspec:SI [(match_operand:SI 2 "register_operand" "r")] UNSPEC_SWUP))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
695 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
696 "swup\t%2, [%0 + %1]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
697 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
698 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
699
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
700 (define_insn "unspec_sbup"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
702 (match_operand:SI 1 "register_operand" "r")))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
703 (unspec:SI [(match_operand:SI 2 "register_operand" "r")] UNSPEC_SBUP))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
704 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
705 "sbup\t%2, [%0 + %1]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 [(set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
707 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
709 ;; CCTL
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
710
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 (define_insn "cctl_l1d_invalall"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
712 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_CCTL_L1D_INVALALL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
714 "cctl\tL1D_INVALALL"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
716 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
718 (define_insn "cctl_l1d_wball_alvl"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_CCTL_L1D_WBALL_ALVL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
720 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721 "cctl\tL1D_WBALL, alevel"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 (define_insn "cctl_l1d_wball_one_lvl"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_CCTL_L1D_WBALL_ONE_LVL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 "cctl\tL1D_WBALL, 1level"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 (define_insn "cctl_idx_read"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
733 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
734 (unspec_volatile:SI [(match_operand:SI 1 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 (match_operand:SI 2 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_IDX_READ))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737 "cctl\t%0, %2, %X1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
738 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 (define_insn "cctl_idx_write"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744 (match_operand:SI 2 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_IDX_WRITE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
745 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
746 "cctl\t%1, %2, %W0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
748 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 (define_insn "cctl_va_wbinval_l1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 (match_operand:SI 1 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_VA_WBINVAL_L1)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754 "cctl\t%1, %U0, 1level"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 (define_insn "cctl_va_wbinval_la"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 (match_operand:SI 1 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_VA_WBINVAL_LA)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
761 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 "cctl\t%1, %U0, alevel"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
766 (define_insn "cctl_idx_wbinval"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
767 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
768 (match_operand:SI 1 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_IDX_WBINVAL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
769 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
770 "cctl\t%1, %T0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
771 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
772 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
773
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 (define_insn "cctl_va_lck"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
775 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 (match_operand:SI 1 "register_operand" "r")] UNSPEC_VOLATILE_CCTL_VA_LCK)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
777 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
778 "cctl\t%1, %R0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
779 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 ;;PREFETCH
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 (define_insn "prefetch_qw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 [(unspec_volatile:QI [(match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 (match_operand:SI 1 "nonmemory_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 (match_operand:SI 2 "immediate_operand" "i")] UNSPEC_VOLATILE_DPREF_QW)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 "dpref\t%Z2, [%0 + %1]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
790 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
791 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
792
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
793 (define_insn "prefetch_hw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
794 [(unspec_volatile:HI [(match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
795 (match_operand:SI 1 "nonmemory_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
796 (match_operand:SI 2 "immediate_operand" "i")] UNSPEC_VOLATILE_DPREF_HW)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
797 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
798 "dpref\t%Z2, [%0 + (%1<<1)]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
799 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
800 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
801
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
802 (define_insn "prefetch_w"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
803 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" " r, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
804 (match_operand:SI 1 "nonmemory_operand" "Is15, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
805 (match_operand:SI 2 "immediate_operand" " i, i")] UNSPEC_VOLATILE_DPREF_W)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
806 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 "@
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
808 dprefi.w\t%Z2, [%0 + %1]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
809 dpref\t%Z2, [%0 + (%1<<2)]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
810 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
811 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
812
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813 (define_insn "prefetch_dw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
814 [(unspec_volatile:DI [(match_operand:SI 0 "register_operand" " r, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
815 (match_operand:SI 1 "nonmemory_operand" "Is15, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
816 (match_operand:SI 2 "immediate_operand" " i, i")] UNSPEC_VOLATILE_DPREF_DW)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
817 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 "@
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
819 dprefi.d\t%Z2, [%0 + %1]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
820 dpref\t%Z2, [%0 + (%1<<3)]"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
822 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
824 ;; Performance Extension
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
825
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
826 (define_expand "unspec_ave"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
827 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
828 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
829 (match_operand:SI 2 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
831 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
832 emit_insn (gen_ave (operands[0], operands[1], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
833 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
834 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 (define_expand "unspec_bclr"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
837 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839 (match_operand:SI 2 "immediate_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 unsigned HOST_WIDE_INT val = ~(1u << UINTVAL (operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 emit_insn (gen_andsi3 (operands[0], operands[1], gen_int_mode (val, SImode)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
845 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
846
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
847 (define_expand "unspec_bset"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
848 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
850 (match_operand:SI 2 "immediate_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 unsigned HOST_WIDE_INT val = 1u << UINTVAL (operands[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854 emit_insn (gen_iorsi3 (operands[0], operands[1], gen_int_mode (val, SImode)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
858 (define_expand "unspec_btgl"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
860 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
861 (match_operand:SI 2 "immediate_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
862 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
863 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864 unsigned HOST_WIDE_INT val = 1u << UINTVAL (operands[2]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
865 emit_insn (gen_xorsi3 (operands[0], operands[1], gen_int_mode (val, SImode)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
866 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
869 (define_expand "unspec_btst"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 (match_operand:SI 2 "immediate_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
875 emit_insn (gen_btst (operands[0], operands[1], operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
877 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
878
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879 (define_insn "unspec_clip"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
880 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
881 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
882 (match_operand:SI 2 "immediate_operand" "i")] UNSPEC_CLIP))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
883 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 "clip\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
885 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
886 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
887 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 (define_insn "unspec_clips"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
891 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 (match_operand:SI 2 "immediate_operand" "i")] UNSPEC_CLIPS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
893 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
894 "clips\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
895 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
896 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
897 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
898
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 (define_insn "unspec_clo"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
900 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
901 (unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_CLO))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
902 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
903 "clo\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
904 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
905 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908 (define_insn "unspec_ssabssi2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
909 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910 (ss_abs:SI (match_operand:SI 1 "register_operand" "r")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
911 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
912 "abs\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
913 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
914 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
916
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
917 ;; Performance extension 2
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
918
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
919 (define_insn "unspec_pbsad"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
920 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
921 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
922 (match_operand:SI 2 "register_operand" "r")] UNSPEC_PBSAD))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
923 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
924 "pbsad\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
925 [(set_attr "type" "pbsad")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
926 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
927 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
928
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
929 (define_insn "unspec_pbsada"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
930 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
931 (unspec:SI [(match_operand:SI 1 "register_operand" "0")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
932 (match_operand:SI 2 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
933 (match_operand:SI 3 "register_operand" "r")] UNSPEC_PBSADA))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
934 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
935 "pbsada\t%0, %2, %3"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
936 [(set_attr "type" "pbsada")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
937 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
938 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
939
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
940 (define_expand "bse"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 (match_operand:SI 2 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946 rtx temp0 = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
947 rtx temp2 = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
949 emit_move_insn (temp0, gen_rtx_MEM (Pmode, operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 emit_move_insn (temp2, gen_rtx_MEM (Pmode, operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951 emit_insn (gen_unspec_bse (temp0, operands[1], temp2, temp0, temp2));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
952 emit_move_insn (gen_rtx_MEM (Pmode, operands[0]), temp0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953 emit_move_insn (gen_rtx_MEM (Pmode, operands[2]), temp2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 (define_insn "unspec_bse"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961 (match_operand:SI 2 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
962 (match_operand:SI 3 "register_operand" "0")] UNSPEC_BSE))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
963 (set (match_operand:SI 4 "register_operand" "=2")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 (unspec:SI [(match_dup 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965 (match_dup 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 (match_dup 0)] UNSPEC_BSE_2))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 "bse\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973 (define_expand "bsp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 [(match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 (match_operand:SI 1 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
976 (match_operand:SI 2 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
977 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
978 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979 rtx temp0 = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
980 rtx temp2 = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
981
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
982 emit_move_insn (temp0, gen_rtx_MEM (Pmode, operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 emit_move_insn (temp2, gen_rtx_MEM (Pmode, operands[2]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
984 emit_insn (gen_unspec_bsp (temp0, operands[1], temp2, temp0, temp2));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
985 emit_move_insn (gen_rtx_MEM (Pmode, operands[0]), temp0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
986 emit_move_insn (gen_rtx_MEM (Pmode, operands[2]), temp2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
987 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
988 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
989 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
991 (define_insn "unspec_bsp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
992 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 (match_operand:SI 2 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995 (match_operand:SI 3 "register_operand" "0")] UNSPEC_BSP))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 (set (match_operand:SI 4 "register_operand" "=2")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 (unspec:SI [(match_dup 1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 (match_dup 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 (match_dup 0)] UNSPEC_BSP_2))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 "bsp\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1004 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1005
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1006 ;; String Extension
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008 (define_insn "unspec_ffb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1009 [(set (match_operand:SI 0 "register_operand" "=r, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1010 (unspec:SI [(match_operand:SI 1 "register_operand" "r, r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011 (match_operand:SI 2 "nonmemory_operand" "Iu08, r")] UNSPEC_FFB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1013 "@
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1014 ffbi\t%0, %1, %2
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015 ffb\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1016 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1017 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1018 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1019
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1020 (define_insn "unspec_ffmism"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1021 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1022 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1023 (match_operand:SI 2 "register_operand" "r")] UNSPEC_FFMISM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1024 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1025 "ffmism\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1026 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1027 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1028 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1029
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1030 (define_insn "unspec_flmism"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1031 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1032 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1033 (match_operand:SI 2 "register_operand" "r")] UNSPEC_FLMISM))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1034 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1035 "flmism\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1036 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1037 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1038 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1039
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1040 ;; SATURATION
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1041
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1042 (define_insn "unspec_kaddw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1043 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1044 (ss_plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1045 (match_operand:SI 2 "register_operand" "r")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1046 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1047 "kaddw\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1048 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1049 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1050 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1051
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1052 (define_insn "unspec_ksubw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1053 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1054 (ss_minus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1055 (match_operand:SI 2 "register_operand" "r")))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1056 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1057 "ksubw\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1058 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1059 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1060 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1061
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1062 (define_insn "unspec_kaddh"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1063 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1064 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1065 (match_operand:SI 2 "register_operand" "r")] UNSPEC_KADDH))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1066 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1067 "kaddh\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1068 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1069 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1070 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1071
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1072 (define_insn "unspec_ksubh"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1074 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075 (match_operand:SI 2 "register_operand" "r")] UNSPEC_KSUBH))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1076 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077 "ksubh\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1078 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1079 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1080 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1081
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1082 (define_insn "unspec_kaddh_dsp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1083 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1084 (unspec:SI [(plus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1085 (match_operand:SI 2 "register_operand" "r"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1086 (const_int 15)] UNSPEC_CLIPS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1087 "NDS32_EXT_DSP_P ()"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1088 "kaddh\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1089 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1090 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093 (define_insn "unspec_ksubh_dsp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1095 (unspec:SI [(minus:SI (match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1096 (match_operand:SI 2 "register_operand" "r"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1097 (const_int 15)] UNSPEC_CLIPS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1098 "NDS32_EXT_DSP_P ()"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1099 "ksubh\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1100 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1101 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1102 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1103
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 (define_insn "unspec_kdmbb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1105 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1107 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KDMBB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1108 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1109 "kdmbb\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1110 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1112 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1113
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1114 (define_insn "unspec_kdmbt"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1115 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1116 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1117 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KDMBT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1118 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1119 "kdmbt\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1120 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1121 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1122 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1123
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1124 (define_insn "unspec_kdmtb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1125 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1126 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1127 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KDMTB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1128 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1129 "kdmtb\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1130 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1131 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1132 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1133
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1134 (define_insn "unspec_kdmtt"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1135 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1136 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1137 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KDMTT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1138 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1139 "kdmtt\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1140 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1141 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1142 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1143
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1144 (define_insn "unspec_khmbb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1146 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1147 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KHMBB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1148 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1149 "khmbb\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1150 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1151 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1152 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1153
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1154 (define_insn "unspec_khmbt"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1155 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1156 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1157 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KHMBT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1158 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 "khmbt\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1160 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1161 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1162 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1163
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1164 (define_insn "unspec_khmtb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1165 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1166 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1167 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KHMTB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1168 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1169 "khmtb\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1171 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1172 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1173
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1174 (define_insn "unspec_khmtt"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1175 [(set (match_operand:V2HI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1176 (unspec:V2HI [(match_operand:V2HI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 (match_operand:V2HI 2 "register_operand" "r")] UNSPEC_KHMTT))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 "khmtt\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1180 [(set_attr "type" "mul")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1181 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1182 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1183
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1184 (define_insn "unspec_kslraw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1185 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1186 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1187 (match_operand:SI 2 "register_operand" "r")] UNSPEC_KSLRAW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1188 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1189 "kslraw\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1190 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1191 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1192 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1193
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1194 (define_insn "unspec_kslrawu"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1195 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1196 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1197 (match_operand:SI 2 "register_operand" "r")] UNSPEC_KSLRAWU))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1199 "kslraw.u\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1200 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1202 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1203
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1204 (define_insn "unspec_volatile_rdov"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1205 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1206 (unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_RDOV))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1207 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1208 "rdov\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1209 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1210 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1211 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1212
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1213 (define_insn "unspec_volatile_clrov"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1214 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_CLROV)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1216 "clrov"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1217 [(set_attr "type" "misc")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1220
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1221 ;; System
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1222
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1223 (define_insn "unspec_sva"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1224 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1225 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 (match_operand:SI 2 "register_operand" "r")] UNSPEC_SVA))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1228 "sva\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1229 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1230 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1231 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1232
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1233 (define_insn "unspec_svs"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1234 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1235 (unspec:SI [(match_operand:SI 1 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1236 (match_operand:SI 2 "register_operand" "r")] UNSPEC_SVS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1237 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1238 "svs\t%0, %1, %2"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1239 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1240 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1241 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1242
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1243 (define_insn "unspec_jr_itoff"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1244 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_JR_ITOFF)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1245 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1246 "jr.itoff\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1247 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1248 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1249
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1250 (define_insn "unspec_jr_toff"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1251 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_JR_TOFF)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1252 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1253 "jr.toff\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1254 [(set_attr "type" "branch")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1255 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1256
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1257 (define_insn "unspec_jral_iton"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1258 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_JRAL_ITON)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1259 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1260 "jral.iton\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1261 [(set_attr "type" "branch")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1262 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1263
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1264 (define_insn "unspec_jral_ton"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1265 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_JRAL_TON)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1266 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1267 "jral.ton\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1268 [(set_attr "type" "branch")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1269 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1270
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1271 (define_insn "unspec_ret_itoff"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1272 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_RET_ITOFF)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1273 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1274 "ret.itoff\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1275 [(set_attr "type" "branch")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1276 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1277
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1278 (define_insn "unspec_ret_toff"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_RET_TOFF)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1280 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1281 "ret.toff\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1282 [(set_attr "type" "branch")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1283 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1285 (define_insn "unspec_standby_no_wake_grant"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1286 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_STANDBY_NO_WAKE_GRANT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1287 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1288 "standby\tno_wake_grant"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1289 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1290 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1291
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1292 (define_insn "unspec_standby_wake_grant"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1293 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_STANDBY_WAKE_GRANT)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1294 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1295 "standby\twake_grant"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1296 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1297 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1298
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1299 (define_insn "unspec_standby_wait_done"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1300 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_STANDBY_WAKE_DONE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1301 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1302 "standby\twait_done"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1303 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1304 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1305
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1306 (define_insn "unspec_teqz"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1307 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1308 (match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_TEQZ)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1309 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1310 "teqz\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1311 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1312 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1313
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1314 (define_insn "unspec_tnez"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1315 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1316 (match_operand:SI 1 "immediate_operand" "i")] UNSPEC_VOLATILE_TNEZ)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1317 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1318 "tnez\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1319 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1320 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1321
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1322 (define_insn "unspec_trap"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1323 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")] UNSPEC_VOLATILE_TRAP)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1324 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1325 "trap\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1326 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1327 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1328
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1329 (define_insn "unspec_setend_big"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1330 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_SETEND_BIG)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1331 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1332 "setend.b"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1333 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1334 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1335
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1336 (define_insn "unspec_setend_little"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1337 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_SETEND_LITTLE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1338 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1339 "setend.l"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1340 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1341 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1342
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1343 (define_insn "unspec_break"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1344 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")] UNSPEC_VOLATILE_BREAK)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1345 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1346 "break\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1347 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1348 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1349
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1350 (define_insn "unspec_syscall"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1351 [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i")] UNSPEC_VOLATILE_SYSCALL)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1352 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1353 "syscall\t%0"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1354 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1355 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1356
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1357 (define_insn "unspec_nop"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1358 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_NOP)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1359 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1360 "nop"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1361 [(set_attr "type" "misc")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1362 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1363
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 (define_expand "unspec_get_current_sp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1365 [(match_operand:SI 0 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1366 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1367 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1368 emit_move_insn (operands[0], gen_rtx_REG (SImode, SP_REGNUM));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1369 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1370 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1371
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1372 (define_expand "unspec_set_current_sp"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1373 [(match_operand:SI 0 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1374 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1375 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1376 emit_move_insn (gen_rtx_REG (SImode, SP_REGNUM), operands[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1377 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1378 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1379
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1380 (define_expand "unspec_return_address"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1381 [(match_operand:SI 0 "register_operand" "")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1382 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1383 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1384 emit_move_insn (operands[0], gen_rtx_REG (SImode, LP_REGNUM));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1385 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1386 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1387
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1388 ;; Swap
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1389
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1390 (define_insn "unspec_wsbh"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1391 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1392 (unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_WSBH))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1393 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1394 "wsbh\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1395 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1396 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1397 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1398
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1399 ;; TLBOP Intrinsic
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1400
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1401 (define_insn "unspec_tlbop_trd"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1402 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_TRD)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1403 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1404 "tlbop\t%0, TRD"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1405 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1406 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1407
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408 (define_insn "unspec_tlbop_twr"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1409 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_TWR)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1410 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1411 "tlbop\t%0, TWR"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1413 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1414
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1415 (define_insn "unspec_tlbop_rwr"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_RWR)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1418 "tlbop\t%0, RWR"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1419 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1421
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1422 (define_insn "unspec_tlbop_rwlk"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1423 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_RWLK)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1424 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1425 "tlbop\t%0, RWLK"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1426 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1427 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1428
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1429 (define_insn "unspec_tlbop_unlk"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1430 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_UNLK)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1431 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1432 "tlbop\t%0, UNLK"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1433 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1434 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1435
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1436 (define_insn "unspec_tlbop_pb"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438 (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_PB))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1440 "tlbop\t%0, %1, PB"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1441 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1442 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1443
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1444 (define_insn "unspec_tlbop_inv"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1445 [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")] UNSPEC_VOLATILE_TLBOP_INV)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1446 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1447 "tlbop\t%0, INV"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1448 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1449 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1450
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1451 (define_insn "unspec_tlbop_flua"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1452 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_TLBOP_FLUA)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1453 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1454 "tlbop\tFLUA"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1455 [(set_attr "type" "mmu")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1456 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1457
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1458 ;;Unaligned Load/Store
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1459
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1460 (define_expand "unaligned_load_hw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1461 [(set (match_operand:HI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1462 (unspec:HI [(mem:HI (match_operand:SI 1 "register_operand" ""))] UNSPEC_UALOAD_HW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1463 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1464 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1465 operands[0] = simplify_gen_subreg (SImode, operands[0],
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1466 GET_MODE (operands[0]), 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1467 if (TARGET_ISA_V3M)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1468 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1469 nds32_expand_unaligned_load (operands, HImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1470 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1471 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1472 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1473 emit_insn (gen_unaligned_load_w (operands[0],
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474 gen_rtx_MEM (SImode, operands[1])));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1475
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1476 if (WORDS_BIG_ENDIAN)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1477 emit_insn (gen_lshrsi3 (operands[0], operands[0], GEN_INT(16)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1478 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1479 emit_insn (gen_andsi3 (operands[0], operands[0], GEN_INT (0xffff)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1480 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1481
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1482 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1483 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1484
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1485 (define_expand "unaligned_loadsi"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1486 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1487 (unspec:SI [(mem:SI (match_operand:SI 1 "register_operand" "r"))] UNSPEC_UALOAD_W))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1488 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1489 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1490 if (flag_unaligned_access)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1491 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1492 rtx mem = gen_rtx_MEM (SImode, operands[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1493 emit_move_insn (operands[0], mem);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1494 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1495 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1496 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1497 if (TARGET_ISA_V3M)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1498 nds32_expand_unaligned_load (operands, SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1499 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1500 emit_insn (gen_unaligned_load_w (operands[0],
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1501 gen_rtx_MEM (SImode, (operands[1]))));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1502 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1503 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1504 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1505
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1506 (define_insn "unaligned_load_w"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1507 [(set (match_operand:SI 0 "register_operand" "= r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1508 (unspec:SI [(match_operand:SI 1 "nds32_lmw_smw_base_operand" " Umw")] UNSPEC_UALOAD_W))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1509 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1510 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1511 return nds32_output_lmw_single_word (operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1512 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1513 [(set_attr "type" "load")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1514 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1515 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1516
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1517 (define_expand "unaligned_loaddi"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1518 [(set (match_operand:DI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1519 (unspec:DI [(mem:DI (match_operand:SI 1 "register_operand" "r"))] UNSPEC_UALOAD_DW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1520 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1521 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 if (TARGET_ISA_V3M)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1524 nds32_expand_unaligned_load (operands, DImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1525 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1527 emit_insn (gen_unaligned_load_dw (operands[0], operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1528 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1529 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1530
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1531 (define_insn "unaligned_load_dw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1532 [(set (match_operand:DI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1533 (unspec:DI [(mem:DI (match_operand:SI 1 "register_operand" "r"))] UNSPEC_UALOAD_DW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1534 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1535 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1536 rtx otherops[3];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1537 otherops[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1538 otherops[1] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1539 otherops[2] = operands[1];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1540
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1541 output_asm_insn ("lmw.bi\t%0, [%2], %1, 0", otherops);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1542 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1543 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1544 [(set_attr "type" "load")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1545 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1546 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1547
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1548 (define_expand "unaligned_store_hw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1549 [(set (mem:SI (match_operand:SI 0 "register_operand" ""))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1550 (unspec:HI [(match_operand:HI 1 "register_operand" "")] UNSPEC_UASTORE_HW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1551 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1552 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1553 operands[1] = simplify_gen_subreg (SImode, operands[1],
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1554 GET_MODE (operands[1]), 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1555 nds32_expand_unaligned_store (operands, HImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1556 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1557 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1558
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1559 (define_expand "unaligned_storesi"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1560 [(set (mem:SI (match_operand:SI 0 "register_operand" "r"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1561 (unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_UASTORE_W))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1562 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1563 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1564 if (flag_unaligned_access)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1565 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1566 rtx mem = gen_rtx_MEM (SImode, operands[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1567 emit_move_insn (mem, operands[1]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1568 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1569 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1570 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1571 if (TARGET_ISA_V3M)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 nds32_expand_unaligned_store (operands, SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1573 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1574 emit_insn (gen_unaligned_store_w (gen_rtx_MEM (SImode, operands[0]),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1575 operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1576 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1577 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1578 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1579
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1580 (define_insn "unaligned_store_w"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1581 [(set (match_operand:SI 0 "nds32_lmw_smw_base_operand" "=Umw")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1582 (unspec:SI [(match_operand:SI 1 "register_operand" " r")] UNSPEC_UASTORE_W))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1583 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1584 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1585 return nds32_output_smw_single_word (operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1586 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1587 [(set_attr "type" "store")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1588 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1589 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1590
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1591 (define_expand "unaligned_storedi"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1592 [(set (mem:DI (match_operand:SI 0 "register_operand" "r"))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1593 (unspec:DI [(match_operand:DI 1 "register_operand" "r")] UNSPEC_UASTORE_DW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1594 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1595 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1596 if (TARGET_ISA_V3M)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1597 nds32_expand_unaligned_store (operands, DImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1598 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1599 emit_insn (gen_unaligned_store_dw (gen_rtx_MEM (DImode, operands[0]),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1600 operands[1]));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1601 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1602 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1603
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1604 (define_insn "unaligned_store_dw"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1605 [(set (match_operand:DI 0 "nds32_lmw_smw_base_operand" "=Umw")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1606 (unspec:DI [(match_operand:DI 1 "register_operand" " r")] UNSPEC_UASTORE_DW))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1607 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1608 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1609 return nds32_output_smw_double_word (operands);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611 [(set_attr "type" "store")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1614
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1615 (define_expand "unspec_unaligned_feature"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1616 [(set (match_operand:SI 0 "register_operand" "")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 (unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_UNALIGNED_FEATURE))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1619 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620 /* Get $MMU_CTL system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1621 rtx system_reg = GEN_INT (__NDS32_REG_MMU_CTL__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1622 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1623 rtx temp2_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1624
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1625 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1626 emit_move_insn (temp_reg, operands[0]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1627 emit_move_insn (temp2_reg, GEN_INT (0x800 << 12));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1628 emit_insn (gen_iorsi3 (operands[0], operands[0], temp2_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1629 emit_insn (gen_unspec_volatile_mtsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1630 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1631
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1632 emit_insn (gen_unspec_volatile_mfsr (operands[0], system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1633 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1634 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1636 emit_insn (gen_ashlsi3 (operands[0], operands[0], GEN_INT (8)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 emit_insn (gen_lshrsi3 (operands[0], operands[0], GEN_INT (31)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1638 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1639 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1640
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1641 (define_expand "unspec_enable_unaligned"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1642 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_UNALIGNED_FEATURE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1643 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1644 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1645 /* Get $MMU_CTL system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1646 rtx system_reg = GEN_INT (__NDS32_REG_MMU_CTL__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1647 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1648 rtx temp2_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1649 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1650 emit_move_insn (temp2_reg, GEN_INT (0x800 << 12));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1651 emit_insn (gen_iorsi3 (temp_reg, temp_reg, temp2_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1652 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1653 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1654 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1655 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1656
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1657 (define_expand "unspec_disable_unaligned"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1658 [(unspec_volatile:SI [(const_int 0)] UNSPEC_VOLATILE_UNALIGNED_FEATURE)]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1659 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1660 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1661 /* Get $MMU_CTL system register form nds32_intrinsic_register_names[] */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1662 rtx system_reg = GEN_INT (__NDS32_REG_MMU_CTL__);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1663 rtx temp_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1664 rtx temp2_reg = gen_reg_rtx (SImode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1665 emit_insn (gen_unspec_volatile_mfsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1666 emit_move_insn (temp2_reg, GEN_INT (0x800 << 12));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1667 emit_insn (gen_one_cmplsi2 (temp2_reg, temp2_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1668 emit_insn (gen_andsi3 (temp_reg, temp_reg, temp2_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1669 emit_insn (gen_unspec_volatile_mtsr (temp_reg, system_reg));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1670 emit_insn (gen_unspec_dsb ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1671 DONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1672 })
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1673
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1674 ;; abs alias kabs
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1675
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1676 (define_insn "unspec_kabs"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1677 [(set (match_operand:SI 0 "register_operand" "=r")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1678 (unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_KABS))]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1679 ""
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1680 "kabs\t%0, %1"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1681 [(set_attr "type" "alu")
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1682 (set_attr "length" "4")]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1683 )
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1684
111
kono
parents:
diff changeset
1685 ;; ------------------------------------------------------------------------