annotate gcc/config/nds32/nds32-intrinsic.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Intrinsic functions of Andes NDS32 cpu for GNU compiler
kono
parents:
diff changeset
2 Copyright (C) 2012-2017 Free Software Foundation, Inc.
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 #include "config.h"
kono
parents:
diff changeset
24 #include "system.h"
kono
parents:
diff changeset
25 #include "coretypes.h"
kono
parents:
diff changeset
26 #include "backend.h"
kono
parents:
diff changeset
27 #include "target.h"
kono
parents:
diff changeset
28 #include "rtl.h"
kono
parents:
diff changeset
29 #include "tree.h"
kono
parents:
diff changeset
30 #include "memmodel.h"
kono
parents:
diff changeset
31 #include "optabs.h" /* For GEN_FCN. */
kono
parents:
diff changeset
32 #include "diagnostic-core.h"
kono
parents:
diff changeset
33 #include "stor-layout.h"
kono
parents:
diff changeset
34 #include "expr.h"
kono
parents:
diff changeset
35 #include "langhooks.h" /* For add_builtin_function(). */
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /* ------------------------------------------------------------------------ */
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 /* Function to expand builtin function for
kono
parents:
diff changeset
40 '[(unspec_volatile [(reg)])]'. */
kono
parents:
diff changeset
41 static rtx
kono
parents:
diff changeset
42 nds32_expand_builtin_null_ftype_reg (enum insn_code icode,
kono
parents:
diff changeset
43 tree exp, rtx target)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 /* Mapping:
kono
parents:
diff changeset
46 ops[0] <--> value0 <--> arg0 */
kono
parents:
diff changeset
47 struct expand_operand ops[1];
kono
parents:
diff changeset
48 tree arg0;
kono
parents:
diff changeset
49 rtx value0;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 /* Grab the incoming arguments and extract its rtx. */
kono
parents:
diff changeset
52 arg0 = CALL_EXPR_ARG (exp, 0);
kono
parents:
diff changeset
53 value0 = expand_normal (arg0);
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 /* Create operands. */
kono
parents:
diff changeset
56 create_input_operand (&ops[0], value0, TYPE_MODE (TREE_TYPE (arg0)));
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 /* Emit new instruction. */
kono
parents:
diff changeset
59 if (!maybe_expand_insn (icode, 1, ops))
kono
parents:
diff changeset
60 error ("invalid argument to built-in function");
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 return target;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 /* Function to expand builtin function for
kono
parents:
diff changeset
66 '[(set (reg) (unspec_volatile [(imm)]))]'. */
kono
parents:
diff changeset
67 static rtx
kono
parents:
diff changeset
68 nds32_expand_builtin_reg_ftype_imm (enum insn_code icode,
kono
parents:
diff changeset
69 tree exp, rtx target)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 /* Mapping:
kono
parents:
diff changeset
72 ops[0] <--> target <--> exp
kono
parents:
diff changeset
73 ops[1] <--> value0 <--> arg0 */
kono
parents:
diff changeset
74 struct expand_operand ops[2];
kono
parents:
diff changeset
75 tree arg0;
kono
parents:
diff changeset
76 rtx value0;
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 /* Grab the incoming arguments and extract its rtx. */
kono
parents:
diff changeset
79 arg0 = CALL_EXPR_ARG (exp, 0);
kono
parents:
diff changeset
80 value0 = expand_normal (arg0);
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 /* Create operands. */
kono
parents:
diff changeset
83 create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
kono
parents:
diff changeset
84 create_input_operand (&ops[1], value0, TYPE_MODE (TREE_TYPE (arg0)));
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 /* Emit new instruction. */
kono
parents:
diff changeset
87 if (!maybe_expand_insn (icode, 2, ops))
kono
parents:
diff changeset
88 error ("invalid argument to built-in function");
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 return target;
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 /* Function to expand builtin function for
kono
parents:
diff changeset
94 '[(unspec_volatile [(reg) (imm)])]' pattern. */
kono
parents:
diff changeset
95 static rtx
kono
parents:
diff changeset
96 nds32_expand_builtin_null_ftype_reg_imm (enum insn_code icode,
kono
parents:
diff changeset
97 tree exp, rtx target)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 /* Mapping:
kono
parents:
diff changeset
100 ops[0] <--> value0 <--> arg0
kono
parents:
diff changeset
101 ops[1] <--> value1 <--> arg1 */
kono
parents:
diff changeset
102 struct expand_operand ops[2];
kono
parents:
diff changeset
103 tree arg0, arg1;
kono
parents:
diff changeset
104 rtx value0, value1;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Grab the incoming arguments and extract its rtx. */
kono
parents:
diff changeset
107 arg0 = CALL_EXPR_ARG (exp, 0);
kono
parents:
diff changeset
108 arg1 = CALL_EXPR_ARG (exp, 1);
kono
parents:
diff changeset
109 value0 = expand_normal (arg0);
kono
parents:
diff changeset
110 value1 = expand_normal (arg1);
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 /* Create operands. */
kono
parents:
diff changeset
113 create_input_operand (&ops[0], value0, TYPE_MODE (TREE_TYPE (arg0)));
kono
parents:
diff changeset
114 create_input_operand (&ops[1], value1, TYPE_MODE (TREE_TYPE (arg1)));
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 /* Emit new instruction. */
kono
parents:
diff changeset
117 if (!maybe_expand_insn (icode, 2, ops))
kono
parents:
diff changeset
118 error ("invalid argument to built-in function");
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 return target;
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 /* ------------------------------------------------------------------------ */
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 void
kono
parents:
diff changeset
126 nds32_init_builtins_impl (void)
kono
parents:
diff changeset
127 {
kono
parents:
diff changeset
128 tree pointer_type_node = build_pointer_type (integer_type_node);
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 tree void_ftype_void = build_function_type (void_type_node,
kono
parents:
diff changeset
131 void_list_node);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 tree void_ftype_pint = build_function_type_list (void_type_node,
kono
parents:
diff changeset
134 pointer_type_node,
kono
parents:
diff changeset
135 NULL_TREE);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 tree int_ftype_int = build_function_type_list (integer_type_node,
kono
parents:
diff changeset
138 integer_type_node,
kono
parents:
diff changeset
139 NULL_TREE);
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 tree void_ftype_int_int = build_function_type_list (void_type_node,
kono
parents:
diff changeset
142 integer_type_node,
kono
parents:
diff changeset
143 integer_type_node,
kono
parents:
diff changeset
144 NULL_TREE);
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 /* Cache. */
kono
parents:
diff changeset
147 add_builtin_function ("__builtin_nds32_isync", void_ftype_pint,
kono
parents:
diff changeset
148 NDS32_BUILTIN_ISYNC,
kono
parents:
diff changeset
149 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
150 add_builtin_function ("__builtin_nds32_isb", void_ftype_void,
kono
parents:
diff changeset
151 NDS32_BUILTIN_ISB,
kono
parents:
diff changeset
152 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 /* Register Transfer. */
kono
parents:
diff changeset
155 add_builtin_function ("__builtin_nds32_mfsr", int_ftype_int,
kono
parents:
diff changeset
156 NDS32_BUILTIN_MFSR,
kono
parents:
diff changeset
157 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
158 add_builtin_function ("__builtin_nds32_mfusr", int_ftype_int,
kono
parents:
diff changeset
159 NDS32_BUILTIN_MFUSR,
kono
parents:
diff changeset
160 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
161 add_builtin_function ("__builtin_nds32_mtsr", void_ftype_int_int,
kono
parents:
diff changeset
162 NDS32_BUILTIN_MTSR,
kono
parents:
diff changeset
163 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
164 add_builtin_function ("__builtin_nds32_mtusr", void_ftype_int_int,
kono
parents:
diff changeset
165 NDS32_BUILTIN_MTUSR,
kono
parents:
diff changeset
166 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 /* Interrupt. */
kono
parents:
diff changeset
169 add_builtin_function ("__builtin_nds32_setgie_en", void_ftype_void,
kono
parents:
diff changeset
170 NDS32_BUILTIN_SETGIE_EN,
kono
parents:
diff changeset
171 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
172 add_builtin_function ("__builtin_nds32_setgie_dis", void_ftype_void,
kono
parents:
diff changeset
173 NDS32_BUILTIN_SETGIE_DIS,
kono
parents:
diff changeset
174 BUILT_IN_MD, NULL, NULL_TREE);
kono
parents:
diff changeset
175 }
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 rtx
kono
parents:
diff changeset
179 nds32_expand_builtin_impl (tree exp,
kono
parents:
diff changeset
180 rtx target,
kono
parents:
diff changeset
181 rtx subtarget ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
182 machine_mode mode ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
183 int ignore ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
184 {
kono
parents:
diff changeset
185 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 int fcode = DECL_FUNCTION_CODE (fndecl);
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 switch (fcode)
kono
parents:
diff changeset
190 {
kono
parents:
diff changeset
191 /* Cache. */
kono
parents:
diff changeset
192 case NDS32_BUILTIN_ISYNC:
kono
parents:
diff changeset
193 return nds32_expand_builtin_null_ftype_reg
kono
parents:
diff changeset
194 (CODE_FOR_unspec_volatile_isync, exp, target);
kono
parents:
diff changeset
195 case NDS32_BUILTIN_ISB:
kono
parents:
diff changeset
196 /* Since there are no result and operands for isb instruciton,
kono
parents:
diff changeset
197 we can simply emit this rtx. */
kono
parents:
diff changeset
198 emit_insn (gen_unspec_volatile_isb ());
kono
parents:
diff changeset
199 return target;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 /* Register Transfer. */
kono
parents:
diff changeset
202 case NDS32_BUILTIN_MFSR:
kono
parents:
diff changeset
203 return nds32_expand_builtin_reg_ftype_imm
kono
parents:
diff changeset
204 (CODE_FOR_unspec_volatile_mfsr, exp, target);
kono
parents:
diff changeset
205 case NDS32_BUILTIN_MFUSR:
kono
parents:
diff changeset
206 return nds32_expand_builtin_reg_ftype_imm
kono
parents:
diff changeset
207 (CODE_FOR_unspec_volatile_mfusr, exp, target);
kono
parents:
diff changeset
208 case NDS32_BUILTIN_MTSR:
kono
parents:
diff changeset
209 return nds32_expand_builtin_null_ftype_reg_imm
kono
parents:
diff changeset
210 (CODE_FOR_unspec_volatile_mtsr, exp, target);
kono
parents:
diff changeset
211 case NDS32_BUILTIN_MTUSR:
kono
parents:
diff changeset
212 return nds32_expand_builtin_null_ftype_reg_imm
kono
parents:
diff changeset
213 (CODE_FOR_unspec_volatile_mtusr, exp, target);
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 /* Interrupt. */
kono
parents:
diff changeset
216 case NDS32_BUILTIN_SETGIE_EN:
kono
parents:
diff changeset
217 /* Since there are no result and operands for setgie.e instruciton,
kono
parents:
diff changeset
218 we can simply emit this rtx. */
kono
parents:
diff changeset
219 emit_insn (gen_unspec_volatile_setgie_en ());
kono
parents:
diff changeset
220 return target;
kono
parents:
diff changeset
221 case NDS32_BUILTIN_SETGIE_DIS:
kono
parents:
diff changeset
222 /* Since there are no result and operands for setgie.d instruciton,
kono
parents:
diff changeset
223 we can simply emit this rtx. */
kono
parents:
diff changeset
224 emit_insn (gen_unspec_volatile_setgie_dis ());
kono
parents:
diff changeset
225 return target;
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 default:
kono
parents:
diff changeset
228 gcc_unreachable ();
kono
parents:
diff changeset
229 }
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 return NULL_RTX;
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 /* ------------------------------------------------------------------------ */