summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-02 13:23:43 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-02 13:23:43 +0000
commitcde8f1c846d02f52e6ea68bd9fc4b799609d702a (patch)
treea1aa96b3278b1c873c7432d2ad53d27e983ec85a
parentb6c6057e81e94c26f222aea1731034e39620e88e (diff)
downloadgcc-cde8f1c846d02f52e6ea68bd9fc4b799609d702a.tar.gz
PR inline-asm/39058
* recog.h (asm_operand_ok): Add constraints argument. * recog.c (asm_operand_ok): Likewise. If it is set, for digits recurse on matching constraint. (check_asm_operands): Pass constraints as 3rd argument to asm_operand_ok. Don't look up matching constraint here. * stmt.c (expand_asm_operands): Pass NULL as 3rd argument to asm_operand_ok. * gcc.target/i386/pr39058.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143867 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/recog.c41
-rw-r--r--gcc/recog.h4
-rw-r--r--gcc/stmt.c4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.target/i386/pr39058.c34
6 files changed, 78 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49517440472..a4c777c57a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2009-02-02 Jakub Jelinek <jakub@redhat.com>
+
+ PR inline-asm/39058
+ * recog.h (asm_operand_ok): Add constraints argument.
+ * recog.c (asm_operand_ok): Likewise. If it is set, for digits
+ recurse on matching constraint.
+ (check_asm_operands): Pass constraints as 3rd argument to
+ asm_operand_ok. Don't look up matching constraint here.
+ * stmt.c (expand_asm_operands): Pass NULL as 3rd argument
+ to asm_operand_ok.
+
2009-02-02 Ben Elliston <bje@au.ibm.com>
* doc/tm.texi (Storage Layout): Fix TARGET_ALIGN_ANON_BITFIELD and
diff --git a/gcc/recog.c b/gcc/recog.c
index 0e2dd1bd60d..540617d5bb4 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -1,6 +1,6 @@
/* Subroutines used by or related to instruction recognition.
Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of GCC.
@@ -156,10 +156,7 @@ check_asm_operands (rtx x)
const char *c = constraints[i];
if (c[0] == '%')
c++;
- if (ISDIGIT ((unsigned char) c[0]) && c[1] == '\0')
- c = constraints[c[0] - '0'];
-
- if (! asm_operand_ok (operands[i], c))
+ if (! asm_operand_ok (operands[i], c, constraints))
return 0;
}
@@ -1547,7 +1544,7 @@ decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs,
Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */
int
-asm_operand_ok (rtx op, const char *constraint)
+asm_operand_ok (rtx op, const char *constraint, const char **constraints)
{
int result = 0;
@@ -1575,15 +1572,29 @@ asm_operand_ok (rtx op, const char *constraint)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- /* For best results, our caller should have given us the
- proper matching constraint, but we can't actually fail
- the check if they didn't. Indicate that results are
- inconclusive. */
- do
- constraint++;
- while (ISDIGIT (*constraint));
- if (! result)
- result = -1;
+ /* If caller provided constraints pointer, look up
+ the maching constraint. Otherwise, our caller should have
+ given us the proper matching constraint, but we can't
+ actually fail the check if they didn't. Indicate that
+ results are inconclusive. */
+ if (constraints)
+ {
+ char *end;
+ unsigned long match;
+
+ match = strtoul (constraint, &end, 10);
+ if (!result)
+ result = asm_operand_ok (op, constraints[match], NULL);
+ constraint = (const char *) end;
+ }
+ else
+ {
+ do
+ constraint++;
+ while (ISDIGIT (*constraint));
+ if (! result)
+ result = -1;
+ }
continue;
case 'p':
diff --git a/gcc/recog.h b/gcc/recog.h
index 9b73211e874..f2b1f6e4404 100644
--- a/gcc/recog.h
+++ b/gcc/recog.h
@@ -1,6 +1,6 @@
/* Declarations for interface to insn recognizer and insn-output.c.
Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004,
- 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of GCC.
@@ -72,7 +72,7 @@ struct operand_alternative
extern void init_recog (void);
extern void init_recog_no_volatile (void);
extern int check_asm_operands (rtx);
-extern int asm_operand_ok (rtx, const char *);
+extern int asm_operand_ok (rtx, const char *, const char **);
extern bool validate_change (rtx, rtx *, rtx, bool);
extern bool validate_unshare_change (rtx, rtx *, rtx, bool);
extern bool canonicalize_change_group (rtx insn, rtx x);
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 286e5663c98..c5369061e9d 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -1,6 +1,6 @@
/* Expands front end tree to back end RTL for GCC
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
- 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of GCC.
@@ -886,7 +886,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
else if (MEM_P (op))
op = validize_mem (op);
- if (asm_operand_ok (op, constraint) <= 0)
+ if (asm_operand_ok (op, constraint, NULL) <= 0)
{
if (allows_reg && TYPE_MODE (type) != BLKmode)
op = force_reg (TYPE_MODE (type), op);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c659971aa4a..828af3fad7a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -4,6 +4,9 @@
(check_effective_target_correct_iso_cpp_string_wchar_protos): New.
* g++.dg/ext/builtin10.C: New test.
+ PR inline-asm/39058
+ * gcc.target/i386/pr39058.c: New test.
+
2009-02-02 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38937
diff --git a/gcc/testsuite/gcc.target/i386/pr39058.c b/gcc/testsuite/gcc.target/i386/pr39058.c
new file mode 100644
index 00000000000..2982e8d14c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr39058.c
@@ -0,0 +1,34 @@
+/* PR inline-asm/39058 */
+/* { dg-options "-O2" } */
+
+double
+f1 ()
+{
+ double x;
+ asm ("" : "=r,r" (x) : "0,0" (x));
+ return x;
+}
+
+double
+f2 ()
+{
+ double x;
+ asm ("" : "=r" (x) : "0" (x));
+ return x;
+}
+
+double
+f3 ()
+{
+ double x, y;
+ asm ("" : "=r,r" (x), "=r,r" (y) : "%0,0" (x), "r,r" (0));
+ return x;
+}
+
+double
+f4 ()
+{
+ double x, y;
+ asm ("" : "=r" (x), "=r" (y) : "0" (x), "r" (0));
+ return x;
+}