diff options
Diffstat (limited to 'gcc/global.c')
-rw-r--r-- | gcc/global.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/gcc/global.c b/gcc/global.c index 8aa172a5e36..2f757bd9ade 100644 --- a/gcc/global.c +++ b/gcc/global.c @@ -1422,17 +1422,8 @@ mark_reg_store (reg, setter, data) { register int regno; - /* WORD is which word of a multi-register group is being stored. - For the case where the store is actually into a SUBREG of REG. - Except we don't use it; I believe the entire REG needs to be - made live. */ - int word = 0; - if (GET_CODE (reg) == SUBREG) - { - word = SUBREG_WORD (reg); - reg = SUBREG_REG (reg); - } + reg = SUBREG_REG (reg); if (GET_CODE (reg) != REG) return; @@ -1456,7 +1447,7 @@ mark_reg_store (reg, setter, data) } if (reg_renumber[regno] >= 0) - regno = reg_renumber[regno] /* + word */; + regno = reg_renumber[regno]; /* Handle hardware regs (and pseudos allocated to hard regs). */ if (regno < FIRST_PSEUDO_REGISTER && ! fixed_regs[regno]) @@ -1606,7 +1597,15 @@ set_preference (dest, src) else if (GET_CODE (src) == SUBREG && GET_CODE (SUBREG_REG (src)) == REG) { src_regno = REGNO (SUBREG_REG (src)); - offset += SUBREG_WORD (src); + + if (REGNO (SUBREG_REG (src)) < FIRST_PSEUDO_REGISTER) + offset += subreg_regno_offset (REGNO (SUBREG_REG (src)), + GET_MODE (SUBREG_REG (src)), + SUBREG_BYTE (src), + GET_MODE (src)); + else + offset += (SUBREG_BYTE (src) + / REGMODE_NATURAL_SIZE (GET_MODE (src))); } else return; @@ -1616,7 +1615,15 @@ set_preference (dest, src) else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG) { dest_regno = REGNO (SUBREG_REG (dest)); - offset -= SUBREG_WORD (dest); + + if (REGNO (SUBREG_REG (dest)) < FIRST_PSEUDO_REGISTER) + offset -= subreg_regno_offset (REGNO (SUBREG_REG (dest)), + GET_MODE (SUBREG_REG (dest)), + SUBREG_BYTE (dest), + GET_MODE (dest)); + else + offset -= (SUBREG_BYTE (dest) + / REGMODE_NATURAL_SIZE (GET_MODE (dest))); } else return; |