patches/gcc/3.3.6/120-gcc-3.3.4-arm-pr22528.patch
changeset 745 e445c00d134d
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/3.3.6/120-gcc-3.3.4-arm-pr22528.patch	Mon Jul 28 20:17:48 2008 +0000
     1.3 @@ -0,0 +1,71 @@
     1.4 +From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by
     1.5 +Richard Earnshaw.  Fixes http://gcc.gnu.org/PR22528
     1.6 +
     1.7 +--- gcc-3.3.4/gcc/config/arm/arm.md.orig	2004-03-30 22:43:44.000000000 +0200
     1.8 ++++ gcc-3.3.4/gcc/config/arm/arm.md	2005-08-15 12:21:55.000000000 +0200
     1.9 +@@ -4275,7 +4275,7 @@
    1.10 +    (set (match_dup 2)
    1.11 + 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
    1.12 +    ;; store the high byte
    1.13 +-   (set (match_dup 4) (subreg:QI (match_dup 2) 0))]	;explicit subreg safe
    1.14 ++   (set (match_dup 4) (match_dup 5))]
    1.15 +   "TARGET_ARM"
    1.16 +   "
    1.17 +   {
    1.18 +@@ -4291,7 +4291,8 @@
    1.19 +     operands[1] = adjust_address (operands[1], QImode, 0);
    1.20 +     operands[3] = gen_lowpart (QImode, operands[0]);
    1.21 +     operands[0] = gen_lowpart (SImode, operands[0]);
    1.22 +-    operands[2] = gen_reg_rtx (SImode); 
    1.23 ++    operands[2] = gen_reg_rtx (SImode);
    1.24 ++    operands[5] = gen_lowpart (QImode, operands[2]);
    1.25 +   }"
    1.26 + )
    1.27 + 
    1.28 +@@ -4299,7 +4300,7 @@
    1.29 +   [(set (match_dup 4) (match_dup 3))
    1.30 +    (set (match_dup 2)
    1.31 + 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
    1.32 +-   (set (match_operand 1 "" "")	(subreg:QI (match_dup 2) 3))]
    1.33 ++   (set (match_operand 1 "" "")	(match_dup 5))]
    1.34 +   "TARGET_ARM"
    1.35 +   "
    1.36 +   {
    1.37 +@@ -4316,13 +4317,14 @@
    1.38 +     operands[3] = gen_lowpart (QImode, operands[0]);
    1.39 +     operands[0] = gen_lowpart (SImode, operands[0]);
    1.40 +     operands[2] = gen_reg_rtx (SImode);
    1.41 ++    operands[5] = gen_lowpart (QImode, operands[2]);
    1.42 +   }"
    1.43 + )
    1.44 + 
    1.45 + ;; Subroutine to store a half word integer constant into memory.
    1.46 + (define_expand "storeinthi"
    1.47 +   [(set (match_operand 0 "" "")
    1.48 +-	(subreg:QI (match_operand 1 "" "") 0))
    1.49 ++	(match_operand 1 "" ""))
    1.50 +    (set (match_dup 3) (match_dup 2))]
    1.51 +   "TARGET_ARM"
    1.52 +   "
    1.53 +@@ -4363,6 +4365,7 @@
    1.54 +     operands[3] = adjust_address (op0, QImode, 1);
    1.55 +     operands[0] = adjust_address (operands[0], QImode, 0);
    1.56 +     operands[2] = gen_lowpart (QImode, operands[2]);
    1.57 ++    operands[1] = gen_lowpart (QImode, operands[1]);
    1.58 +   }"
    1.59 + )
    1.60 + 
    1.61 +@@ -4682,11 +4685,12 @@
    1.62 +    (set (match_dup 3)
    1.63 + 	(ashiftrt:SI (match_dup 2) (const_int 16)))
    1.64 +    (set (match_operand:HI 0 "s_register_operand" "")
    1.65 +-	(subreg:HI (match_dup 3) 0))]
    1.66 ++	(match_dup 4))]
    1.67 +   "TARGET_ARM"
    1.68 +   "
    1.69 +   operands[2] = gen_reg_rtx (SImode);
    1.70 +   operands[3] = gen_reg_rtx (SImode);
    1.71 ++  operands[4] = gen_lowpart (HImode, operands[3]);
    1.72 +   "
    1.73 + )
    1.74 +