aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRamana Radhakrishnan <ramana.radhakrishnan@linaro.org>2011-03-15 16:14:21 +0000
committerRamana Radhakrishnan <ramana@gcc.gnu.org>2011-03-15 16:14:21 +0000
commit80fffdef8fb97cc8e1774cfdaf2eabd07c9a7867 (patch)
tree7ad79e45595c25990addd5141b192080efc5640c /gcc
parent930672adb7c3ae012e0af46eb19b0e8de1974cfb (diff)
downloadgcc-80fffdef8fb97cc8e1774cfdaf2eabd07c9a7867.zip
gcc-80fffdef8fb97cc8e1774cfdaf2eabd07c9a7867.tar.gz
gcc-80fffdef8fb97cc8e1774cfdaf2eabd07c9a7867.tar.bz2
re PR c++/47688 ([C++0x] Segfault when assigning lambda to std::function variable)
Fix PR 47688 2011-03-18 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. From-SVN: r171000
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.md4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/pr47688.c26
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3f2eef..572309c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-15 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
+
+ PR target/47668
+ * config/arm/arm.md (arm_movtas_ze): Use 'L' instead of 'c'
+ in the output template.
+
2011-03-15 Richard Guenther <rguenther@suse.de>
PR middle-end/47650
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 6f31e62..b0f31f5 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -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")]
)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 753f900..2897366 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-15 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
+
+ PR target/47688
+ * gcc.target/arm/pr47688.c: New.
+
2011-03-15 Richard Guenther <rguenther@suse.de>
PR middle-end/47650
diff --git a/gcc/testsuite/gcc.target/arm/pr47688.c b/gcc/testsuite/gcc.target/arm/pr47688.c
new file mode 100644
index 0000000..2236769
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr47688.c
@@ -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);
+}