diff options
author | Jakub Jelinek <jakub@redhat.com> | 2000-07-25 21:35:45 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2000-07-25 21:35:45 +0200 |
commit | 5e1a2fc70a27a62081cfd9a14aef12c806866cee (patch) | |
tree | 483876d241641fe9be1ddf97d868af5b4e6677b5 | |
parent | 9e81685aef368a10401bccb0a0adbed480be9eb1 (diff) | |
download | gcc-5e1a2fc70a27a62081cfd9a14aef12c806866cee.zip gcc-5e1a2fc70a27a62081cfd9a14aef12c806866cee.tar.gz gcc-5e1a2fc70a27a62081cfd9a14aef12c806866cee.tar.bz2 |
i386.md (andsi_1+1): Allow HImode.
* config/i386/i386.md (andsi_1+1): Allow HImode.
(andsi_1+2): Require q_regs_operand.
* gcc.dg/20000720-1.c: New test.
From-SVN: r35249
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20000720-1.c | 39 |
4 files changed, 51 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c6d6a40..6da8a26 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2000-07-25 Jakub Jelinek <jakub@redhat.com> + * config/i386/i386.md (andsi_1+1): Allow HImode. + (andsi_1+2): Require q_regs_operand. + +2000-07-25 Jakub Jelinek <jakub@redhat.com> + * config/i386/i386.md (call_pop): Check operands[0], not operands[1]. Only check SYMBOL_REF_FLAG for a SYMBOL_REF. (call): Likewise. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 538ebe7..a47c6dc 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -5000,8 +5000,8 @@ "operands[1] = gen_lowpart (HImode, operands[0]);") (define_split - [(set (match_operand:SI 0 "q_regs_operand" "") - (and:SI (match_dup 0) + [(set (match_operand 0 "q_regs_operand" "") + (and (match_dup 0) (const_int -256))) (clobber (reg:CC 17))] "(optimize_size || !TARGET_PARTIAL_REG_STALL) @@ -5010,7 +5010,7 @@ "operands[1] = gen_lowpart (QImode, operands[0]);") (define_split - [(set (match_operand 0 "register_operand" "") + [(set (match_operand 0 "q_regs_operand" "") (and (match_dup 0) (const_int -65281))) (clobber (reg:CC 17))] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c26037..eccf57a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-07-25 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/20000720-1.c: New test. + 2000-07-25 Toon Moene <toon@moene.indiv.nluug.nl> * g77.f-torture/compile/20000630-2.x: Removed. Case fixed. diff --git a/gcc/testsuite/gcc.dg/20000720-1.c b/gcc/testsuite/gcc.dg/20000720-1.c new file mode 100644 index 0000000..92b52fb --- /dev/null +++ b/gcc/testsuite/gcc.dg/20000720-1.c @@ -0,0 +1,39 @@ +/* { dg-do compile { target i?86-*-* } } */ +/* { dg-options "-mpreferred-stack-boundary=2 -march=i586 -O2 -fomit-frame-pointer" } */ + +extern void *foo(void *a, const void *b, unsigned c); + +extern inline void * +bar(void *a, const void *b, unsigned c) +{ + int d0, d1, d2; + __asm__ __volatile__( + "" : + "=&c" (d0), "=&D" (d1), "=&S" (d2) : + "0" (c/4), "q" (c), "1" (a), "2" (b) : + "memory"); + return a; +} + +typedef struct { + unsigned char a; + unsigned b : 2; + unsigned c : 4; + unsigned d : 2; +} *baz; + +static int +dead(unsigned short *v, char *w, unsigned char *x, int y, int z) +{ + int i = 0; + unsigned short j = *v; + + while (y > 0) { + ((baz)x)->a = j; + ((baz)x)->b = 0; + ((baz)x)->c = 0; + ((baz)x)->d = 0; + __builtin_constant_p(i) ? foo(x, w, i) : bar(x, w, i); + } + return z - y; +} |