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