aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch')
-rw-r--r--meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch298
1 files changed, 298 insertions, 0 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch
new file mode 100644
index 0000000000..239251d2b5
--- /dev/null
+++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99353.patch
@@ -0,0 +1,298 @@
+ 2010-04-08 Bernd Schmidt <bernds@codesourcery.com>
+
+ Issue #6952
+
+ gcc/
+ * ira-costs.c (record_reg_classes): Ignore alternatives that are
+ not enabled.
+ * config/arm/vfp.md (arm_movdi_vfp): Enable only when not tuning
+ for Cortex-A8.
+ (arm_movdi_vfp_cortexa8): New pattern.
+ * config/arm/neon.md (adddi3_neon, subdi3_neon, anddi3_neon,
+ iordi3_neon, xordi3_neon): Add alternatives to discourage Neon
+ instructions when tuning for Cortex-A8. Set attribute "alt_tune".
+ * config/arm/arm.md (define_attr "alt_tune", define_attr "enabled"):
+ New.
+
+2010-07-26 Julian Brown <julian@codesourcery.com>
+
+ Merge from Sourcery G++ 4.4:
+
+ 2010-04-07 Thomas Schwinge <thomas@codesourcery.com>
+ Daniel Jacobowitz <dan@codesourcery.com>
+
+
+=== modified file 'gcc/config/arm/arm.md'
+--- old/gcc/config/arm/arm.md 2010-08-13 10:30:35 +0000
++++ new/gcc/config/arm/arm.md 2010-08-13 11:40:17 +0000
+@@ -432,6 +432,20 @@
+ (const_string "yes")
+ (const_string "no"))))
+
++; Specifies which machine an alternative is tuned for. Used to compute
++; attribute ENABLED.
++(define_attr "alt_tune" "all,onlya8,nota8" (const_string "all"))
++
++(define_attr "enabled" ""
++ (cond [(and (eq_attr "alt_tune" "onlya8")
++ (not (eq_attr "tune" "cortexa8")))
++ (const_int 0)
++
++ (and (eq_attr "alt_tune" "nota8")
++ (eq_attr "tune" "cortexa8"))
++ (const_int 0)]
++ (const_int 1)))
++
+ (include "arm-generic.md")
+ (include "arm926ejs.md")
+ (include "arm1020e.md")
+
+=== modified file 'gcc/config/arm/neon.md'
+--- old/gcc/config/arm/neon.md 2010-08-10 13:31:21 +0000
++++ new/gcc/config/arm/neon.md 2010-08-13 11:40:17 +0000
+@@ -827,23 +827,25 @@
+ )
+
+ (define_insn "adddi3_neon"
+- [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r")
+- (plus:DI (match_operand:DI 1 "s_register_operand" "%w,0,0")
+- (match_operand:DI 2 "s_register_operand" "w,r,0")))
++ [(set (match_operand:DI 0 "s_register_operand" "=w,?w,?&r,?&r")
++ (plus:DI (match_operand:DI 1 "s_register_operand" "%w,w,0,0")
++ (match_operand:DI 2 "s_register_operand" "w,w,r,0")))
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_NEON"
+ {
+ switch (which_alternative)
+ {
+- case 0: return "vadd.i64\t%P0, %P1, %P2";
+- case 1: return "#";
++ case 0: /* fall through */
++ case 1: return "vadd.i64\t%P0, %P1, %P2";
+ case 2: return "#";
++ case 3: return "#";
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "neon_type" "neon_int_1,*,*")
+- (set_attr "conds" "*,clob,clob")
+- (set_attr "length" "*,8,8")]
++ [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*")
++ (set_attr "conds" "*,*,clob,clob")
++ (set_attr "length" "*,*,8,8")
++ (set_attr "alt_tune" "nota8,onlya8,*,*")]
+ )
+
+ (define_insn "*sub<mode>3_neon"
+@@ -861,24 +863,26 @@
+ )
+
+ (define_insn "subdi3_neon"
+- [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r,?&r")
+- (minus:DI (match_operand:DI 1 "s_register_operand" "w,0,r,0")
+- (match_operand:DI 2 "s_register_operand" "w,r,0,0")))
++ [(set (match_operand:DI 0 "s_register_operand" "=w,?w,?&r,?&r,?&r")
++ (minus:DI (match_operand:DI 1 "s_register_operand" "w,w,0,r,0")
++ (match_operand:DI 2 "s_register_operand" "w,w,r,0,0")))
+ (clobber (reg:CC CC_REGNUM))]
+ "TARGET_NEON"
+ {
+ switch (which_alternative)
+ {
+- case 0: return "vsub.i64\t%P0, %P1, %P2";
+- case 1: /* fall through */
+- case 2: /* fall through */
+- case 3: return "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2";
++ case 0: /* fall through */
++ case 1: return "vsub.i64\t%P0, %P1, %P2";
++ case 2: /* fall through */
++ case 3: /* fall through */
++ case 4: return "subs\\t%Q0, %Q1, %Q2\;sbc\\t%R0, %R1, %R2";
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "neon_type" "neon_int_2,*,*,*")
+- (set_attr "conds" "*,clob,clob,clob")
+- (set_attr "length" "*,8,8,8")]
++ [(set_attr "neon_type" "neon_int_2,neon_int_2,*,*,*")
++ (set_attr "conds" "*,*,clob,clob,clob")
++ (set_attr "length" "*,*,8,8,8")
++ (set_attr "alt_tune" "nota8,onlya8,*,*,*")]
+ )
+
+ (define_insn "*mul<mode>3_neon"
+@@ -964,23 +968,26 @@
+ )
+
+ (define_insn "iordi3_neon"
+- [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r")
+- (ior:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r")
+- (match_operand:DI 2 "neon_logic_op2" "w,Dl,r,r")))]
++ [(set (match_operand:DI 0 "s_register_operand" "=w,?w,w,?w,?&r,?&r")
++ (ior:DI (match_operand:DI 1 "s_register_operand" "%w,w,0,0,0,r")
++ (match_operand:DI 2 "neon_logic_op2" "w,w,Dl,Dl,r,r")))]
+ "TARGET_NEON"
+ {
+ switch (which_alternative)
+ {
+- case 0: return "vorr\t%P0, %P1, %P2";
+- case 1: return neon_output_logic_immediate ("vorr", &operands[2],
++ case 0: /* fall through */
++ case 1: return "vorr\t%P0, %P1, %P2";
++ case 2: /* fall through */
++ case 3: return neon_output_logic_immediate ("vorr", &operands[2],
+ DImode, 0, VALID_NEON_QREG_MODE (DImode));
+- case 2: return "#";
+- case 3: return "#";
++ case 4: return "#";
++ case 5: return "#";
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*")
+- (set_attr "length" "*,*,8,8")]
++ [(set_attr "neon_type" "neon_int_1,neon_int_1,neon_int_1,neon_int_1,*,*")
++ (set_attr "length" "*,*,*,*,8,8")
++ (set_attr "alt_tune" "nota8,onlya8,nota8,onlya8,*,*")]
+ )
+
+ ;; The concrete forms of the Neon immediate-logic instructions are vbic and
+@@ -1006,23 +1013,26 @@
+ )
+
+ (define_insn "anddi3_neon"
+- [(set (match_operand:DI 0 "s_register_operand" "=w,w,?&r,?&r")
+- (and:DI (match_operand:DI 1 "s_register_operand" "%w,0,0,r")
+- (match_operand:DI 2 "neon_inv_logic_op2" "w,DL,r,r")))]
++ [(set (match_operand:DI 0 "s_register_operand" "=w,?w,w,?w,?&r,?&r")
++ (and:DI (match_operand:DI 1 "s_register_operand" "%w,w,0,0,0,r")
++ (match_operand:DI 2 "neon_inv_logic_op2" "w,w,DL,DL,r,r")))]
+ "TARGET_NEON"
+ {
+ switch (which_alternative)
+ {
+- case 0: return "vand\t%P0, %P1, %P2";
+- case 1: return neon_output_logic_immediate ("vand", &operands[2],
++ case 0: /* fall through */
++ case 1: return "vand\t%P0, %P1, %P2";
++ case 2: /* fall through */
++ case 3: return neon_output_logic_immediate ("vand", &operands[2],
+ DImode, 1, VALID_NEON_QREG_MODE (DImode));
+- case 2: return "#";
+- case 3: return "#";
++ case 4: return "#";
++ case 5: return "#";
+ default: gcc_unreachable ();
+ }
+ }
+- [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*")
+- (set_attr "length" "*,*,8,8")]
++ [(set_attr "neon_type" "neon_int_1,neon_int_1,neon_int_1,neon_int_1,*,*")
++ (set_attr "length" "*,*,*,*,8,8")
++ (set_attr "alt_tune" "nota8,onlya8,nota8,onlya8,*,*")]
+ )
+
+ (define_insn "orn<mode>3_neon"
+@@ -1080,16 +1090,18 @@
+ )
+
+ (define_insn "xordi3_neon"
+- [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r")
+- (xor:DI (match_operand:DI 1 "s_register_operand" "%w,0,r")
+- (match_operand:DI 2 "s_register_operand" "w,r,r")))]
++ [(set (match_operand:DI 0 "s_register_operand" "=w,?w,?&r,?&r")
++ (xor:DI (match_operand:DI 1 "s_register_operand" "%w,w,0,r")
++ (match_operand:DI 2 "s_register_operand" "w,w,r,r")))]
+ "TARGET_NEON"
+ "@
+ veor\t%P0, %P1, %P2
++ veor\t%P0, %P1, %P2
+ #
+ #"
+- [(set_attr "neon_type" "neon_int_1,*,*")
+- (set_attr "length" "*,8,8")]
++ [(set_attr "neon_type" "neon_int_1,neon_int_1,*,*")
++ (set_attr "length" "*,*,8,8")
++ (set_attr "alt_tune" "nota8,onlya8,*,*")]
+ )
+
+ (define_insn "one_cmpl<mode>2"
+
+=== modified file 'gcc/config/arm/vfp.md'
+--- old/gcc/config/arm/vfp.md 2010-08-13 10:59:06 +0000
++++ new/gcc/config/arm/vfp.md 2010-08-13 11:40:17 +0000
+@@ -133,9 +133,51 @@
+ ;; DImode moves
+
+ (define_insn "*arm_movdi_vfp"
+- [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r,m,w,r,w,w, Uv")
+- (match_operand:DI 1 "di_operand" "rIK,mi,r,r,w,w,Uvi,w"))]
+- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP
++ [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, m,w,r,w,w, Uv")
++ (match_operand:DI 1 "di_operand" "rIK,mi,r,r,w,w,Uvi,w"))]
++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune != cortexa8
++ && ( register_operand (operands[0], DImode)
++ || register_operand (operands[1], DImode))"
++ "*
++ switch (which_alternative)
++ {
++ case 0:
++ return \"#\";
++ case 1:
++ case 2:
++ return output_move_double (operands);
++ case 3:
++ return \"fmdrr%?\\t%P0, %Q1, %R1\\t%@ int\";
++ case 4:
++ return \"fmrrd%?\\t%Q0, %R0, %P1\\t%@ int\";
++ case 5:
++ if (TARGET_VFP_SINGLE)
++ return \"fcpys%?\\t%0, %1\\t%@ int\;fcpys%?\\t%p0, %p1\\t%@ int\";
++ else
++ return \"fcpyd%?\\t%P0, %P1\\t%@ int\";
++ case 6: case 7:
++ return output_move_vfp (operands);
++ default:
++ gcc_unreachable ();
++ }
++ "
++ [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarithd,f_loadd,f_stored")
++ (set_attr "neon_type" "*,*,*,neon_mcr_2_mcrr,neon_mrrc,neon_vmov,*,*")
++ (set (attr "length") (cond [(eq_attr "alternative" "0,1,2") (const_int 8)
++ (eq_attr "alternative" "5")
++ (if_then_else
++ (eq (symbol_ref "TARGET_VFP_SINGLE") (const_int 1))
++ (const_int 8)
++ (const_int 4))]
++ (const_int 4)))
++ (set_attr "pool_range" "*,1020,*,*,*,*,1020,*")
++ (set_attr "neg_pool_range" "*,1008,*,*,*,*,1008,*")]
++)
++
++(define_insn "*arm_movdi_vfp_cortexa8"
++ [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r,m,w,!r,w,w, Uv")
++ (match_operand:DI 1 "di_operand" "rIK,mi,r,r,w,w,Uvi,w"))]
++ "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune == cortexa8
+ && ( register_operand (operands[0], DImode)
+ || register_operand (operands[1], DImode))"
+ "*
+
+=== modified file 'gcc/ira-costs.c'
+--- old/gcc/ira-costs.c 2009-11-25 10:55:54 +0000
++++ new/gcc/ira-costs.c 2010-08-13 11:40:17 +0000
+@@ -224,6 +224,14 @@
+ int alt_fail = 0;
+ int alt_cost = 0, op_cost_add;
+
++ if (!recog_data.alternative_enabled_p[alt])
++ {
++ for (i = 0; i < recog_data.n_operands; i++)
++ constraints[i] = skip_alternative (constraints[i]);
++
++ continue;
++ }
++
+ for (i = 0; i < n_ops; i++)
+ {
+ unsigned char c;
+