diff mbox

[ARM] Fix PR47688

Message ID 4D7A3645.3070500@linaro.org
State Accepted
Headers show

Commit Message

Ramana Radhakrishnan March 11, 2011, 2:48 p.m. UTC
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.radhakrishnan@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
diff mbox

Patch

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