On 10/30/23 01:25, Fei Gao wrote:
Conditional and, if zero
rd = (rc == 0) ? (rs1 & rs2) : rs1
-->
and rd, rs1, rs2
czero.eqz rtmp, rs1, rc
or rd, rd, rtmp

Conditional and, if non-zero
rd = (rc != 0) ? (rs1 & rs2) : rs1
-->
and rd, rs1, rs2
czero.nez rtmp, rs1, rc
or rd, rd, rtmp

Co-authored-by: Xiao Zeng<zengx...@eswincomputing.com>

gcc/ChangeLog:

         * ifcvt.cc (noce_cond_zero_binary_op_supported): add support for and
         (noce_try_cond_zero_arith): adapt for and operation.

gcc/testsuite/ChangeLog:

         * gcc.target/riscv/zicond_ifcvt_opt.c: add TCs for and operation.
Our internal bits also capture all these cases. The allocation is slightly different and occasionally operands are swapped in an associative operation, but the net is the same.

Jeff

Reply via email to