Hi,
This patch fixes PR47688 which is a regression from gcc 4.4 and which
ends up fixing https://bugs.launchpad.net/gcc-linaro/+bug/730440. The
change is essentially in the punctuation character to only print out the
lower 16 bits of the constant.
I'll commit this into trunk and backport this to 4.5 branch once testing
completes. A bootstrap of trunk for C, C++ and Fortran in Thumb2 has
already completed and regression tests are on.
Cheers
Ramana
2011-03-10 Ramana Radhakrishnan <ramana.radhakrish...@linaro.org>
PR target/47668
gcc/
* config/arm/arm.md (arm_movtas_ze): Use 'L' instead of 'c'
in the output template.
gcc/testsuite/
* gcc.target/arm/pr47688.c: New.
---
Ramana Radhakrishnan
Index: gcc/config/arm/arm.md
===================================================================
--- gcc/config/arm/arm.md (revision 170820)
+++ gcc/config/arm/arm.md (working copy)
@@ -10580,13 +10580,15 @@
[(set_attr "conds" "clob")]
)
+;; We only care about the lower 16 bits of the constant
+;; being inserted into the upper 16 bits of the register.
(define_insn "*arm_movtas_ze"
[(set (zero_extract:SI (match_operand:SI 0 "s_register_operand" "+r")
(const_int 16)
(const_int 16))
(match_operand:SI 1 "const_int_operand" ""))]
"arm_arch_thumb2"
- "movt%?\t%0, %c1"
+ "movt%?\t%0, %L1"
[(set_attr "predicable" "yes")
(set_attr "length" "4")]
)
--- /dev/null 2011-03-10 09:33:21.341560001 +0000
+++ ./gcc/testsuite/gcc.target/arm/pr47688.c 2011-03-10 15:46:16.197181998
+0000
@@ -0,0 +1,26 @@
+/* { dg-options "-mthumb -O2" } */
+/* { dg-require-effective-target arm_thumb2_ok } */
+/* { dg-final { scan-assembler-not "-32768" } } */
+
+typedef union
+{
+ unsigned long int u_32_value;
+ struct
+ {
+ unsigned short int u_16_value_0;
+ unsigned short int u_16_value_1;
+ } u_16_values;
+} my_union;
+
+
+unsigned long int Test(const unsigned short int wXe)
+{
+ my_union dwCalcVal;
+
+ dwCalcVal.u_16_values.u_16_value_0=wXe;
+ dwCalcVal.u_16_values.u_16_value_1=0x8000u;
+
+ dwCalcVal.u_32_value /=3;
+
+ return (dwCalcVal.u_32_value);
+}