diff options
author | Jesper Nilsson <jesper.nilsson@axis.com> | 2007-09-06 00:16:43 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2007-09-06 00:16:43 +0000 |
commit | 9ef4a0cd837d2820667243dd921bbda903330afe (patch) | |
tree | b471f48ac8fe10b8d1c9562b6086669ae666de75 /gcc | |
parent | cfb6473a78fa39128121aa2b178c88911754ab2d (diff) | |
download | gcc-9ef4a0cd837d2820667243dd921bbda903330afe.zip gcc-9ef4a0cd837d2820667243dd921bbda903330afe.tar.gz gcc-9ef4a0cd837d2820667243dd921bbda903330afe.tar.bz2 |
cris: longlong.h (count_trailing_zeros): Defined.
* longlong.h [__CRIS_arch_version >= 8] (count_trailing_zeros):
Defined.
* config/cris/cris.md (ctzsi2, cris_swap_bits): Implemented.
* config/cris/cris.h (CTZ_DEFINED_VALUE_AT_ZERO): Defined.
From-SVN: r128165
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/cris/cris.h | 1 | ||||
-rw-r--r-- | gcc/config/cris/cris.md | 28 | ||||
-rw-r--r-- | gcc/longlong.h | 3 |
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5d15a62..cd17c1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-09-06 Jesper Nilsson <jesper.nilsson@axis.com> + + * longlong.h [__CRIS_arch_version >= 8] (count_trailing_zeros): + Defined. + * config/cris/cris.md (ctzsi2, cris_swap_bits): Implemented. + * config/cris/cris.h (CTZ_DEFINED_VALUE_AT_ZERO): Defined. + 2007-09-06 Jie Zhang <jie.zhang@analog.com> * config.gcc (tm_file): Add linux.h for bfin*-uclinux*. diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index 7a2f714..3dd0dbd 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -1410,6 +1410,7 @@ enum cris_pic_symbol_type #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1) +#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1) #define Pmode SImode diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md index 765bd86..e248d43 100644 --- a/gcc/config/cris/cris.md +++ b/gcc/config/cris/cris.md @@ -69,7 +69,8 @@ (CRIS_UNSPEC_GOT 2) (CRIS_UNSPEC_GOTREL 3) (CRIS_UNSPEC_GOTREAD 4) - (CRIS_UNSPEC_PLTGOTREAD 5)]) + (CRIS_UNSPEC_PLTGOTREAD 5) + (CRIS_UNSPEC_SWAP_BITS 6)]) ;; Register numbers. (define_constants @@ -2678,6 +2679,31 @@ "swapwb %0" [(set_attr "slottable" "yes")]) +;; This instruction swaps all bits in a register. +;; That means that the most significant bit is put in the place +;; of the least significant bit, and so on. + +(define_insn "cris_swap_bits" + [(set (match_operand:SI 0 "register_operand" "=r") + (unspec:SI [(match_operand:SI 1 "register_operand" "0")] + CRIS_UNSPEC_SWAP_BITS))] + "TARGET_HAS_SWAP" + "swapwbr %0" + [(set_attr "slottable" "yes")]) + +;; Implement ctz using two instructions, one for bit swap and one for clz. +;; Defines a scratch register to avoid clobbering input. + +(define_expand "ctzsi2" + [(set (match_dup 2) + (match_operand:SI 1 "register_operand")) + (set (match_dup 2) + (unspec:SI [(match_dup 2)] CRIS_UNSPEC_SWAP_BITS)) + (set (match_operand:SI 0 "register_operand") + (clz:SI (match_dup 2)))] + "TARGET_HAS_LZ && TARGET_HAS_SWAP" + "operands[2] = gen_reg_rtx (SImode);") + ;; Bound-insn. Defined to be the same as an unsigned minimum, which is an ;; operation supported by gcc. Used in casesi, but used now and then in ;; normal code too. diff --git a/gcc/longlong.h b/gcc/longlong.h index edb9bfd..8350fbc 100644 --- a/gcc/longlong.h +++ b/gcc/longlong.h @@ -228,6 +228,9 @@ UDItype __umulsidi3 (USItype, USItype); #if defined (__CRIS__) && __CRIS_arch_version >= 3 #define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#if __CRIS_arch_version >= 8 +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#endif #endif /* __CRIS__ */ #if defined (__hppa) && W_TYPE_SIZE == 32 |