------- Comment #2 from ubizjak at gmail dot com  2007-06-11 07:35 -------
This is the fault of combine pass. It isn't obvious to me, why it is
converting:

(insn 7 6 13 2 shift.c:6 (set (subreg:TI (reg:V2DI 62) 0)
        (ashift:TI (subreg:TI (reg:V2DI 61 [ __a ]) 0)
            (const_int 64 [0x40]))) 1115 {sse2_ashlti3} (insn_list:REG_DEP_TRUE
6 (nil))
    (expr_list:REG_DEAD (reg:V2DI 61 [ __a ])
        (expr_list:REG_EQUAL (ashift:TI (subreg:TI (reg/v:V2DI 60 [ __a ]) 0)
                (const_int 64 [0x40]))
            (nil))))
)

to

(insn 7 6 13 2 shift.c:6 (parallel [
            (set (subreg:TI (reg:V2DI 62) 0)
                (ashift:TI (reg:TI 21 xmm0 [ __a ])
                    (const_int 64 [0x40])))
            (clobber (reg:CC 17 flags))
        ]) 412 {*ashlti3_2} (nil)
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (expr_list:REG_DEAD (reg:V2DI 21 xmm0 [ __a ])
            (nil))))

Note the clobber in above pattern. So, what is wrong with:

(define_insn "sse2_ashlti3"
  [(set (match_operand:TI 0 "register_operand" "=x")
        (ashift:TI (match_operand:TI 1 "register_operand" "0")
                   (match_operand:SI 2 "const_0_to_255_mul_8_operand" "n")))]
  "TARGET_SSE2"


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32280

Reply via email to