diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-07-25 19:35:45 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-07-25 19:35:45 +0000 |
commit | 9107c8e9a934c6432c9031d707d52e49c95b11cb (patch) | |
tree | 483876d241641fe9be1ddf97d868af5b4e6677b5 | |
parent | 344c2bf4c32da5cf98b4a3e955f61391938f49fc (diff) | |
download | gcc-9107c8e9a934c6432c9031d707d52e49c95b11cb.tar.gz |
* config/i386/i386.md (andsi_1+1): Allow HImode.
(andsi_1+2): Require q_regs_operand.
* gcc.dg/20000720-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35249 138bc75d-0d04-0410-961f-82ee72b054a4
-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 c6d6a404851..6da8a26e538 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 538ebe7444f..a47c6dcc6ce 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 3c26037a5e2..eccf57a617a 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 00000000000..92b52fb1d3b --- /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; +} |