http://gcc.gnu.org/ml/gcc-patches/2014-04/msg01108.html


-------- Original Message --------
Subject: [RFC][PATCH] RL78 - Add predicates to reduce code bloat when accessing volatile memory.
Date: Fri, 18 Apr 2014 21:15:01 +0200
From: Richard Hulme <pepe...@yahoo.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>

Hi,

This patch adds predicates (taken and renamed from the MSP430 backend)
to allow more efficient code generation when accessing volatile memory
turning this (for example):

movw    r10, #240
movw    ax, r10
movw    hl, ax
mov     a, [hl]
or      a, #32
mov     [hl], a

into this:

mov     a, !240
or      a, #32
mov     !240, a

Regards,

Richard.

2014-04-18  Richard Hulme  <pepe...@yahoo.com>

    * config/rl78/predicates.md (rl78_volatile_memory_operand): New
      (rl78_general_operand): New
      (rl78_nonimmediate_operand): New
      (rl78_any_operand): Now includes volatile memory
      (rl78_nonfar_operand): Likewise
      (rl78_nonfar_nonimm_operand): Likewise

---
 gcc/config/rl78/predicates.md |   26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/gcc/config/rl78/predicates.md b/gcc/config/rl78/predicates.md
index e564f43..29e3922 100644
--- a/gcc/config/rl78/predicates.md
+++ b/gcc/config/rl78/predicates.md
@@ -18,18 +18,38 @@
 ;; along with GCC; see the file COPYING3.  If not see
 ;; <http://www.gnu.org/licenses/>.
 
-(define_predicate "rl78_any_operand"
+(define_predicate "rl78_volatile_memory_operand"
+  (and (match_code "mem")
+       (match_test ("memory_address_addr_space_p (GET_MODE (op), XEXP
(op, 0), MEM_ADDR_SPACE (op))")))
+)
+
+; TRUE for any valid general operand.  We do this because
+; general_operand refuses to match volatile memory refs.
+
+(define_predicate "rl78_general_operand"
   (ior (match_operand 0 "general_operand")
+       (match_operand 0 "rl78_volatile_memory_operand"))
+)
+
+; Likewise for nonimmediate_operand.
+
+(define_predicate "rl78_nonimmediate_operand"
+  (ior (match_operand 0 "nonimmediate_operand")
+       (match_operand 0 "rl78_volatile_memory_operand"))
+)
+
+(define_predicate "rl78_any_operand"
+  (ior (match_operand 0 "rl78_general_operand")
        (match_code "mem,const_int,const_double,reg"))
 )

 (define_predicate "rl78_nonfar_operand"
-  (and (match_operand 0 "general_operand")
+  (and (match_operand 0 "rl78_general_operand")
        (not (match_test "rl78_far_p (op)")))
 )

 (define_predicate "rl78_nonfar_nonimm_operand"
-  (and (match_operand 0 "nonimmediate_operand")
+  (and (match_operand 0 "rl78_nonimmediate_operand")
        (not (match_test "rl78_far_p (op)")))
 )

--
1.7.9.5



Reply via email to