msp430.md (movsi_s): New.
authorDJ Delorie <dj@redhat.com>
Fri, 5 Jun 2015 05:00:05 +0000 (01:00 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Fri, 5 Jun 2015 05:00:05 +0000 (01:00 -0400)
* config/msp430/msp430.md (movsi_s): New.  Special case for
storing a 20-bit symbol into a 32-bit register.
* config/msp430/msp430.c (msp430_subreg): Add support for it.
* config/msp430/predicates.md (msp430_symbol_operand): New.

From-SVN: r224145

gcc/ChangeLog
gcc/config/msp430/msp430.c
gcc/config/msp430/msp430.md
gcc/config/msp430/predicates.md

index 2ad6068e15fc1b3845b8439b8c5fdcfcdcc13381..a052bd3cf9c21efb2bb5dcafba94b8fe56ac1505 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-04  DJ Delorie  <dj@redhat.com>
+
+       * config/msp430/msp430.md (movsi_s): New.  Special case for
+       storing a 20-bit symbol into a 32-bit register.
+       * config/msp430/msp430.c (msp430_subreg): Add support for it.
+       * config/msp430/predicates.md (msp430_symbol_operand): New.
+
 2015-06-04  Sriraman Tallam  <tmsriram@google.com>
 
        * c-family/c-common.c (noplt): New attribute.
index f99cb60a65b4b546a49950199ce987aeaaf4d798..1c18047807d2e1ed2c36d986bb3b37f183bfe81e 100644 (file)
@@ -2374,6 +2374,13 @@ msp430_subreg (machine_mode mode, rtx r, machine_mode omode, int byte)
     }
   else if (GET_CODE (r) == MEM)
     rv = adjust_address (r, mode, byte);
+  else if (GET_CODE (r) == SYMBOL_REF
+          && (byte == 0 || byte == 2)
+          && mode == HImode)
+    {
+      rv = gen_rtx_ZERO_EXTRACT (HImode, r, GEN_INT (16), GEN_INT (8*byte));
+      rv = gen_rtx_CONST (HImode, r);
+    }
   else
     rv = simplify_gen_subreg (mode, r, omode, byte);
 
index 64fdc459b784ab839dea5d24853a6859cc761244..ad8fb7af31960646867b8cbf3d11aa7281af7883 100644 (file)
   ""
   )
 
+(define_insn_and_split "movsi_s"
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
+       (subreg:SI (match_operand:PSI 1 "msp430_symbol_operand" "i") 0))]
+  ""
+  ""
+  "reload_completed"
+  [(set (match_operand:HI 2 "nonimmediate_operand")
+       (match_operand:HI 4 "general_operand"))
+   (set (match_operand:HI 3 "nonimmediate_operand")
+       (match_operand:HI 5 "general_operand"))]
+  "msp430_split_movsi (operands);"
+  )
+
 (define_insn_and_split "movsi_x"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=rm")
        (match_operand:SI 1 "general_operand" "rmi"))]
index 1331ff6b115bdc0b8974a1494ecd28f531c7536d..5902339be97037bea4ea50e78cb43de01910f3bd 100644 (file)
@@ -82,3 +82,7 @@
   (and (match_code "const_int")
        (match_test ("   INTVAL (op) >= 0
                     && INTVAL (op) <= 15 "))))
+
+(define_predicate "msp430_symbol_operand"
+  (match_code "symbol_ref")
+)