Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/frv/frv.md @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 ;; Frv Machine Description | 1 ;; Frv Machine Description |
2 ;; Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2010 | 2 ;; Copyright (C) 1999-2017 Free Software Foundation, Inc. |
3 ;; Free Software Foundation, Inc. | |
4 ;; Contributed by Red Hat, Inc. | 3 ;; Contributed by Red Hat, Inc. |
5 | 4 |
6 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
7 | 6 |
8 ;; GCC is free software; you can redistribute it and/or modify | 7 ;; GCC is free software; you can redistribute it and/or modify |
88 | 87 |
89 (define_mode_iterator IMODE [QI HI SI DI]) | 88 (define_mode_iterator IMODE [QI HI SI DI]) |
90 (define_mode_attr IMODEsuffix [(QI "b") (HI "h") (SI "") (DI "d")]) | 89 (define_mode_attr IMODEsuffix [(QI "b") (HI "h") (SI "") (DI "d")]) |
91 (define_mode_attr BREADsuffix [(QI "ub") (HI "uh") (SI "") (DI "d")]) | 90 (define_mode_attr BREADsuffix [(QI "ub") (HI "uh") (SI "") (DI "d")]) |
92 | 91 |
93 ;; :::::::::::::::::::: | |
94 ;; :: | |
95 ;; :: Constraints | |
96 ;; :: | |
97 ;; :::::::::::::::::::: | |
98 | |
99 ;; Standard Constraints | |
100 ;; | |
101 ;; `m' A memory operand is allowed, with any kind of address that the | |
102 ;; machine supports in general. | |
103 ;; | |
104 ;; `o' A memory operand is allowed, but only if the address is | |
105 ;; "offsettable". This means that adding a small integer (actually, the | |
106 ;; width in bytes of the operand, as determined by its machine mode) may be | |
107 ;; added to the address and the result is also a valid memory address. | |
108 ;; | |
109 ;; `V' A memory operand that is not offsettable. In other words, | |
110 ;; anything that would fit the `m' constraint but not the `o' constraint. | |
111 ;; | |
112 ;; `<' A memory operand with autodecrement addressing (either | |
113 ;; predecrement or postdecrement) is allowed. | |
114 ;; | |
115 ;; `>' A memory operand with autoincrement addressing (either | |
116 ;; preincrement or postincrement) is allowed. | |
117 ;; | |
118 ;; `r' A register operand is allowed provided that it is in a general | |
119 ;; register. | |
120 ;; | |
121 ;; `d', `a', `f', ... | |
122 ;; Other letters can be defined in machine-dependent fashion to stand for | |
123 ;; particular classes of registers. `d', `a' and `f' are defined on the | |
124 ;; 68000/68020 to stand for data, address and floating point registers. | |
125 ;; | |
126 ;; `i' An immediate integer operand (one with constant value) is allowed. | |
127 ;; This includes symbolic constants whose values will be known only at | |
128 ;; assembly time. | |
129 ;; | |
130 ;; `n' An immediate integer operand with a known numeric value is allowed. | |
131 ;; Many systems cannot support assembly-time constants for operands less | |
132 ;; than a word wide. Constraints for these operands should use `n' rather | |
133 ;; than `i'. | |
134 ;; | |
135 ;; 'I' First machine-dependent integer constant (6-bit signed ints). | |
136 ;; 'J' Second machine-dependent integer constant (10-bit signed ints). | |
137 ;; 'K' Third machine-dependent integer constant (-2048). | |
138 ;; 'L' Fourth machine-dependent integer constant (16-bit signed ints). | |
139 ;; 'M' Fifth machine-dependent integer constant (16-bit unsigned ints). | |
140 ;; 'N' Sixth machine-dependent integer constant (-2047..-1). | |
141 ;; 'O' Seventh machine-dependent integer constant (zero). | |
142 ;; 'P' Eighth machine-dependent integer constant (1..2047). | |
143 ;; | |
144 ;; Other letters in the range `I' through `P' may be defined in a | |
145 ;; machine-dependent fashion to permit immediate integer operands with | |
146 ;; explicit integer values in specified ranges. For example, on the 68000, | |
147 ;; `I' is defined to stand for the range of values 1 to 8. This is the | |
148 ;; range permitted as a shift count in the shift instructions. | |
149 ;; | |
150 ;; `E' An immediate floating operand (expression code `const_double') is | |
151 ;; allowed, but only if the target floating point format is the same as | |
152 ;; that of the host machine (on which the compiler is running). | |
153 ;; | |
154 ;; `F' An immediate floating operand (expression code `const_double') is | |
155 ;; allowed. | |
156 ;; | |
157 ;; 'G' First machine-dependent const_double. | |
158 ;; 'H' Second machine-dependent const_double. | |
159 ;; | |
160 ;; `s' An immediate integer operand whose value is not an explicit | |
161 ;; integer is allowed. | |
162 ;; | |
163 ;; This might appear strange; if an insn allows a constant operand with a | |
164 ;; value not known at compile time, it certainly must allow any known | |
165 ;; value. So why use `s' instead of `i'? Sometimes it allows better code | |
166 ;; to be generated. | |
167 ;; | |
168 ;; For example, on the 68000 in a fullword instruction it is possible to | |
169 ;; use an immediate operand; but if the immediate value is between -128 and | |
170 ;; 127, better code results from loading the value into a register and | |
171 ;; using the register. This is because the load into the register can be | |
172 ;; done with a `moveq' instruction. We arrange for this to happen by | |
173 ;; defining the letter `K' to mean "any integer outside the range -128 to | |
174 ;; 127", and then specifying `Ks' in the operand constraints. | |
175 ;; | |
176 ;; `g' Any register, memory or immediate integer operand is allowed, | |
177 ;; except for registers that are not general registers. | |
178 ;; | |
179 ;; `X' Any operand whatsoever is allowed, even if it does not satisfy | |
180 ;; `general_operand'. This is normally used in the constraint of a | |
181 ;; `match_scratch' when certain alternatives will not actually require a | |
182 ;; scratch register. | |
183 ;; | |
184 ;; `0' Match operand 0. | |
185 ;; `1' Match operand 1. | |
186 ;; `2' Match operand 2. | |
187 ;; `3' Match operand 3. | |
188 ;; `4' Match operand 4. | |
189 ;; `5' Match operand 5. | |
190 ;; `6' Match operand 6. | |
191 ;; `7' Match operand 7. | |
192 ;; `8' Match operand 8. | |
193 ;; `9' Match operand 9. | |
194 ;; | |
195 ;; An operand that matches the specified operand number is allowed. If a | |
196 ;; digit is used together with letters within the same alternative, the | |
197 ;; digit should come last. | |
198 ;; | |
199 ;; This is called a "matching constraint" and what it really means is that | |
200 ;; the assembler has only a single operand that fills two roles considered | |
201 ;; separate in the RTL insn. For example, an add insn has two input | |
202 ;; operands and one output operand in the RTL, but on most CISC machines an | |
203 ;; add instruction really has only two operands, one of them an | |
204 ;; input-output operand: | |
205 ;; | |
206 ;; addl #35,r12 | |
207 ;; | |
208 ;; Matching constraints are used in these circumstances. More precisely, | |
209 ;; the two operands that match must include one input-only operand and one | |
210 ;; output-only operand. Moreover, the digit must be a smaller number than | |
211 ;; the number of the operand that uses it in the constraint. | |
212 ;; | |
213 ;; For operands to match in a particular case usually means that they are | |
214 ;; identical-looking RTL expressions. But in a few special cases specific | |
215 ;; kinds of dissimilarity are allowed. For example, `*x' as an input | |
216 ;; operand will match `*x++' as an output operand. For proper results in | |
217 ;; such cases, the output template should always use the output-operand's | |
218 ;; number when printing the operand. | |
219 ;; | |
220 ;; `p' An operand that is a valid memory address is allowed. This is for | |
221 ;; "load address" and "push address" instructions. | |
222 ;; | |
223 ;; `p' in the constraint must be accompanied by `address_operand' as the | |
224 ;; predicate in the `match_operand'. This predicate interprets the mode | |
225 ;; specified in the `match_operand' as the mode of the memory reference for | |
226 ;; which the address would be valid. | |
227 ;; | |
228 ;; `Q` First non constant, non register machine-dependent insns | |
229 ;; `R` Second non constant, non register machine-dependent insns | |
230 ;; `S` Third non constant, non register machine-dependent insns | |
231 ;; `T` Fourth non constant, non register machine-dependent insns | |
232 ;; `U` Fifth non constant, non register machine-dependent insns | |
233 ;; | |
234 ;; Letters in the range `Q' through `U' may be defined in a | |
235 ;; machine-dependent fashion to stand for arbitrary operand types. The | |
236 ;; machine description macro `EXTRA_CONSTRAINT' is passed the operand as | |
237 ;; its first argument and the constraint letter as its second operand. | |
238 ;; | |
239 ;; A typical use for this would be to distinguish certain types of memory | |
240 ;; references that affect other insn operands. | |
241 ;; | |
242 ;; Do not define these constraint letters to accept register references | |
243 ;; (`reg'); the reload pass does not expect this and would not handle it | |
244 ;; properly. | |
245 | |
246 ;; Multiple Alternative Constraints | |
247 ;; `?' Disparage slightly the alternative that the `?' appears in, as a | |
248 ;; choice when no alternative applies exactly. The compiler regards this | |
249 ;; alternative as one unit more costly for each `?' that appears in it. | |
250 ;; | |
251 ;; `!' Disparage severely the alternative that the `!' appears in. This | |
252 ;; alternative can still be used if it fits without reloading, but if | |
253 ;; reloading is needed, some other alternative will be used. | |
254 | |
255 ;; Constraint modifiers | |
256 ;; `=' Means that this operand is write-only for this instruction: the | |
257 ;; previous value is discarded and replaced by output data. | |
258 ;; | |
259 ;; `+' Means that this operand is both read and written by the | |
260 ;; instruction. | |
261 ;; | |
262 ;; When the compiler fixes up the operands to satisfy the constraints, it | |
263 ;; needs to know which operands are inputs to the instruction and which are | |
264 ;; outputs from it. `=' identifies an output; `+' identifies an operand | |
265 ;; that is both input and output; all other operands are assumed to be | |
266 ;; input only. | |
267 ;; | |
268 ;; `&' Means (in a particular alternative) that this operand is written | |
269 ;; before the instruction is finished using the input operands. Therefore, | |
270 ;; this operand may not lie in a register that is used as an input operand | |
271 ;; or as part of any memory address. | |
272 ;; | |
273 ;; `&' applies only to the alternative in which it is written. In | |
274 ;; constraints with multiple alternatives, sometimes one alternative | |
275 ;; requires `&' while others do not. | |
276 ;; | |
277 ;; `&' does not obviate the need to write `='. | |
278 ;; | |
279 ;; `%' Declares the instruction to be commutative for this operand and the | |
280 ;; following operand. This means that the compiler may interchange the two | |
281 ;; operands if that is the cheapest way to make all operands fit the | |
282 ;; constraints. This is often used in patterns for addition instructions | |
283 ;; that really have only two operands: the result must go in one of the | |
284 ;; arguments. | |
285 ;; | |
286 ;; `#' Says that all following characters, up to the next comma, are to be | |
287 ;; ignored as a constraint. They are significant only for choosing | |
288 ;; register preferences. | |
289 ;; | |
290 ;; `*' Says that the following character should be ignored when choosing | |
291 ;; register preferences. `*' has no effect on the meaning of the | |
292 ;; constraint as a constraint, and no effect on reloading. | |
293 | |
294 | |
295 ;; :::::::::::::::::::: | |
296 ;; :: | |
297 ;; :: Attributes | |
298 ;; :: | |
299 ;; :::::::::::::::::::: | |
300 | |
301 ;; The `define_attr' expression is used to define each attribute required by | |
302 ;; the target machine. It looks like: | |
303 ;; | |
304 ;; (define_attr NAME LIST-OF-VALUES DEFAULT) | |
305 | |
306 ;; NAME is a string specifying the name of the attribute being defined. | |
307 | |
308 ;; LIST-OF-VALUES is either a string that specifies a comma-separated list of | |
309 ;; values that can be assigned to the attribute, or a null string to indicate | |
310 ;; that the attribute takes numeric values. | |
311 | |
312 ;; DEFAULT is an attribute expression that gives the value of this attribute | |
313 ;; for insns that match patterns whose definition does not include an explicit | |
314 ;; value for this attribute. | |
315 | |
316 ;; For each defined attribute, a number of definitions are written to the | |
317 ;; `insn-attr.h' file. For cases where an explicit set of values is specified | |
318 ;; for an attribute, the following are defined: | |
319 | |
320 ;; * A `#define' is written for the symbol `HAVE_ATTR_NAME'. | |
321 ;; | |
322 ;; * An enumeral class is defined for `attr_NAME' with elements of the | |
323 ;; form `UPPER-NAME_UPPER-VALUE' where the attribute name and value are first | |
324 ;; converted to upper case. | |
325 ;; | |
326 ;; * A function `get_attr_NAME' is defined that is passed an insn and | |
327 ;; returns the attribute value for that insn. | |
328 | |
329 ;; For example, if the following is present in the `md' file: | |
330 ;; | |
331 ;; (define_attr "type" "branch,fp,load,store,arith" ...) | |
332 ;; | |
333 ;; the following lines will be written to the file `insn-attr.h'. | |
334 ;; | |
335 ;; #define HAVE_ATTR_type | |
336 ;; enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD, TYPE_STORE, TYPE_ARITH}; | |
337 ;; extern enum attr_type get_attr_type (); | |
338 | |
339 ;; If the attribute takes numeric values, no `enum' type will be defined and | |
340 ;; the function to obtain the attribute's value will return `int'. | |
341 | |
342 (define_attr "length" "" (const_int 4)) | 92 (define_attr "length" "" (const_int 4)) |
343 | 93 |
344 ;; Processor type -- this attribute must exactly match the processor_type | 94 ;; Processor type -- this attribute must exactly match the processor_type |
345 ;; enumeration in frv-protos.h. | 95 ;; enumeration in frv-protos.h. |
346 | 96 |
1583 ;; registers after reload, you must define `SECONDARY_INPUT_RELOAD_CLASS' and | 1333 ;; registers after reload, you must define `SECONDARY_INPUT_RELOAD_CLASS' and |
1584 ;; perhaps also `SECONDARY_OUTPUT_RELOAD_CLASS' to detect them, and provide | 1334 ;; perhaps also `SECONDARY_OUTPUT_RELOAD_CLASS' to detect them, and provide |
1585 ;; patterns `reload_inM' or `reload_outM' to handle them. | 1335 ;; patterns `reload_inM' or `reload_outM' to handle them. |
1586 | 1336 |
1587 ;; The constraints on a `moveM' must permit moving any hard register to any | 1337 ;; The constraints on a `moveM' must permit moving any hard register to any |
1588 ;; other hard register provided that `HARD_REGNO_MODE_OK' permits mode M in | 1338 ;; other hard register provided that `TARGET_HARD_REGNO_MODE_OK' permits |
1589 ;; both registers and `REGISTER_MOVE_COST' applied to their classes returns a | 1339 ;; mode M in both registers and `REGISTER_MOVE_COST' applied to their |
1590 ;; value of 2. | 1340 ;; classes returns a value of 2. |
1591 | 1341 |
1592 ;; It is obligatory to support floating point `moveM' instructions | 1342 ;; It is obligatory to support floating point `moveM' instructions |
1593 ;; into and out of any registers that can hold fixed point values, | 1343 ;; into and out of any registers that can hold fixed point values, |
1594 ;; because unions and structures (which have modes `SImode' or | 1344 ;; because unions and structures (which have modes `SImode' or |
1595 ;; `DImode') can be in those registers and they may have floating | 1345 ;; `DImode') can be in those registers and they may have floating |
1596 ;; point members. | 1346 ;; point members. |
1597 | 1347 |
1598 ;; There may also be a need to support fixed point `moveM' instructions in and | 1348 ;; There may also be a need to support fixed point `moveM' instructions |
1599 ;; out of floating point registers. Unfortunately, I have forgotten why this | 1349 ;; in and out of floating point registers. Unfortunately, I have |
1600 ;; was so, and I don't know whether it is still true. If `HARD_REGNO_MODE_OK' | 1350 ;; forgotten why this was so, and I don't know whether it is still true. |
1601 ;; rejects fixed point values in floating point registers, then the constraints | 1351 ;; If `TARGET_HARD_REGNO_MODE_OK' rejects fixed point values in floating |
1602 ;; of the fixed point `moveM' instructions must be designed to avoid ever | 1352 ;; point registers, then the constraints of the fixed point `moveM' |
1603 ;; trying to reload into a floating point register. | 1353 ;; instructions must be designed to avoid ever trying to reload into a |
1354 ;; floating point register. | |
1604 | 1355 |
1605 (define_expand "movqi" | 1356 (define_expand "movqi" |
1606 [(set (match_operand:QI 0 "general_operand" "") | 1357 [(set (match_operand:QI 0 "general_operand" "") |
1607 (match_operand:QI 1 "general_operand" ""))] | 1358 (match_operand:QI 1 "general_operand" ""))] |
1608 "" | 1359 "" |
2118 (set (match_dup 3) (match_dup 5))] | 1869 (set (match_dup 3) (match_dup 5))] |
2119 " | 1870 " |
2120 { | 1871 { |
2121 rtx op0 = operands[0]; | 1872 rtx op0 = operands[0]; |
2122 rtx op1 = operands[1]; | 1873 rtx op1 = operands[1]; |
2123 REAL_VALUE_TYPE rv; | |
2124 long l[2]; | 1874 long l[2]; |
2125 | 1875 |
2126 REAL_VALUE_FROM_CONST_DOUBLE (rv, op1); | 1876 REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (op1), l); |
2127 REAL_VALUE_TO_TARGET_DOUBLE (rv, l); | |
2128 | 1877 |
2129 operands[2] = gen_highpart (SImode, op0); | 1878 operands[2] = gen_highpart (SImode, op0); |
2130 operands[3] = gen_lowpart (SImode, op0); | 1879 operands[3] = gen_lowpart (SImode, op0); |
2131 operands[4] = GEN_INT (l[0]); | 1880 operands[4] = GEN_INT (l[0]); |
2132 operands[5] = GEN_INT (l[1]); | 1881 operands[5] = GEN_INT (l[1]); |
2243 rtx icc = operands[1]; | 1992 rtx icc = operands[1]; |
2244 rtx icr = operands[2]; | 1993 rtx icr = operands[2]; |
2245 | 1994 |
2246 start_sequence (); | 1995 start_sequence (); |
2247 | 1996 |
2248 emit_insn (gen_rtx_SET (VOIDmode, icr, | 1997 emit_insn (gen_rtx_SET (icr, gen_rtx_LT (CC_CCRmode, icc, const0_rtx))); |
2249 gen_rtx_LT (CC_CCRmode, icc, const0_rtx))); | |
2250 | 1998 |
2251 emit_insn (gen_movsi (dest, const1_rtx)); | 1999 emit_insn (gen_movsi (dest, const1_rtx)); |
2252 | 2000 |
2253 emit_insn (gen_rtx_COND_EXEC (VOIDmode, | 2001 emit_insn (gen_rtx_COND_EXEC (VOIDmode, |
2254 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), | 2002 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), |
2255 gen_rtx_SET (VOIDmode, dest, | 2003 gen_rtx_SET (dest, |
2256 gen_rtx_NEG (SImode, dest)))); | 2004 gen_rtx_NEG (SImode, dest)))); |
2257 | 2005 |
2258 emit_insn (gen_rtx_SET (VOIDmode, icr, | 2006 emit_insn (gen_rtx_SET (icr, gen_rtx_EQ (CC_CCRmode, icc, const0_rtx))); |
2259 gen_rtx_EQ (CC_CCRmode, icc, const0_rtx))); | |
2260 | 2007 |
2261 emit_insn (gen_rtx_COND_EXEC (VOIDmode, | 2008 emit_insn (gen_rtx_COND_EXEC (VOIDmode, |
2262 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), | 2009 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), |
2263 gen_rtx_SET (VOIDmode, dest, const0_rtx))); | 2010 gen_rtx_SET (dest, const0_rtx))); |
2264 | 2011 |
2265 operands[3] = get_insns (); | 2012 operands[3] = get_insns (); |
2266 end_sequence (); | 2013 end_sequence (); |
2267 }") | 2014 }") |
2268 | 2015 |
2311 rtx icc = operands[1]; | 2058 rtx icc = operands[1]; |
2312 rtx icr = operands[2]; | 2059 rtx icr = operands[2]; |
2313 | 2060 |
2314 start_sequence (); | 2061 start_sequence (); |
2315 | 2062 |
2316 emit_insn (gen_rtx_SET (VOIDmode, icr, | 2063 emit_insn (gen_rtx_SET (icr, gen_rtx_GTU (CC_CCRmode, icc, const0_rtx))); |
2317 gen_rtx_GTU (CC_CCRmode, icc, const0_rtx))); | |
2318 | 2064 |
2319 emit_insn (gen_movsi (dest, const1_rtx)); | 2065 emit_insn (gen_movsi (dest, const1_rtx)); |
2320 | 2066 |
2321 emit_insn (gen_rtx_COND_EXEC (VOIDmode, | 2067 emit_insn (gen_rtx_COND_EXEC (VOIDmode, |
2322 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), | 2068 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), |
2323 gen_addsi3 (dest, dest, dest))); | 2069 gen_addsi3 (dest, dest, dest))); |
2324 | 2070 |
2325 emit_insn (gen_rtx_SET (VOIDmode, icr, | 2071 emit_insn (gen_rtx_SET (icr, gen_rtx_LTU (CC_CCRmode, icc, const0_rtx))); |
2326 gen_rtx_LTU (CC_CCRmode, icc, const0_rtx))); | |
2327 | 2072 |
2328 emit_insn (gen_rtx_COND_EXEC (VOIDmode, | 2073 emit_insn (gen_rtx_COND_EXEC (VOIDmode, |
2329 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), | 2074 gen_rtx_NE (CC_CCRmode, icr, const0_rtx), |
2330 gen_rtx_SET (VOIDmode, dest, const0_rtx))); | 2075 gen_rtx_SET (dest, const0_rtx))); |
2331 | 2076 |
2332 operands[3] = get_insns (); | 2077 operands[3] = get_insns (); |
2333 end_sequence (); | 2078 end_sequence (); |
2334 }") | 2079 }") |
2335 | 2080 |
2580 emit_move_insn (operands[0], const1_rtx); | 2325 emit_move_insn (operands[0], const1_rtx); |
2581 emit_insn (gen_rtx_COND_EXEC (VOIDmode, | 2326 emit_insn (gen_rtx_COND_EXEC (VOIDmode, |
2582 gen_rtx_EQ (CC_CCRmode, | 2327 gen_rtx_EQ (CC_CCRmode, |
2583 operands[1], | 2328 operands[1], |
2584 const0_rtx), | 2329 const0_rtx), |
2585 gen_rtx_SET (VOIDmode, int_op0, | 2330 gen_rtx_SET (int_op0, const0_rtx))); |
2586 const0_rtx))); | |
2587 | 2331 |
2588 operands[2] = get_insns (); | 2332 operands[2] = get_insns (); |
2589 end_sequence (); | 2333 end_sequence (); |
2590 }") | 2334 }") |
2591 | 2335 |
7602 (match_operand:SI 2 "" "") | 7346 (match_operand:SI 2 "" "") |
7603 (match_operand:SI 3 "" "")] | 7347 (match_operand:SI 3 "" "")] |
7604 "" | 7348 "" |
7605 " | 7349 " |
7606 { | 7350 { |
7607 rtx insn; | 7351 rtx_insn *insn = emit_insn (gen_symGOT2reg_i (operands[0], operands[1], |
7608 | 7352 operands[2], operands[3])); |
7609 insn = emit_insn (gen_symGOT2reg_i (operands[0], operands[1], operands[2], operands[3])); | |
7610 | 7353 |
7611 MEM_READONLY_P (SET_SRC (PATTERN (insn))) = 1; | 7354 MEM_READONLY_P (SET_SRC (PATTERN (insn))) = 1; |
7612 | 7355 |
7613 set_unique_reg_note (insn, REG_EQUAL, operands[1]); | 7356 set_unique_reg_note (insn, REG_EQUAL, operands[1]); |
7614 | 7357 |
7686 (match_operand:SI 2 "" "") | 7429 (match_operand:SI 2 "" "") |
7687 (match_operand:SI 3 "" "")] | 7430 (match_operand:SI 3 "" "")] |
7688 "" | 7431 "" |
7689 " | 7432 " |
7690 { | 7433 { |
7691 rtx insn = emit_insn (gen_symGOTOFF2reg_i (operands[0], operands[1], operands[2], operands[3])); | 7434 rtx_insn *insn = emit_insn (gen_symGOTOFF2reg_i (operands[0], operands[1], |
7435 operands[2], operands[3])); | |
7692 | 7436 |
7693 set_unique_reg_note (insn, REG_EQUAL, operands[1]); | 7437 set_unique_reg_note (insn, REG_EQUAL, operands[1]); |
7694 | 7438 |
7695 DONE; | 7439 DONE; |
7696 }") | 7440 }") |
7712 (match_operand:SI 3 "" "") | 7456 (match_operand:SI 3 "" "") |
7713 (match_dup 4)] | 7457 (match_dup 4)] |
7714 "" | 7458 "" |
7715 " | 7459 " |
7716 { | 7460 { |
7717 rtx insn; | |
7718 | |
7719 if (!can_create_pseudo_p ()) | 7461 if (!can_create_pseudo_p ()) |
7720 operands[4] = operands[0]; | 7462 operands[4] = operands[0]; |
7721 else | 7463 else |
7722 operands[4] = gen_reg_rtx (SImode); | 7464 operands[4] = gen_reg_rtx (SImode); |
7723 | 7465 |
7724 emit_insn (frv_gen_GPsym2reg (operands[4], operands[2])); | 7466 emit_insn (frv_gen_GPsym2reg (operands[4], operands[2])); |
7725 | 7467 |
7726 insn = emit_insn (gen_symGOTOFF2reg_i (operands[0], operands[1], | 7468 rtx_insn *insn = emit_insn (gen_symGOTOFF2reg_i (operands[0], operands[1], |
7727 operands[4], operands[3])); | 7469 operands[4], operands[3])); |
7728 | 7470 |
7729 set_unique_reg_note (insn, REG_EQUAL, operands[1]); | 7471 set_unique_reg_note (insn, REG_EQUAL, operands[1]); |
7730 | 7472 |
7731 DONE; | 7473 DONE; |
7732 }") | 7474 }") |
7738 (match_operand:SI 3 "" "") | 7480 (match_operand:SI 3 "" "") |
7739 (match_dup 4)] | 7481 (match_dup 4)] |
7740 "" | 7482 "" |
7741 " | 7483 " |
7742 { | 7484 { |
7743 rtx insn; | |
7744 | |
7745 if (!can_create_pseudo_p ()) | 7485 if (!can_create_pseudo_p ()) |
7746 { | 7486 { |
7747 emit_insn (gen_symGOT2reg (operands[0], operands[1], operands[2], | 7487 emit_insn (gen_symGOT2reg (operands[0], operands[1], operands[2], |
7748 GEN_INT (R_FRV_GOT12))); | 7488 GEN_INT (R_FRV_GOT12))); |
7749 DONE; | 7489 DONE; |
7751 | 7491 |
7752 operands[4] = gen_reg_rtx (SImode); | 7492 operands[4] = gen_reg_rtx (SImode); |
7753 | 7493 |
7754 emit_insn (frv_gen_GPsym2reg (operands[4], operands[2])); | 7494 emit_insn (frv_gen_GPsym2reg (operands[4], operands[2])); |
7755 | 7495 |
7756 insn = emit_insn (gen_symGOTOFF2reg_hilo (operands[0], operands[1], | 7496 rtx_insn *insn = emit_insn (gen_symGOTOFF2reg_hilo (operands[0], operands[1], |
7757 operands[4], operands[3])); | 7497 operands[4], operands[3])); |
7758 | 7498 |
7759 set_unique_reg_note (insn, REG_EQUAL, operands[1]); | 7499 set_unique_reg_note (insn, REG_EQUAL, operands[1]); |
7760 | 7500 |
7761 DONE; | 7501 DONE; |
7762 }") | 7502 }") |