From 593246856334576980d2623c609223af19165117 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Thu, 25 Jul 2002 19:38:54 +0000 Subject: [PATCH] sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia. * sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia. * sh.md (truncdiqi2, movqi_media): Likewise. From-SVN: r55757 --- gcc/ChangeLog | 5 +++++ gcc/config/sh/sh.h | 5 ++++- gcc/config/sh/sh.md | 12 +++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3665609832dd..ec0b39676caf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Thu Jul 25 20:34:50 2002 J"orn Rennecke + + * sh.h (LOAD_EXTEND_OP): QImode zero-extends on SHmedia. + * sh.md (truncdiqi2, movqi_media): Likewise. + 2002-07-25 Neil Booth * gcse.c (obstack_chunk_alloc): Remove. diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index fc1cfb416108..3002c3ea7725 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -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 diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 48ae813354c6..aa64bf5cb813 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -3382,17 +3382,15 @@ [(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")]) @@ -3741,7 +3739,7 @@ "@ 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")])