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);
+}

Reply via email to