Good evening,
I need help understanding where some RTX comes from.
In my target.md I have the following expansion:
(define_expand "smaxsf3"
[(parallel [(set (match_dup 3)
(unspec:SI [(match_operand:SF 1 "register_operand" "")
(match_operand:SF 2 "reg_or_0_operand" "")]
UNSPEC_CMP_F))
(clobber (reg:SI REG_PSW))])
(set (match_dup 3)
(and:SI (match_dup 3)
(match_dup 4)))
;; "*movsfcc.ne"
(set (match_operand:SF 0 "register_operand" "")
(if_then_else:SF (ne (match_dup 3)
(const_int 0))
(match_dup 1)
(match_dup 2)))]
"TARGET_USE_FPU"
{
printf("here1");
operands[3] = gen_reg_rtx (SImode);
operands[4] = gen_int_mode (1 << CMP_F_GT, SImode);
})
TARGET_USE_FPU is driven by a flag I wrote (msoft-float), and when it
evaluates to false I get the following RTX after RTL expand:
(note 6 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(insn 2 6 3 2 (set (reg/v:SF 41 [ a ])
(reg:SF 4 d4 [ a ])) "../test.c":11:19 -1
(nil))
(note 3 2 8 2 NOTE_INSN_FUNCTION_BEG)
(insn 8 3 9 2 (set (reg:SF 42)
(const_double:SF 0.0 [0x0.0p+0])) "../test.c":12:4 -1
(nil))
(insn 9 8 10 2 (parallel [
(set (reg:SI 43)
(unspec:SI [
(reg/v:SF 41 [ a ])
(reg:SF 42)
] UNSPEC_CMP_F))
(clobber (reg:SI 33 PSW))
]) "../test.c":12:4 -1
(nil))
(insn 10 9 11 2 (set (reg:SI 43)
(ior:SI (zero_extract:SI (reg:SI 43)
(const_int 1 [0x1])
(const_int 2 [0x2]))
(zero_extract:SI (reg:SI 43)
(const_int 1 [0x1])
(const_int 2 [0x2])))) "../test.c":12:4 -1
(nil))
(jump_insn 11 10 12 2 (set (pc)
(if_then_else (ne (reg:SI 43)
(const_int 0 [0]))
(label_ref:SI 24)
(pc))) "../test.c":12:4 162 {*bne}
(int_list:REG_BR_PROB 633507684 (nil))
-> 24)
>From what I understand, the define_expand "smaxsf3" is used to produce the
RTL above. Am I right? Why does it happen, even if the condition for the
define_expand evaluates to false?
Thank you
Enrico Bragante