Hi.
I am working on Itanium architecture and GCC-4.1.1.
I modify the machine description file ia64.md to support single
predicate set instruction such as:
(%0) cmp.ne %1, p0 = %2, %3
here %0 and %1 are predicates, %2 is a register or immediate, %3 is a
register operand.
more specifically, I add the following define_insn:
(define_insn "*shift_predicate_cmp"
[(set (const_int 0)
(and:BI (and:BI (match_operand:BI 1 "register_operand" "c")
(and:BI (match_operand:DI 2 "gr_reg_or_8bit_adjusted_operand" "rL")
(match_operand:DI 3 "gr_register_operand" "r")))
(match_operand:BI 0 "register_operand" "c")))]
""
"(%0) cmp.ne %1, p0 = %2, %3"
[(set_attr "itanium_class" "icmp")])
I make this define_insn anonymous because I only need this type of
instruction sometimes, and I can generate this pattern manually; the
generation function is:
rtx gen_shift_predicate_cmp (rtx op0, rtx op1, rtx op2, rtx op3)
{
return gen_rtx_SET(BImode, CONST0_RTX(BImode),
gen_rtx_AND(BImode, gen_rtx_AND(BImode, op1,
gen_rtx_AND(BImode, op2, op3)),
op0));
}
After adding these support, I recompile gcc and insert some
instructions of this kind into insn list, the generation and matching
works fine. BUT, the generation of insn group barrier (';;' on Itanium
architecture) doesn't work fine, and it generates code like:
.loc 1 118 0
(p0) cmp.ne p15, p0 = 0, r30
.loc 1 121 0
(p0) cmp.ne p15, p0 = 0, r30
it warns "WAW" and there should be stop ";;" between these two
instructions. Intuitively, I think I should modify some part of GCC to
generate correct ";;" as there is a new type of define_insn. But I
don't know where exactly to do this modification to correct the error
:-(, any help ?
Any help is truely appreciated !
Thanks very much