middle-end: Add new tbranch optab to add support for bit-test-and-branch operations
This adds a new test-and-branch optab that can be used to do a conditional test of a bit and branch. This is similar to the cbranch optab but instead can test any arbitrary bit inside the register. This patch recognizes boolean comparisons and single bit mask tests. gcc/ChangeLog: * dojump.cc (do_jump): Pass along value. (do_jump_by_parts_greater_rtx): Likewise. (do_jump_by_parts_zero_rtx): Likewise. (do_jump_by_parts_equality_rtx): Likewise. (do_compare_rtx_and_jump): Likewise. (do_compare_and_jump): Likewise. * dojump.h (do_compare_rtx_and_jump): New. * optabs.cc (emit_cmp_and_jump_insn_1): Refactor to take optab to check. (validate_test_and_branch): New. (emit_cmp_and_jump_insns): Optiobally take a value, and when value is supplied then check if it's suitable for tbranch. * optabs.def (tbranch_eq$a4, tbranch_ne$a4): New. * doc/md.texi (tbranch_@var{op}@var{mode}4): Document it. * optabs.h (emit_cmp_and_jump_insns): New. * tree.h (tree_zero_one_valued_p): New.
Showing
- gcc/doc/md.texi 7 additions, 0 deletionsgcc/doc/md.texi
- gcc/dojump.cc 36 additions, 16 deletionsgcc/dojump.cc
- gcc/dojump.h 4 additions, 0 deletionsgcc/dojump.h
- gcc/optabs.cc 105 additions, 9 deletionsgcc/optabs.cc
- gcc/optabs.def 2 additions, 0 deletionsgcc/optabs.def
- gcc/optabs.h 4 additions, 0 deletionsgcc/optabs.h
- gcc/tree.h 1 addition, 0 deletionsgcc/tree.h
Loading
Please register or sign in to comment