Minor bug in sh.md?

Toshiyasu Morita tm@netcom.com
Mon Mar 16 12:03:00 GMT 1998


I think the definition of ashlsi_c in sh.md is slightly wrong:

(define_insn "ashlsi_c"
  [(set (match_operand:SI 0 "arith_reg_operand" "=r")
        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0") 
(const_int 1)))
   (set (reg:SI 18) (lt:SI (match_operand:SI 2 "arith_reg_operand" "0")
                           (const_int 0)))]

The T bit (reg 18) is set if the operand 0 is negative, because the MSB is
shifted into the T bit, and not the MSB of an arbitrary operand 2.

If this is correct, please apply this patch:

*** sh.md.bak   Mon Mar 16 11:54:05 1998
--- sh.md       Mon Mar 16 11:54:29 1998
***************
*** 1256,1262 ****
    [(const_int 0)]
    "
  {
!   emit_insn (gen_ashlsi_c (operands[0], operands[1], operands[1]));
    emit_insn (gen_subc1 (operands[0], operands[0], operands[0]));
    DONE;
  }")
--- 1256,1262 ----
    [(const_int 0)]
    "
  {
!   emit_insn (gen_ashlsi_c (operands[0], operands[1]));
    emit_insn (gen_subc1 (operands[0], operands[0], operands[0]));
    DONE;
  }")
***************
*** 1264,1270 ****
  (define_insn "ashlsi_c"
    [(set (match_operand:SI 0 "arith_reg_operand" "=r")
        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0") 
(const_int 1)))
!    (set (reg:SI 18) (lt:SI (match_operand:SI 2 "arith_reg_operand" "0")
                           (const_int 0)))]
    ""
    "shll       %0"
--- 1264,1270 ----
  (define_insn "ashlsi_c"
    [(set (match_operand:SI 0 "arith_reg_operand" "=r")
        (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0") 
(const_int 1)))
!    (set (reg:SI 18) (lt:SI (match_dup 1)
                           (const_int 0)))]
    ""
    "shll       %0"

Toshi





More information about the Gcc-bugs mailing list