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:
parent
cfb6473a78
commit
9ef4a0cd83
@ -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>
|
2007-09-06 Jie Zhang <jie.zhang@analog.com>
|
||||||
|
|
||||||
* config.gcc (tm_file): Add linux.h for bfin*-uclinux*.
|
* config.gcc (tm_file): Add linux.h for bfin*-uclinux*.
|
||||||
|
@ -1410,6 +1410,7 @@ enum cris_pic_symbol_type
|
|||||||
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
|
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
|
||||||
|
|
||||||
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 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
|
#define Pmode SImode
|
||||||
|
|
||||||
|
@ -69,7 +69,8 @@
|
|||||||
(CRIS_UNSPEC_GOT 2)
|
(CRIS_UNSPEC_GOT 2)
|
||||||
(CRIS_UNSPEC_GOTREL 3)
|
(CRIS_UNSPEC_GOTREL 3)
|
||||||
(CRIS_UNSPEC_GOTREAD 4)
|
(CRIS_UNSPEC_GOTREAD 4)
|
||||||
(CRIS_UNSPEC_PLTGOTREAD 5)])
|
(CRIS_UNSPEC_PLTGOTREAD 5)
|
||||||
|
(CRIS_UNSPEC_SWAP_BITS 6)])
|
||||||
|
|
||||||
;; Register numbers.
|
;; Register numbers.
|
||||||
(define_constants
|
(define_constants
|
||||||
@ -2678,6 +2679,31 @@
|
|||||||
"swapwb %0"
|
"swapwb %0"
|
||||||
[(set_attr "slottable" "yes")])
|
[(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
|
;; 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
|
;; operation supported by gcc. Used in casesi, but used now and then in
|
||||||
;; normal code too.
|
;; normal code too.
|
||||||
|
@ -228,6 +228,9 @@ UDItype __umulsidi3 (USItype, USItype);
|
|||||||
|
|
||||||
#if defined (__CRIS__) && __CRIS_arch_version >= 3
|
#if defined (__CRIS__) && __CRIS_arch_version >= 3
|
||||||
#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
|
#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__ */
|
#endif /* __CRIS__ */
|
||||||
|
|
||||||
#if defined (__hppa) && W_TYPE_SIZE == 32
|
#if defined (__hppa) && W_TYPE_SIZE == 32
|
||||||
|
Loading…
Reference in New Issue
Block a user