[Bug target/43675] [m68k] Wrong code due to missing sign extension

maxim at codesourcery dot com gcc-bugzilla@gcc.gnu.org
Wed Apr 7 15:25:00 GMT 2010



------- Comment #2 from maxim at codesourcery dot com  2010-04-07 15:24 -------
The problem is in 68k_extendhisi2 pattern, second alternative:
(define_insn "*68k_extendhisi2"
  [(set (match_operand:SI 0 "nonimmediate_operand" "=*d,a")
        (sign_extend:SI
         (match_operand:HI 1 "nonimmediate_src_operand" "0,rmS")))]
  "!ISA_HAS_MVS_MVZ"
  "@
   ext%.l %0
   move%.w %1,%0"
  [(set_attr "type" "ext,move")])

Move.w instruction on ColdFire indeed preserves the upper bits, I found out
that by luck in the coldfire uclinux kernel port, no reference manual that I
know of spells out this behavior.

I have a serious suspicion, though, that move.w on classic m68k does perform
sign extension.  Can anyone confirm this?  If this is so, then the fix is to
disable the second alternative when compiling for ColdFire, e.g., by setting
attribute "ok_for_coldfire" to "no".


-- 


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



More information about the Gcc-bugs mailing list