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

Reply via email to