diff options
author | Nick Clifton <nickc@redhat.com> | 2013-09-18 00:58:18 +0000 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2013-09-17 20:58:18 -0400 |
commit | b5ba3a9b55ea2462b54b5fcd14476182e3f93fe4 (patch) | |
tree | 56a80c4802b10b30c474c84b0547a2b60625a553 /gcc | |
parent | 05eac2ce9119a6671db1f71a8560f8e28f1a5224 (diff) | |
download | gcc-b5ba3a9b55ea2462b54b5fcd14476182e3f93fe4.zip gcc-b5ba3a9b55ea2462b54b5fcd14476182e3f93fe4.tar.gz gcc-b5ba3a9b55ea2462b54b5fcd14476182e3f93fe4.tar.bz2 |
rl78-real.md (bf): New pattern.
* config/rl78/rl78-real.md (bf): New pattern.
(bt): New pattern.
* config/rl78/rl78.c (rl78_print_operand_1): Handle %B.
(rl78_print_operand): Do not put a # before a %B.
* config/rl78/rl78.opt: Tweak doc strings.
From-SVN: r202676
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rl78/rl78-real.md | 55 | ||||
-rw-r--r-- | gcc/config/rl78/rl78.c | 5 | ||||
-rw-r--r-- | gcc/config/rl78/rl78.opt | 10 |
4 files changed, 72 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a50e23..d2c79a1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-09-17 Nick Clifton <nickc@redhat.com> + + * config/rl78/rl78-real.md (bf): New pattern. + (bt): New pattern. + * config/rl78/rl78.c (rl78_print_operand_1): Handle %B. + (rl78_print_operand): Do not put a # before a %B. + * config/rl78/rl78.opt: Tweak doc strings. + 2013-09-17 DJ Delorie <dj@redhat.com> * config/rl78/constraints.md (Wcv): Allow up to $r31. diff --git a/gcc/config/rl78/rl78-real.md b/gcc/config/rl78/rl78-real.md index 409abcc..90b380a 100644 --- a/gcc/config/rl78/rl78-real.md +++ b/gcc/config/rl78/rl78-real.md @@ -459,3 +459,58 @@ [(set (match_dup 0) (reg:HI AX_REG))] ) +;; Bit test and branch insns. + +;; NOTE: These patterns will work for bits in other places, not just A. + +(define_insn "bf" + [(set (pc) + (if_then_else (eq (and (reg:QI A_REG) + (match_operand 0 "immediate_operand" "n")) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc)))] + "" + "bf\tA.%B0, $%1" +) + +(define_insn "bt" + [(set (pc) + (if_then_else (ne (and (reg:QI A_REG) + (match_operand 0 "immediate_operand" "n")) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc)))] + "" + "bt\tA.%B0, $%1" +) + +;; NOTE: These peepholes are fragile. They rely upon GCC generating +;; a specific sequence on insns, based upon examination of test code. +;; Improvements to GCC or using code other than the test code can result +;; in the peephole not matching and the optimization being missed. + +(define_peephole2 + [(set (match_operand:QI 1 "register_operand") (reg:QI A_REG)) + (set (match_dup 1) (and:QI (match_dup 1) (match_operand 2 "immediate_operand"))) + (set (pc) (if_then_else (eq (match_dup 1) (const_int 0)) + (label_ref (match_operand 3 "")) + (pc)))] + "peep2_regno_dead_p (3, REGNO (operands[1])) + && exact_log2 (INTVAL (operands[2])) >= 0" + [(set (pc) (if_then_else (eq (and (reg:QI A_REG) (match_dup 2)) (const_int 0)) + (label_ref (match_dup 3)) (pc)))] + ) + +(define_peephole2 + [(set (match_operand:QI 1 "register_operand") (reg:QI A_REG)) + (set (match_dup 1) (and:QI (match_dup 1) (match_operand 2 "immediate_operand"))) + (set (pc) (if_then_else (ne (match_dup 1) (const_int 0)) + (label_ref (match_operand 3 "")) + (pc)))] + "peep2_regno_dead_p (3, REGNO (operands[1])) + && exact_log2 (INTVAL (operands[2])) >= 0" + [(set (pc) (if_then_else (ne (and (reg:QI A_REG) (match_dup 2)) (const_int 0)) + (label_ref (match_dup 3)) (pc)))] + ) + diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c index 41fec46..5902e1e 100644 --- a/gcc/config/rl78/rl78.c +++ b/gcc/config/rl78/rl78.c @@ -1286,6 +1286,7 @@ rl78_function_arg_boundary (enum machine_mode mode ATTRIBUTE_UNUSED, s - shift count mod 8 S - shift count mod 16 r - reverse shift count (8-(count mod 8)) + B - bit position h - bottom HI of an SI H - top HI of an SI @@ -1412,6 +1413,8 @@ rl78_print_operand_1 (FILE * file, rtx op, int letter) fprintf (file, "%ld", INTVAL (op) & 0xffff); else if (letter == 'e') fprintf (file, "%ld", (INTVAL (op) >> 16) & 0xff); + else if (letter == 'B') + fprintf (file, "%d", exact_log2 (INTVAL (op))); else if (letter == 'E') fprintf (file, "%ld", (INTVAL (op) >> 24) & 0xff); else if (letter == 'm') @@ -1605,7 +1608,7 @@ rl78_print_operand_1 (FILE * file, rtx op, int letter) static void rl78_print_operand (FILE * file, rtx op, int letter) { - if (CONSTANT_P (op) && letter != 'u' && letter != 's' && letter != 'r' && letter != 'S') + if (CONSTANT_P (op) && letter != 'u' && letter != 's' && letter != 'r' && letter != 'S' && letter != 'B') fprintf (file, "#"); rl78_print_operand_1 (file, op, letter); } diff --git a/gcc/config/rl78/rl78.opt b/gcc/config/rl78/rl78.opt index 5fc8816..ebcf903 100644 --- a/gcc/config/rl78/rl78.opt +++ b/gcc/config/rl78/rl78.opt @@ -23,7 +23,7 @@ HeaderInclude config/rl78/rl78-opts.h msim -Target +Target Report Use the simulator runtime. mmul= @@ -43,13 +43,13 @@ EnumValue Enum(rl78_mul_types) String(g13) Value(MUL_G13) mallregs -Target Mask(ALLREGS) +Target Mask(ALLREGS) Report Optimization Use all registers, reserving none for interrupt handlers. mrelax -Target -Enable assembler and linker relaxation. +Target Report Optimization +Enable assembler and linker relaxation. Enabled by default at -Os. mg10 -Target Mask(G10) +Target Mask(G10) Report Target the RL78/G10 series |