diff options
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106772.patch')
-rw-r--r-- | toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106772.patch | 350 |
1 files changed, 0 insertions, 350 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106772.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106772.patch deleted file mode 100644 index d918f9c58c..0000000000 --- a/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106772.patch +++ /dev/null | |||
@@ -1,350 +0,0 @@ | |||
1 | 2011-07-11 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> | ||
2 | |||
3 | gcc/ | ||
4 | 2011-06-22 Dmitry Plotnikov <dplotnikov@ispras.ru> | ||
5 | Dmitry Melnik <dm@ispras.ru> | ||
6 | |||
7 | * config/arm/arm.c (neon_immediate_valid_for_shift): New function. | ||
8 | (neon_output_shift_immediate): Ditto. | ||
9 | * config/arm/arm-protos.h (neon_immediate_valid_for_shift): New | ||
10 | prototype. | ||
11 | (neon_output_shift_immediate): Ditto. | ||
12 | * config/arm/neon.md (vashl<mode>3): Modified constraint. | ||
13 | (vashr<mode>3_imm): New insn pattern. | ||
14 | (vlshr<mode>3_imm): Ditto. | ||
15 | (vashr<mode>3): Modified constraint. | ||
16 | (vlshr<mode>3): Ditto. | ||
17 | * config/arm/predicates.md (imm_for_neon_lshift_operand): New | ||
18 | predicate. | ||
19 | (imm_for_neon_rshift_operand): Ditto. | ||
20 | (imm_lshift_or_reg_neon): Ditto. | ||
21 | (imm_rshift_or_reg_neon): Ditto. | ||
22 | |||
23 | * optabs.c (init_optabs): Init optab codes for vashl, vashr, vlshr. | ||
24 | |||
25 | === modified file 'gcc/config/arm/arm-protos.h' | ||
26 | --- old/gcc/config/arm/arm-protos.h 2011-06-14 16:00:30 +0000 | ||
27 | +++ new/gcc/config/arm/arm-protos.h 2011-07-04 14:03:49 +0000 | ||
28 | @@ -64,8 +64,12 @@ | ||
29 | extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *); | ||
30 | extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *, | ||
31 | int *); | ||
32 | +extern int neon_immediate_valid_for_shift (rtx, enum machine_mode, rtx *, | ||
33 | + int *, bool); | ||
34 | extern char *neon_output_logic_immediate (const char *, rtx *, | ||
35 | enum machine_mode, int, int); | ||
36 | +extern char *neon_output_shift_immediate (const char *, char, rtx *, | ||
37 | + enum machine_mode, int, bool); | ||
38 | extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode, | ||
39 | rtx (*) (rtx, rtx, rtx)); | ||
40 | extern rtx neon_make_constant (rtx); | ||
41 | |||
42 | === modified file 'gcc/config/arm/arm.c' | ||
43 | --- old/gcc/config/arm/arm.c 2011-06-29 09:13:17 +0000 | ||
44 | +++ new/gcc/config/arm/arm.c 2011-07-04 14:03:49 +0000 | ||
45 | @@ -8863,6 +8863,66 @@ | ||
46 | return 1; | ||
47 | } | ||
48 | |||
49 | +/* Return TRUE if rtx OP is legal for use in a VSHR or VSHL instruction. If | ||
50 | + the immediate is valid, write a constant suitable for using as an operand | ||
51 | + to VSHR/VSHL to *MODCONST and the corresponding element width to | ||
52 | + *ELEMENTWIDTH. ISLEFTSHIFT is for determine left or right shift, | ||
53 | + because they have different limitations. */ | ||
54 | + | ||
55 | +int | ||
56 | +neon_immediate_valid_for_shift (rtx op, enum machine_mode mode, | ||
57 | + rtx *modconst, int *elementwidth, | ||
58 | + bool isleftshift) | ||
59 | +{ | ||
60 | + unsigned int innersize = GET_MODE_SIZE (GET_MODE_INNER (mode)); | ||
61 | + unsigned int n_elts = CONST_VECTOR_NUNITS (op), i; | ||
62 | + unsigned HOST_WIDE_INT last_elt = 0; | ||
63 | + unsigned HOST_WIDE_INT maxshift; | ||
64 | + | ||
65 | + /* Split vector constant out into a byte vector. */ | ||
66 | + for (i = 0; i < n_elts; i++) | ||
67 | + { | ||
68 | + rtx el = CONST_VECTOR_ELT (op, i); | ||
69 | + unsigned HOST_WIDE_INT elpart; | ||
70 | + | ||
71 | + if (GET_CODE (el) == CONST_INT) | ||
72 | + elpart = INTVAL (el); | ||
73 | + else if (GET_CODE (el) == CONST_DOUBLE) | ||
74 | + return 0; | ||
75 | + else | ||
76 | + gcc_unreachable (); | ||
77 | + | ||
78 | + if (i != 0 && elpart != last_elt) | ||
79 | + return 0; | ||
80 | + | ||
81 | + last_elt = elpart; | ||
82 | + } | ||
83 | + | ||
84 | + /* Shift less than element size. */ | ||
85 | + maxshift = innersize * 8; | ||
86 | + | ||
87 | + if (isleftshift) | ||
88 | + { | ||
89 | + /* Left shift immediate value can be from 0 to <size>-1. */ | ||
90 | + if (last_elt >= maxshift) | ||
91 | + return 0; | ||
92 | + } | ||
93 | + else | ||
94 | + { | ||
95 | + /* Right shift immediate value can be from 1 to <size>. */ | ||
96 | + if (last_elt == 0 || last_elt > maxshift) | ||
97 | + return 0; | ||
98 | + } | ||
99 | + | ||
100 | + if (elementwidth) | ||
101 | + *elementwidth = innersize * 8; | ||
102 | + | ||
103 | + if (modconst) | ||
104 | + *modconst = CONST_VECTOR_ELT (op, 0); | ||
105 | + | ||
106 | + return 1; | ||
107 | +} | ||
108 | + | ||
109 | /* Return a string suitable for output of Neon immediate logic operation | ||
110 | MNEM. */ | ||
111 | |||
112 | @@ -8885,6 +8945,28 @@ | ||
113 | return templ; | ||
114 | } | ||
115 | |||
116 | +/* Return a string suitable for output of Neon immediate shift operation | ||
117 | + (VSHR or VSHL) MNEM. */ | ||
118 | + | ||
119 | +char * | ||
120 | +neon_output_shift_immediate (const char *mnem, char sign, rtx *op2, | ||
121 | + enum machine_mode mode, int quad, | ||
122 | + bool isleftshift) | ||
123 | +{ | ||
124 | + int width, is_valid; | ||
125 | + static char templ[40]; | ||
126 | + | ||
127 | + is_valid = neon_immediate_valid_for_shift (*op2, mode, op2, &width, isleftshift); | ||
128 | + gcc_assert (is_valid != 0); | ||
129 | + | ||
130 | + if (quad) | ||
131 | + sprintf (templ, "%s.%c%d\t%%q0, %%q1, %%2", mnem, sign, width); | ||
132 | + else | ||
133 | + sprintf (templ, "%s.%c%d\t%%P0, %%P1, %%2", mnem, sign, width); | ||
134 | + | ||
135 | + return templ; | ||
136 | +} | ||
137 | + | ||
138 | /* Output a sequence of pairwise operations to implement a reduction. | ||
139 | NOTE: We do "too much work" here, because pairwise operations work on two | ||
140 | registers-worth of operands in one go. Unfortunately we can't exploit those | ||
141 | |||
142 | === modified file 'gcc/config/arm/neon.md' | ||
143 | --- old/gcc/config/arm/neon.md 2011-07-01 09:19:21 +0000 | ||
144 | +++ new/gcc/config/arm/neon.md 2011-07-04 14:03:49 +0000 | ||
145 | @@ -956,15 +956,57 @@ | ||
146 | ; SImode elements. | ||
147 | |||
148 | (define_insn "vashl<mode>3" | ||
149 | - [(set (match_operand:VDQIW 0 "s_register_operand" "=w") | ||
150 | - (ashift:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w") | ||
151 | - (match_operand:VDQIW 2 "s_register_operand" "w")))] | ||
152 | - "TARGET_NEON" | ||
153 | - "vshl.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2" | ||
154 | - [(set (attr "neon_type") | ||
155 | - (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0)) | ||
156 | - (const_string "neon_vshl_ddd") | ||
157 | - (const_string "neon_shift_3")))] | ||
158 | + [(set (match_operand:VDQIW 0 "s_register_operand" "=w,w") | ||
159 | + (ashift:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w,w") | ||
160 | + (match_operand:VDQIW 2 "imm_lshift_or_reg_neon" "w,Dn")))] | ||
161 | + "TARGET_NEON" | ||
162 | + { | ||
163 | + switch (which_alternative) | ||
164 | + { | ||
165 | + case 0: return "vshl.<V_s_elem>\t%<V_reg>0, %<V_reg>1, %<V_reg>2"; | ||
166 | + case 1: return neon_output_shift_immediate ("vshl", 'i', &operands[2], | ||
167 | + <MODE>mode, | ||
168 | + VALID_NEON_QREG_MODE (<MODE>mode), | ||
169 | + true); | ||
170 | + default: gcc_unreachable (); | ||
171 | + } | ||
172 | + } | ||
173 | + [(set (attr "neon_type") | ||
174 | + (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0)) | ||
175 | + (const_string "neon_vshl_ddd") | ||
176 | + (const_string "neon_shift_3")))] | ||
177 | +) | ||
178 | + | ||
179 | +(define_insn "vashr<mode>3_imm" | ||
180 | + [(set (match_operand:VDQIW 0 "s_register_operand" "=w") | ||
181 | + (ashiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w") | ||
182 | + (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dn")))] | ||
183 | + "TARGET_NEON" | ||
184 | + { | ||
185 | + return neon_output_shift_immediate ("vshr", 's', &operands[2], | ||
186 | + <MODE>mode, VALID_NEON_QREG_MODE (<MODE>mode), | ||
187 | + false); | ||
188 | + } | ||
189 | + [(set (attr "neon_type") | ||
190 | + (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0)) | ||
191 | + (const_string "neon_vshl_ddd") | ||
192 | + (const_string "neon_shift_3")))] | ||
193 | +) | ||
194 | + | ||
195 | +(define_insn "vlshr<mode>3_imm" | ||
196 | + [(set (match_operand:VDQIW 0 "s_register_operand" "=w") | ||
197 | + (lshiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w") | ||
198 | + (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dn")))] | ||
199 | + "TARGET_NEON" | ||
200 | + { | ||
201 | + return neon_output_shift_immediate ("vshr", 'u', &operands[2], | ||
202 | + <MODE>mode, VALID_NEON_QREG_MODE (<MODE>mode), | ||
203 | + false); | ||
204 | + } | ||
205 | + [(set (attr "neon_type") | ||
206 | + (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0)) | ||
207 | + (const_string "neon_vshl_ddd") | ||
208 | + (const_string "neon_shift_3")))] | ||
209 | ) | ||
210 | |||
211 | ; Used for implementing logical shift-right, which is a left-shift by a negative | ||
212 | @@ -1004,28 +1046,34 @@ | ||
213 | (define_expand "vashr<mode>3" | ||
214 | [(set (match_operand:VDQIW 0 "s_register_operand" "") | ||
215 | (ashiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "") | ||
216 | - (match_operand:VDQIW 2 "s_register_operand" "")))] | ||
217 | + (match_operand:VDQIW 2 "imm_rshift_or_reg_neon" "")))] | ||
218 | "TARGET_NEON" | ||
219 | { | ||
220 | rtx neg = gen_reg_rtx (<MODE>mode); | ||
221 | - | ||
222 | - emit_insn (gen_neg<mode>2 (neg, operands[2])); | ||
223 | - emit_insn (gen_ashl<mode>3_signed (operands[0], operands[1], neg)); | ||
224 | - | ||
225 | + if (REG_P (operands[2])) | ||
226 | + { | ||
227 | + emit_insn (gen_neg<mode>2 (neg, operands[2])); | ||
228 | + emit_insn (gen_ashl<mode>3_signed (operands[0], operands[1], neg)); | ||
229 | + } | ||
230 | + else | ||
231 | + emit_insn (gen_vashr<mode>3_imm (operands[0], operands[1], operands[2])); | ||
232 | DONE; | ||
233 | }) | ||
234 | |||
235 | (define_expand "vlshr<mode>3" | ||
236 | [(set (match_operand:VDQIW 0 "s_register_operand" "") | ||
237 | (lshiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "") | ||
238 | - (match_operand:VDQIW 2 "s_register_operand" "")))] | ||
239 | + (match_operand:VDQIW 2 "imm_rshift_or_reg_neon" "")))] | ||
240 | "TARGET_NEON" | ||
241 | { | ||
242 | rtx neg = gen_reg_rtx (<MODE>mode); | ||
243 | - | ||
244 | - emit_insn (gen_neg<mode>2 (neg, operands[2])); | ||
245 | - emit_insn (gen_ashl<mode>3_unsigned (operands[0], operands[1], neg)); | ||
246 | - | ||
247 | + if (REG_P (operands[2])) | ||
248 | + { | ||
249 | + emit_insn (gen_neg<mode>2 (neg, operands[2])); | ||
250 | + emit_insn (gen_ashl<mode>3_unsigned (operands[0], operands[1], neg)); | ||
251 | + } | ||
252 | + else | ||
253 | + emit_insn (gen_vlshr<mode>3_imm (operands[0], operands[1], operands[2])); | ||
254 | DONE; | ||
255 | }) | ||
256 | |||
257 | |||
258 | === modified file 'gcc/config/arm/predicates.md' | ||
259 | --- old/gcc/config/arm/predicates.md 2011-06-22 15:50:23 +0000 | ||
260 | +++ new/gcc/config/arm/predicates.md 2011-07-04 14:03:49 +0000 | ||
261 | @@ -585,6 +585,26 @@ | ||
262 | return neon_immediate_valid_for_move (op, mode, NULL, NULL); | ||
263 | }) | ||
264 | |||
265 | +(define_predicate "imm_for_neon_lshift_operand" | ||
266 | + (match_code "const_vector") | ||
267 | +{ | ||
268 | + return neon_immediate_valid_for_shift (op, mode, NULL, NULL, true); | ||
269 | +}) | ||
270 | + | ||
271 | +(define_predicate "imm_for_neon_rshift_operand" | ||
272 | + (match_code "const_vector") | ||
273 | +{ | ||
274 | + return neon_immediate_valid_for_shift (op, mode, NULL, NULL, false); | ||
275 | +}) | ||
276 | + | ||
277 | +(define_predicate "imm_lshift_or_reg_neon" | ||
278 | + (ior (match_operand 0 "s_register_operand") | ||
279 | + (match_operand 0 "imm_for_neon_lshift_operand"))) | ||
280 | + | ||
281 | +(define_predicate "imm_rshift_or_reg_neon" | ||
282 | + (ior (match_operand 0 "s_register_operand") | ||
283 | + (match_operand 0 "imm_for_neon_rshift_operand"))) | ||
284 | + | ||
285 | (define_predicate "imm_for_neon_logic_operand" | ||
286 | (match_code "const_vector") | ||
287 | { | ||
288 | |||
289 | === modified file 'gcc/optabs.c' | ||
290 | --- old/gcc/optabs.c 2011-03-04 10:27:10 +0000 | ||
291 | +++ new/gcc/optabs.c 2011-07-04 14:03:49 +0000 | ||
292 | @@ -6171,6 +6171,9 @@ | ||
293 | init_optab (usashl_optab, US_ASHIFT); | ||
294 | init_optab (ashr_optab, ASHIFTRT); | ||
295 | init_optab (lshr_optab, LSHIFTRT); | ||
296 | + init_optabv (vashl_optab, ASHIFT); | ||
297 | + init_optabv (vashr_optab, ASHIFTRT); | ||
298 | + init_optabv (vlshr_optab, LSHIFTRT); | ||
299 | init_optab (rotl_optab, ROTATE); | ||
300 | init_optab (rotr_optab, ROTATERT); | ||
301 | init_optab (smin_optab, SMIN); | ||
302 | |||
303 | === added file 'gcc/testsuite/gcc.target/arm/neon-vlshr-imm-1.c' | ||
304 | --- old/gcc/testsuite/gcc.target/arm/neon-vlshr-imm-1.c 1970-01-01 00:00:00 +0000 | ||
305 | +++ new/gcc/testsuite/gcc.target/arm/neon-vlshr-imm-1.c 2011-07-04 14:03:49 +0000 | ||
306 | @@ -0,0 +1,11 @@ | ||
307 | +/* { dg-do compile } */ | ||
308 | +/* { dg-require-effective-target arm_neon_ok } */ | ||
309 | +/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" } */ | ||
310 | +/* { dg-final { scan-assembler "vshr\.u32.*#3" } } */ | ||
311 | + | ||
312 | +/* Verify that VSHR immediate is used. */ | ||
313 | +void f1(int n, unsigned int x[], unsigned int y[]) { | ||
314 | + int i; | ||
315 | + for (i = 0; i < n; ++i) | ||
316 | + y[i] = x[i] >> 3; | ||
317 | +} | ||
318 | |||
319 | === added file 'gcc/testsuite/gcc.target/arm/neon-vshl-imm-1.c' | ||
320 | --- old/gcc/testsuite/gcc.target/arm/neon-vshl-imm-1.c 1970-01-01 00:00:00 +0000 | ||
321 | +++ new/gcc/testsuite/gcc.target/arm/neon-vshl-imm-1.c 2011-07-04 14:03:49 +0000 | ||
322 | @@ -0,0 +1,11 @@ | ||
323 | +/* { dg-do compile } */ | ||
324 | +/* { dg-require-effective-target arm_neon_ok } */ | ||
325 | +/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" } */ | ||
326 | +/* { dg-final { scan-assembler "vshl\.i32.*#3" } } */ | ||
327 | + | ||
328 | +/* Verify that VSHR immediate is used. */ | ||
329 | +void f1(int n, int x[], int y[]) { | ||
330 | + int i; | ||
331 | + for (i = 0; i < n; ++i) | ||
332 | + y[i] = x[i] << 3; | ||
333 | +} | ||
334 | |||
335 | === added file 'gcc/testsuite/gcc.target/arm/neon-vshr-imm-1.c' | ||
336 | --- old/gcc/testsuite/gcc.target/arm/neon-vshr-imm-1.c 1970-01-01 00:00:00 +0000 | ||
337 | +++ new/gcc/testsuite/gcc.target/arm/neon-vshr-imm-1.c 2011-07-04 14:03:49 +0000 | ||
338 | @@ -0,0 +1,11 @@ | ||
339 | +/* { dg-do compile } */ | ||
340 | +/* { dg-require-effective-target arm_neon_ok } */ | ||
341 | +/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" } */ | ||
342 | +/* { dg-final { scan-assembler "vshr\.s32.*#3" } } */ | ||
343 | + | ||
344 | +/* Verify that VSHR immediate is used. */ | ||
345 | +void f1(int n, int x[], int y[]) { | ||
346 | + int i; | ||
347 | + for (i = 0; i < n; ++i) | ||
348 | + y[i] = x[i] >> 3; | ||
349 | +} | ||
350 | |||