Commit bebd619e by Nick Clifton Committed by Nick Clifton

mn10300.md (clzsi2): Use XOR after BSCH to convert bit position of highest bit…

mn10300.md (clzsi2): Use XOR after BSCH to convert bit position of highest bit set into a count of...

	* config/mn10300/mn10300.md (clzsi2): Use XOR after BSCH to
	convert bit position of highest bit set into a count of the high
	zero bits.

From-SVN: r175536
parent 353b39fa
2011-06-27 Nick Clifton <nickc@redhat.com>
* config/mn10300/mn10300.md (clzsi2): Use XOR after BSCH to
convert bit position of highest bit set into a count of the high
zero bits.
2011-06-27 Eric Botcazou <ebotcazou@adacore.com> 2011-06-27 Eric Botcazou <ebotcazou@adacore.com>
* dwarf2out.c (TYPE_DECL_IS_STUB): Extend mechanism to all types. * dwarf2out.c (TYPE_DECL_IS_STUB): Extend mechanism to all types.
......
...@@ -1811,10 +1811,24 @@ ...@@ -1811,10 +1811,24 @@
;; MISCELANEOUS ;; MISCELANEOUS
;; ---------------------------------------------------------------------- ;; ----------------------------------------------------------------------
;; Note the use of the (const_int 0) when generating the insn that matches
;; the bsch pattern. This ensures that the destination register is
;; initialised with 0 which will make the BSCH instruction set searching
;; at bit 31.
;;
;; The XOR in the instruction sequence below is there because the BSCH
;; instruction returns the bit number of the highest set bit and we want
;; the number of zero bits above that bit. The AM33 does not have a
;; reverse subtraction instruction, but we can use a simple xor instead
;; since we know that the top 27 bits are clear.
(define_expand "clzsi2" (define_expand "clzsi2"
[(parallel [(set (match_operand:SI 0 "register_operand" "") [(parallel [(set (match_operand:SI 0 "register_operand")
(unspec:SI [(match_operand:SI 1 "register_operand" "") (unspec:SI [(match_operand:SI 1 "register_operand")
(const_int 0)] UNSPEC_BSCH)) (const_int 0)] UNSPEC_BSCH))
(clobber (reg:CC CC_REG))])
(parallel [(set (match_dup 0)
(xor:SI (match_dup 0)
(const_int 31)))
(clobber (reg:CC CC_REG))])] (clobber (reg:CC CC_REG))])]
"TARGET_AM33" "TARGET_AM33"
) )
...@@ -1826,7 +1840,7 @@ ...@@ -1826,7 +1840,7 @@
UNSPEC_BSCH)) UNSPEC_BSCH))
(clobber (reg:CC CC_REG))] (clobber (reg:CC CC_REG))]
"TARGET_AM33" "TARGET_AM33"
"bsch %1,%0" "bsch %1, %0"
) )
;; ---------------------------------------------------------------------- ;; ----------------------------------------------------------------------
...@@ -2034,7 +2048,7 @@ ...@@ -2034,7 +2048,7 @@
{ {
/* The RETF insn is up to 3 cycles faster than RET. */ /* The RETF insn is up to 3 cycles faster than RET. */
fputs ((mn10300_can_use_retf_insn () ? "\tretf " : "\tret "), asm_out_file); fputs ((mn10300_can_use_retf_insn () ? "\tretf " : "\tret "), asm_out_file);
mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs ()); mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs (NULL));
fprintf (asm_out_file, ",%d\n", (int) INTVAL (operands[0])); fprintf (asm_out_file, ",%d\n", (int) INTVAL (operands[0]));
return ""; return "";
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment