rtx cond = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
rtx target = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label_ref, pc_rtx);
- emit_insn (gen_ffssi2_internal (operands[0], operands[1]));
+ emit_insn (gen_ctzsi2 (operands[0], operands[1]));
emit_jump_insn (gen_rtx_SET (pc_rtx, target));
emit_insn (gen_negsi2 (operands[0], const1_rtx));
emit_label (label);
DONE;
}")
-(define_insn "ffssi2_internal"
+(define_insn "ctzsi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rQ")
- (ffs:SI (match_operand:SI 1 "general_operand" "nrQT")))
+ (ctz:SI (match_operand:SI 1 "general_operand" "nrQT")))
(set (cc0)
(compare (match_dup 1)
(const_int 0)))]
by the proper FDE definition. */
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PC_REGNUM)
+/* Upon failure to find the bit the FFS hardware instruction returns
+ the position of the bit immediately following the field specified. */
+#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) \
+ ((VALUE) = GET_MODE_BITSIZE (MODE), 2)
--- /dev/null
+/* { dg-do compile } */
+
+int
+ctzsi (unsigned int x)
+{
+ return __builtin_ctz (x);
+}
+
+/* Expect assembly like:
+
+ ffs $0,$32,4(%ap),%r0
+
+ */
+
+/* { dg-final { scan-assembler "\tffs \\\$0,\\\$32," } } */