From 642d97ff00aaa2d86d9377bf6217bd8de243d8e5 Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Wed, 20 May 2009 21:47:57 +0000 Subject: [PATCH] * config/mips/mips.md (*extenddi_truncate, *extendsi_truncate): 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 --- gcc/ChangeLog | 7 +++ gcc/config/mips/mips.md | 47 ++++++++++++++++--- gcc/testsuite/ChangeLog | 8 ++++ gcc/testsuite/gcc.target/mips/extend-1.c | 14 ++++++ gcc/testsuite/gcc.target/mips/octeon-exts-2.c | 5 +- gcc/testsuite/gcc.target/mips/octeon-exts-5.c | 5 +- gcc/testsuite/gcc.target/mips/octeon-exts-6.c | 14 ++++++ 7 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/extend-1.c create mode 100644 gcc/testsuite/gcc.target/mips/octeon-exts-6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8770426088c..fcc619c4c88 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-05-20 Adam Nemet + + * config/mips/mips.md (*extenddi_truncate, + *extendsi_truncate): Emit exts if supported. Add attribute + defintions. + (*extendhi_truncateqi): New define_insn_and_sptit. + 2009-05-20 Jakub Jelinek PR middle-end/40204 diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 06c78da1b51..81ed584e4fc 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 (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)); -}) +} + [(set_attr "type" "arith") + (set_attr "mode" "DI")]) (define_insn_and_split "*extendsi_truncate" [(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 (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)); -}) +} + [(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 465ae000009..6c693b8f36a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-05-20 Adam Nemet + + * 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 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 00000000000..952d4a0932c --- /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 fc5df639d02..42f2a3f8586 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 e7a4738b96f..6ec7ac7296f 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 00000000000..d04e27331d9 --- /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); -- 2.30.2