From 8dc239d39d0cb6d1d615ba4302c60a2516b980de Mon Sep 17 00:00:00 2001 From: law Date: Thu, 22 Jan 2015 21:24:28 +0000 Subject: [PATCH] PR target/52076 * config/m68k/m68k.md (xorsi3_internal): Twiddle constraints to improve code density for small immediate to memory case. (insv): Better handle bitfield assignments when the field is being set to all ones. * config/m68k/predicates.md (reg_or_pow2_m1_operand): New operand predicate. PR target/52076 * gcc.target/m68k/pr52076-1.c: New test. * gcc.target/m68k/pr52076-2.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220015 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/m68k/.m68k.md.swp | Bin 0 -> 16384 bytes gcc/config/m68k/m68k.md | 21 ++++++++++++++++----- gcc/config/m68k/predicates.md | 13 +++++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.target/m68k/pr52076-1.c | 20 ++++++++++++++++++++ gcc/testsuite/gcc.target/m68k/pr52076-2.c | 27 +++++++++++++++++++++++++++ 7 files changed, 92 insertions(+), 5 deletions(-) create mode 100755 gcc/config/m68k/.m68k.md.swp create mode 100644 gcc/testsuite/gcc.target/m68k/pr52076-1.c create mode 100644 gcc/testsuite/gcc.target/m68k/pr52076-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1669330aab..ae5e9a5c332 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-01-22 Jeff Law + + PR target/52076 + * config/m68k/m68k.md (xorsi3_internal): Twiddle constraints to + improve code density for small immediate to memory case. + (insv): Better handle bitfield assignments when the field is + being set to all ones. + * config/m68k/predicates.md (reg_or_pow2_m1_operand): New + operand predicate. + 2015-01-22 Rainer Orth Jakub Jelinek diff --git a/gcc/config/m68k/.m68k.md.swp b/gcc/config/m68k/.m68k.md.swp new file mode 100755 index 0000000000000000000000000000000000000000..36d768170c054a1662c5a1a953ec77e948e157bc GIT binary patch literal 16384 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 WjZ|jVvw({yK=?e+d^;@m7yb#=ZV_|< literal 0 HcwPel00001 diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md index d34ad1dce88..6bb296e9e0d 100644 --- a/gcc/config/m68k/m68k.md +++ b/gcc/config/m68k/m68k.md @@ -3838,9 +3838,9 @@ "") (define_insn "xorsi3_internal" - [(set (match_operand:SI 0 "nonimmediate_operand" "=do,m") - (xor:SI (match_operand:SI 1 "general_operand" "%0,0") - (match_operand:SI 2 "general_operand" "di,dKT")))] + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,o,m") + (xor:SI (match_operand:SI 1 "general_operand" "%0, 0,0") + (match_operand:SI 2 "general_operand" "di,dK,dKT")))] "!TARGET_COLDFIRE" { @@ -5583,9 +5583,20 @@ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "") (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")) - (match_operand:SI 3 "register_operand" ""))] + (match_operand:SI 3 "reg_or_pow2_m1_operand" ""))] "TARGET_68020 && TARGET_BITFIELD" - "") + " +{ + /* Special case initializing a field to all ones. */ + if (GET_CODE (operands[3]) == CONST_INT) + { + if (exact_log2 (INTVAL (operands[3]) + 1) != INTVAL (operands[1])) + operands[3] = force_reg (SImode, operands[3]); + else + operands[3] = constm1_rtx; + + } +}") (define_insn "*insv_bfins_mem" [(set (zero_extract:SI (match_operand:QI 0 "memory_operand" "+o") diff --git a/gcc/config/m68k/predicates.md b/gcc/config/m68k/predicates.md index a7b5c42e2fd..c652f109128 100644 --- a/gcc/config/m68k/predicates.md +++ b/gcc/config/m68k/predicates.md @@ -244,3 +244,16 @@ || reload_in_progress || reload_completed)); }) + +;; Used to detect when an operand is either a register +;; or a constant that is all ones in its lower bits. +;; Used by insv pattern to help detect when we're initializing +;; a bitfield to all ones. + +(define_predicate "reg_or_pow2_m1_operand" + (match_code "reg,const_int") +{ + return (REG_P (op) + || (GET_CODE (op) == CONST_INT + && exact_log2 (INTVAL (op) + 1) >= 0)); +}) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8bebdac3cf8..1fc0241b994 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-01-22 Jeff Law + + PR target/52076 + * gcc.target/m68k/pr52076-1.c: New test. + * gcc.target/m68k/pr52076-2.c: New test. + 2015-01-22 Richard Biener PR middle-end/64728 diff --git a/gcc/testsuite/gcc.target/m68k/pr52076-1.c b/gcc/testsuite/gcc.target/m68k/pr52076-1.c new file mode 100644 index 00000000000..86df0dcae43 --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr52076-1.c @@ -0,0 +1,20 @@ +/* { dg-do assemble } /* +/* { dg-options "-Os -fomit-frame-pointer -m68040" } */ +/* { dg-final { object-size text <= 72 } } */ + +struct kobject { + unsigned int b7:1; + unsigned int :6; + unsigned int b0:1; + unsigned char x; + unsigned int f; +}; + +void ior(struct kobject *kobj) { kobj->f |= 4; } +void ior_m(struct kobject *kobj) { kobj->f |= -4; } + +void xor(struct kobject *kobj) { kobj->f ^= 4; } +void xor_m(struct kobject *kobj) { kobj->f ^= -4; } + +void and(struct kobject *kobj) { kobj->f &= 4; } +void and_m(struct kobject *kobj) { kobj->f &= -4; } diff --git a/gcc/testsuite/gcc.target/m68k/pr52076-2.c b/gcc/testsuite/gcc.target/m68k/pr52076-2.c new file mode 100644 index 00000000000..30c6991839c --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr52076-2.c @@ -0,0 +1,27 @@ +/* { dg-do assemble } /* +/* { dg-options "-Os -fomit-frame-pointer -m68040" } */ +/* { dg-final { object-size text <= 30 } } */ + +struct kobject { + unsigned int b7:1; + unsigned int b56:2; + unsigned int b1234:4; + unsigned int b0:1; + unsigned char x; + unsigned int f; +}; + +void b7(struct kobject *kobj) +{ + kobj->b7 = 1; +} + +void b56(struct kobject *kobj) +{ + kobj->b56 = 3; +} + +void b1234(struct kobject *kobj) +{ + kobj->b1234 = 15; +} -- 2.11.4.GIT