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
This commit is contained in:
Jesper Nilsson 2007-09-06 00:16:43 +00:00 committed by Hans-Peter Nilsson
parent cfb6473a78
commit 9ef4a0cd83
4 changed files with 38 additions and 1 deletions

View File

@ -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*.

View File

@ -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

View File

@ -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.

View File

@ -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