From 0c6da4e47f8a3c12675f3ba694b0cb6e25275d03 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 24 Oct 2002 19:11:56 +0200 Subject: [PATCH] re PR target/6981 (wrong code in 64-bit manipulation on x86) * config/i386/i386.md (subdi3_1): Add call to ix86_binary_operator_ok. PR target/6981 * config/i386/i386.md (adddi3_1): Add call to ix86_binary_operator_ok. * gcc.c-torture/execute/20021024-1.c: New test. From-SVN: r58497 --- gcc/ChangeLog | 9 ++++ gcc/config/i386/i386.md | 4 +- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/execute/20021024-1.c | 43 +++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20021024-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c30bd15baec1..a9f03f10d7b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2002-10-22 Jim Wilson + + * config/i386/i386.md (subdi3_1): Add call to ix86_binary_operator_ok. + +2002-10-15 Jim Wilson + + PR target/6981 + * config/i386/i386.md (adddi3_1): Add call to ix86_binary_operator_ok. + 2002-10-24 Richard Henderson PR opt/7944 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 4275675ce159..36a0497818eb 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -5311,7 +5311,7 @@ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0") (match_operand:DI 2 "general_operand" "roiF,riF"))) (clobber (reg:CC 17))] - "!TARGET_64BIT" + "!TARGET_64BIT && ix86_binary_operator_ok (PLUS, DImode, operands)" "#") (define_split @@ -6940,7 +6940,7 @@ (minus:DI (match_operand:DI 1 "nonimmediate_operand" "0,0") (match_operand:DI 2 "general_operand" "roiF,riF"))) (clobber (reg:CC 17))] - "!TARGET_64BIT" + "!TARGET_64BIT && ix86_binary_operator_ok (MINUS, DImode, operands)" "#") (define_split diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7d4131bbc02f..ccd13075c7ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-10-24 Jakub Jelinek + + * gcc.c-torture/execute/20021024-1.c: New test. + 2002-10-23 Mark Mitchell PR c++/8067 diff --git a/gcc/testsuite/gcc.c-torture/execute/20021024-1.c b/gcc/testsuite/gcc.c-torture/execute/20021024-1.c new file mode 100644 index 000000000000..f7d98e929a26 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20021024-1.c @@ -0,0 +1,43 @@ +/* Origin: PR target/6981 from Mattias Engdegaard . */ + +void exit (int); +void abort (void); + +unsigned long long *cp, m; + +void foo (void) +{ +} + +void bar (unsigned rop, unsigned long long *r) +{ + unsigned rs1, rs2, rd; + +top: + rs2 = (rop >> 23) & 0x1ff; + rs1 = (rop >> 9) & 0x1ff; + rd = rop & 0x1ff; + + *cp = 1; + m = r[rs1] + r[rs2]; + *cp = 2; + foo(); + if (!rd) + goto top; + r[rd] = 1; +} + +int main(void) +{ + static unsigned long long r[64]; + unsigned long long cr; + cp = &cr; + + r[4] = 47; + r[8] = 11; + bar((8 << 23) | (4 << 9) | 15, r); + + if (m != 47 + 11) + abort (); + exit (0); +} -- 2.47.2