diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-02 13:23:43 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-02 13:23:43 +0000 |
commit | cde8f1c846d02f52e6ea68bd9fc4b799609d702a (patch) | |
tree | a1aa96b3278b1c873c7432d2ad53d27e983ec85a | |
parent | b6c6057e81e94c26f222aea1731034e39620e88e (diff) | |
download | gcc-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/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/recog.c | 41 | ||||
-rw-r--r-- | gcc/recog.h | 4 | ||||
-rw-r--r-- | gcc/stmt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr39058.c | 34 |
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; +} |