This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFA; MN10300: Fix AM33 clzsi2 pattern


Hi Richard,

   The clzsi2/bsch patterns in the MN10300 backend do not work.  There
   are two problems - firstly the starting bit-search position for the
   BSCH instruction is not set.

Yes it is. What do you think that "unused" second operand does?

That actually works ? Gross!


Secondly the BSCH instruction returns
   the bit position of the highest set bit, not the number of leading
   zeros.

Ah, I do see that. I recommend you put the xor in the clz expander rather than cluttering up the "bsch" pattern.

OK - revised patch attached. Is this version OK to apply ?


Cheers
  Nick

gcc/ChangeLog
2011-06-26  Nick Clifton  <nickc@redhat.com>

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

Index: gcc/config/mn10300/mn10300.md
===================================================================
--- gcc/config/mn10300/mn10300.md	(revision 175395)
+++ gcc/config/mn10300/mn10300.md	(working copy)
@@ -1811,10 +1811,24 @@
 ;; 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"
-  [(parallel [(set (match_operand:SI 0 "register_operand" "")
-		   (unspec:SI [(match_operand:SI 1 "register_operand" "")
+  [(parallel [(set (match_operand:SI 0 "register_operand")
+		   (unspec:SI [(match_operand:SI 1 "register_operand")
 			       (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))])]
   "TARGET_AM33"
 )

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]