The `builtins.md' machine description fragment is not included anywhere
and is therefore dead code, which has become bitrotten due to non-use.
If actually enabled, it does not build due to the use of an unknown `t'
constraint:
.../gcc/config/vax/builtins.md:42:1: error: undefined machine-specific constraint at this point: "t"
.../gcc/config/vax/builtins.md:42:1: note: in operand 1
which came from commit
becb93d02cc1 ("builtins.md (ffssi2_internal):
Correct constraint."), which was not applied as posted and reviewed; `T'
was meant to be used instead.
Once this has been fixed this code still fails building:
.../gcc/config/vax/builtins.md: In function 'rtx_def* gen_ffssi2(rtx, rtx)':
.../gcc/config/vax/builtins.md:35:19: error: 'gen_bne' was not declared in this
scope; did you mean 'gen_use'?
35 | emit_jump_insn (gen_bne (label));
| ^~~~~~~
| gen_use
make[2]: *** [Makefile:1122: insn-emit.o] Error 1
Finally the FFS machine instruction sets the Z condition code according
to the comparison of the value held in the source operand against zero
rather than the value held in the target operand. If the source operand
is found hold zero, then the target operand is set to the width of the
source operand, 32 for SImode (FFS supports arbitrary widths).
Correct the build issues then and update RTL to match the operation of
the machine instruction. A test case will be added separately.
gcc/
* config/vax/builtins.md (ffssi2): Make preparation statements
actually buildable.
(ffssi2_internal): Fix input constraints; make the RTL pattern
match reality for `cc0'.
"
{
rtx label = gen_label_rtx ();
+ rtx label_ref = gen_rtx_LABEL_REF (VOIDmode, label);
+ 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_jump_insn (gen_bne (label));
+ emit_jump_insn (gen_rtx_SET (pc_rtx, target));
emit_insn (gen_negsi2 (operands[0], const1_rtx));
emit_label (label);
emit_insn (gen_addsi3 (operands[0], operands[0], const1_rtx));
(define_insn "ffssi2_internal"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rQ")
- (ffs:SI (match_operand:SI 1 "general_operand" "nrQt")))
- (set (cc0) (match_dup 0))]
+ (ffs:SI (match_operand:SI 1 "general_operand" "nrQT")))
+ (set (cc0)
+ (compare (match_dup 1)
+ (const_int 0)))]
""
"ffs $0,$32,%1,%0")