]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia.
authorJ"orn Rennecke <joern.rennecke@superh.com>
Thu, 25 Jul 2002 19:38:54 +0000 (19:38 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 25 Jul 2002 19:38:54 +0000 (20:38 +0100)
* sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia.
* sh.md (truncdiqi2, movqi_media): Likewise.

From-SVN: r55757

gcc/ChangeLog
gcc/config/sh/sh.h
gcc/config/sh/sh.md

index 3665609832dd3b42fb820c8c8e53e7e163675770..ec0b39676caff956b2f478fa9fb7d7361d374d5c 100644 (file)
@@ -1,3 +1,8 @@
+Thu Jul 25 20:34:50 2002  J"orn Rennecke <joern.rennecke@superh.com>
+
+       * sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia.
+       * sh.md (truncdiqi2, movqi_media): Likewise.
+
 2002-07-25  Neil Booth  <neil@daikokuya.co.uk>
 
        * gcse.c (obstack_chunk_alloc): Remove.
index fc1cfb4161084ce79bdc221679526363bb9feadb..3002c3ea77251cca1a9536e66e8eccd1e6beb354 100644 (file)
@@ -2623,9 +2623,12 @@ while (0)
    will either zero-extend or sign-extend.  The value of this macro should
    be the code that says which one of the two operations is implicitly
    done, NIL if none.  */
+/* For SHmedia, we can truncate to QImode easier using zero extension.  */
 /* FP registers can load SImode values, but don't implicitly sign-extend
    them to DImode.  */
-#define LOAD_EXTEND_OP(MODE) ((MODE) != SImode ? SIGN_EXTEND : NIL)
+#define LOAD_EXTEND_OP(MODE) \
+ (((MODE) == QImode  && TARGET_SHMEDIA) ? ZERO_EXTEND \
+  : (MODE) != SImode ? SIGN_EXTEND : NIL)
 
 /* Define if loading short immediate values into registers sign extends.  */
 #define SHORT_IMMEDIATES_SIGN_EXTEND
index 48ae813354c6aa07065021a718b1d3c9deb40315..aa64bf5cb813aff25461afc12a5f3e422a5f7987 100644 (file)
   [(set_attr "type"   "arith_media,store_media")
    (set_attr "length" "8,4")])
 
-; N.B. we want sign-extension here because
-; - we need to be consistent with LOAD_EXTEND_OP and movqi
-; - only sign extension allows us to do signed compares transparently.
-;  unsigned compares don't care about the kind of extension as long as
-;   it's consistent.
+; N.B. This should agree with LOAD_EXTEND_OP and movqi.
+; Because we use zero extension, we can't provide signed QImode compares
+; using a simple compare or conditional banch insn.
 (define_insn "truncdiqi2"
   [(set (match_operand:QI 0 "general_movdst_operand" "=r,m")
        (truncate:QI (match_operand:DI 1 "register_operand" "r,r")))]
   "TARGET_SHMEDIA"
   "@
-       ori     %1, -256, %0
+       and     %1, 255, %0
        st%M0.b %m0, %1"
   [(set_attr "type"   "arith_media,store")])
 
   "@
        add.l   %1, r63, %0
        movi    %1, %0
-       ld%M1.b %m1, %0
+       ld%M1.ub        %m1, %0
        st%M0.b %m0, %1"
   [(set_attr "type" "arith_media,arith_media,load_media,store_media")])