diff options
author | Adam Nemet <anemet@caviumnetworks.com> | 2009-05-20 21:47:57 +0000 |
---|---|---|
committer | Adam Nemet <nemet@gcc.gnu.org> | 2009-05-20 21:47:57 +0000 |
commit | 642d97ff00aaa2d86d9377bf6217bd8de243d8e5 (patch) | |
tree | c79db831e242d0d4c4fe9824f85e4ad48c144663 /gcc | |
parent | 776248b87e53e18386405561ca260c665ca6bdb7 (diff) | |
download | gcc-642d97ff00aaa2d86d9377bf6217bd8de243d8e5.zip gcc-642d97ff00aaa2d86d9377bf6217bd8de243d8e5.tar.gz gcc-642d97ff00aaa2d86d9377bf6217bd8de243d8e5.tar.bz2 |
* config/mips/mips.md (*extenddi_truncate<mode>,
*extendsi_truncate<mode>): Emit exts if supported. Add attribute
defintions.
(*extendhi_truncateqi): New define_insn_and_sptit.
testsuite/
* gcc.target/mips/octeon-exts-6.c: New test.
* gcc.target/mips/extend-1.c: New test.
* gcc.target/mips/octeon-exts-2.c: Adjust to not match sign-extension
EXTS.
* gcc.target/mips/octeon-exts-5.c: Likewise.
From-SVN: r147751
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/mips/mips.md | 47 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/extend-1.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/octeon-exts-2.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/octeon-exts-5.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/octeon-exts-6.c | 14 |
7 files changed, 90 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8770426..fcc619c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-05-20 Adam Nemet <anemet@caviumnetworks.com> + + * config/mips/mips.md (*extenddi_truncate<mode>, + *extendsi_truncate<mode>): Emit exts if supported. Add attribute + defintions. + (*extendhi_truncateqi): New define_insn_and_sptit. + 2009-05-20 Jakub Jelinek <jakub@redhat.com> PR middle-end/40204 diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 06c78da..81ed584 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -3017,8 +3017,13 @@ (sign_extend:DI (truncate:SHORT (match_operand:DI 1 "register_operand" "d"))))] "TARGET_64BIT && !TARGET_MIPS16" - "#" - "&& reload_completed" +{ + if (!ISA_HAS_EXTS) + return "#"; + operands[2] = GEN_INT (GET_MODE_BITSIZE (<SHORT:MODE>mode)); + return "exts\t%0,%1,0,%m2"; +} + "&& reload_completed && !ISA_HAS_EXTS" [(set (match_dup 2) (ashift:DI (match_dup 1) (match_dup 3))) @@ -3028,15 +3033,22 @@ { operands[2] = gen_lowpart (DImode, operands[0]); operands[3] = GEN_INT (BITS_PER_WORD - GET_MODE_BITSIZE (<MODE>mode)); -}) +} + [(set_attr "type" "arith") + (set_attr "mode" "DI")]) (define_insn_and_split "*extendsi_truncate<mode>" [(set (match_operand:SI 0 "register_operand" "=d") (sign_extend:SI (truncate:SHORT (match_operand:DI 1 "register_operand" "d"))))] "TARGET_64BIT && !TARGET_MIPS16" - "#" - "&& reload_completed" +{ + if (!ISA_HAS_EXTS) + return "#"; + operands[2] = GEN_INT (GET_MODE_BITSIZE (<SHORT:MODE>mode)); + return "exts\t%0,%1,0,%m2"; +} + "&& reload_completed && !ISA_HAS_EXTS" [(set (match_dup 2) (ashift:DI (match_dup 1) (match_dup 3))) @@ -3046,7 +3058,30 @@ { operands[2] = gen_lowpart (DImode, operands[0]); operands[3] = GEN_INT (BITS_PER_WORD - GET_MODE_BITSIZE (<MODE>mode)); -}) +} + [(set_attr "type" "arith") + (set_attr "mode" "SI")]) + +(define_insn_and_split "*extendhi_truncateqi" + [(set (match_operand:HI 0 "register_operand" "=d") + (sign_extend:HI + (truncate:QI (match_operand:DI 1 "register_operand" "d"))))] + "TARGET_64BIT && !TARGET_MIPS16" +{ + return ISA_HAS_EXTS ? "exts\t%0,%1,0,7" : "#"; +} + "&& reload_completed && !ISA_HAS_EXTS" + [(set (match_dup 2) + (ashift:DI (match_dup 1) + (const_int 56))) + (set (match_dup 0) + (truncate:HI (ashiftrt:DI (match_dup 2) + (const_int 56))))] +{ + operands[2] = gen_lowpart (DImode, operands[0]); +} + [(set_attr "type" "arith") + (set_attr "mode" "SI")]) (define_insn "extendsfdf2" [(set (match_operand:DF 0 "register_operand" "=f") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 465ae00..6c693b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-05-20 Adam Nemet <anemet@caviumnetworks.com> + + * gcc.target/mips/octeon-exts-6.c: New test. + * gcc.target/mips/extend-1.c: New test. + * gcc.target/mips/octeon-exts-2.c: Adjust to not match sign-extension + EXTS. + * gcc.target/mips/octeon-exts-5.c: Likewise. + 2009-05-20 Jakub Jelinek <jakub@redhat.com> PR middle-end/40204 diff --git a/gcc/testsuite/gcc.target/mips/extend-1.c b/gcc/testsuite/gcc.target/mips/extend-1.c new file mode 100644 index 0000000..952d4a0 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/extend-1.c @@ -0,0 +1,14 @@ +/* { dg-options "-O -mgp64 isa=!octeon" } */ +/* { dg-final { scan-assembler-times "\tdsll\t" 5 } } */ +/* { dg-final { scan-assembler-times "\tdsra\t" 5 } } */ +/* { dg-final { scan-assembler-not "\tsll\t" } } */ + +#define TEST_CHAR(T, N) \ + NOMIPS16 T f##N (long long d, T *a, T *r) { T b = (char) d; *r = b + *a; } +#define TEST_SHORT(T, N) \ + NOMIPS16 T g##N (long long d, T *a, T *r) { T b = (short) d; *r = b + *a; } +#define TEST(T, N) TEST_CHAR (T, N) TEST_SHORT (T, N) + +TEST (int, 1); +TEST (long long, 2); +TEST_CHAR (short, 3); diff --git a/gcc/testsuite/gcc.target/mips/octeon-exts-2.c b/gcc/testsuite/gcc.target/mips/octeon-exts-2.c index fc5df63..42f2a3f 100644 --- a/gcc/testsuite/gcc.target/mips/octeon-exts-2.c +++ b/gcc/testsuite/gcc.target/mips/octeon-exts-2.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -march=octeon -meb" } */ -/* { dg-final { scan-assembler-times "\texts\t" 4 } } */ +/* { dg-options "-O -march=octeon -meb -dp" } */ +/* Don't match exts in sign-extension. */ +/* { dg-final { scan-assembler-times "\texts\t\[^\\n\]*extv" 4 } } */ struct bar { diff --git a/gcc/testsuite/gcc.target/mips/octeon-exts-5.c b/gcc/testsuite/gcc.target/mips/octeon-exts-5.c index e7a4738..6ec7ac7 100644 --- a/gcc/testsuite/gcc.target/mips/octeon-exts-5.c +++ b/gcc/testsuite/gcc.target/mips/octeon-exts-5.c @@ -1,7 +1,8 @@ /* -mel version of octeon-exts-2.c. */ /* { dg-do compile } */ -/* { dg-options "-O -march=octeon -mel" } */ -/* { dg-final { scan-assembler-times "\texts\t" 4 } } */ +/* { dg-options "-O -march=octeon -mel -dp" } */ +/* Don't match exts in sign-extension. */ +/* { dg-final { scan-assembler-times "\texts\t\[^\\n\]*extv" 4 } } */ struct bar { diff --git a/gcc/testsuite/gcc.target/mips/octeon-exts-6.c b/gcc/testsuite/gcc.target/mips/octeon-exts-6.c new file mode 100644 index 0000000..d04e273 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/octeon-exts-6.c @@ -0,0 +1,14 @@ +/* { dg-options "-O -march=octeon -mgp64" } */ +/* { dg-final { scan-assembler-times "\texts\t" 5 } } */ +/* { dg-final { scan-assembler-not "\t(dsll|dsra)\t" } } */ +/* { dg-final { scan-assembler-not "\tsll\t" } } */ + +#define TEST_CHAR(T, N) \ + NOMIPS16 T f##N (long long d, T *a, T *r) { T b = (char) d; *r = b + *a; } +#define TEST_SHORT(T, N) \ + NOMIPS16 T g##N (long long d, T *a, T *r) { T b = (short) d; *r = b + *a; } +#define TEST(T, N) TEST_CHAR (T, N) TEST_SHORT (T, N) + +TEST (int, 1); +TEST (long long, 2); +TEST_CHAR (short, 3); |