yann@1: From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by yann@1: Richard Earnshaw. Fixes http://gcc.gnu.org/PR22528 yann@1: yann@1: --- gcc-3.3.4/gcc/config/arm/arm.md.orig 2004-03-30 22:43:44.000000000 +0200 yann@1: +++ gcc-3.3.4/gcc/config/arm/arm.md 2005-08-15 12:21:55.000000000 +0200 yann@1: @@ -4275,7 +4275,7 @@ yann@1: (set (match_dup 2) yann@1: (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) yann@1: ;; store the high byte yann@1: - (set (match_dup 4) (subreg:QI (match_dup 2) 0))] ;explicit subreg safe yann@1: + (set (match_dup 4) (match_dup 5))] yann@1: "TARGET_ARM" yann@1: " yann@1: { yann@1: @@ -4291,7 +4291,8 @@ yann@1: operands[1] = adjust_address (operands[1], QImode, 0); yann@1: operands[3] = gen_lowpart (QImode, operands[0]); yann@1: operands[0] = gen_lowpart (SImode, operands[0]); yann@1: - operands[2] = gen_reg_rtx (SImode); yann@1: + operands[2] = gen_reg_rtx (SImode); yann@1: + operands[5] = gen_lowpart (QImode, operands[2]); yann@1: }" yann@1: ) yann@1: yann@1: @@ -4299,7 +4300,7 @@ yann@1: [(set (match_dup 4) (match_dup 3)) yann@1: (set (match_dup 2) yann@1: (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) yann@1: - (set (match_operand 1 "" "") (subreg:QI (match_dup 2) 3))] yann@1: + (set (match_operand 1 "" "") (match_dup 5))] yann@1: "TARGET_ARM" yann@1: " yann@1: { yann@1: @@ -4316,13 +4317,14 @@ yann@1: operands[3] = gen_lowpart (QImode, operands[0]); yann@1: operands[0] = gen_lowpart (SImode, operands[0]); yann@1: operands[2] = gen_reg_rtx (SImode); yann@1: + operands[5] = gen_lowpart (QImode, operands[2]); yann@1: }" yann@1: ) yann@1: yann@1: ;; Subroutine to store a half word integer constant into memory. yann@1: (define_expand "storeinthi" yann@1: [(set (match_operand 0 "" "") yann@1: - (subreg:QI (match_operand 1 "" "") 0)) yann@1: + (match_operand 1 "" "")) yann@1: (set (match_dup 3) (match_dup 2))] yann@1: "TARGET_ARM" yann@1: " yann@1: @@ -4363,6 +4365,7 @@ yann@1: operands[3] = adjust_address (op0, QImode, 1); yann@1: operands[0] = adjust_address (operands[0], QImode, 0); yann@1: operands[2] = gen_lowpart (QImode, operands[2]); yann@1: + operands[1] = gen_lowpart (QImode, operands[1]); yann@1: }" yann@1: ) yann@1: yann@1: @@ -4682,11 +4685,12 @@ yann@1: (set (match_dup 3) yann@1: (ashiftrt:SI (match_dup 2) (const_int 16))) yann@1: (set (match_operand:HI 0 "s_register_operand" "") yann@1: - (subreg:HI (match_dup 3) 0))] yann@1: + (match_dup 4))] yann@1: "TARGET_ARM" yann@1: " yann@1: operands[2] = gen_reg_rtx (SImode); yann@1: operands[3] = gen_reg_rtx (SImode); yann@1: + operands[4] = gen_lowpart (HImode, operands[3]); yann@1: " yann@1: ) yann@1: