その2でこうなりましたが、
0000 FB E2 00 00 00 00 mov.L #_bar1, r14
0006 CC EE mov.B [r14], r14
0008 7C 1E btst #1, r14
000a FB E2 00 00 00 00 mov.L #_bar, r14
0010 1C bne .L5
0011 F0 E1 bset #1, [r14].B
0013 02 rts
.L5:
0014 F0 E9 bclr #1, [r14].B
0016 02 rts
色の付いたところをメモリに対してのbtstにします。
Failed to match this instruction:
(set (pc)
(if_then_else (eq (if_then_else:SI (zero_extract:SI (mem/c:QI (reg/f:SI 30) [0 bar1+0 S1 A8])
(const_int 1 [0x1])
(const_int 1 [0x1]))
(const_int 2 [0x2])
(const_int 0 [0]))
(const_int 0 [0]))
(label_ref 20)
(pc)))
このコンバインパターンを成功するようにrx.mdに以下を追加します。
(define_insn_and_split "*cbranchqi4_tst_ext_mem"
[(set (pc)
(if_then_else
(match_operator 4 "rx_z_comparison_operator"
[ (if_then_else:SI
(zero_extract:SI
(match_operand:QI 0 "rx_restricted_mem_operand" "Q")
(match_operand 1 "rx_constshift_operand" "")
(match_operand 2 "rx_constshift_operand" ""))
(match_operand 5 "const_int_operand" "")
(const_int 0))
(const_int 0)])
(match_operand 3 "label_ref_operand" "")
(pc)))]
"INTVAL (operands[1]) == 1"
"#"
"reload_completed"
[(const_int 0)]
{
HOST_WIDE_INT mask;
rtx x;
mask = 1;
mask <<= INTVAL (operands[1]);
mask -= 1;
mask <<= INTVAL (operands[2]);
x = gen_rtx_AND (SImode, operands[0], gen_int_mode (mask, SImode));
rx_split_cbranch (CC_ZSmode, GET_CODE (operands[4]),
x, const0_rtx, operands[3]);
DONE;
})
これでコンパイルするとこうなります。
0000 FB E2 00 00 00 00 mov.L #_bar1, r14
0006 F4 E1 btst #1, [r14].B
0008 FB E2 00 00 00 00 mov.L #_bar, r14
000e 1C bne .L5
000f F0 E1 bset #1, [r14].B
0011 02 rts
.L5:
0012 F0 E9 bclr #1, [r14].B
0014 02 rts
[0回]
PR