diff options
author | Richard Earnshaw <erich@gnu.org> | 1994-10-02 15:10:48 +0000 |
---|---|---|
committer | Richard Earnshaw <erich@gnu.org> | 1994-10-02 15:10:48 +0000 |
commit | 0a81f500044e97d296deb70b3ee657a0eeabe9f0 (patch) | |
tree | e7faa57b689158ecebe68e194fc91abb17a0001b /gcc | |
parent | 2ce9c1b9e15da5507207c4f2f217bcdde90babea (diff) | |
download | gcc-0a81f500044e97d296deb70b3ee657a0eeabe9f0.zip gcc-0a81f500044e97d296deb70b3ee657a0eeabe9f0.tar.gz gcc-0a81f500044e97d296deb70b3ee657a0eeabe9f0.tar.bz2 |
(arm_reload_in_hi): New function.
From-SVN: r8201
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/arm/arm.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 5ddb7c2..cff93d2 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -1472,8 +1472,8 @@ store_multiple_operation (op, mode) int multi_register_push (op, mode) - rtx op; - enum machine_mode mode; + rtx op; + enum machine_mode mode; { if (GET_CODE (op) != PARALLEL || (GET_CODE (XVECEXP (op, 0, 0)) != SET) @@ -1714,6 +1714,35 @@ gen_compare_reg (code, x, y, fp) } void +arm_reload_in_hi (operands) + rtx *operands; +{ + rtx base = find_replacement (&XEXP (operands[1], 0)); + + emit_insn (gen_zero_extendqisi2 (operands[2], gen_rtx (MEM, QImode, base))); + emit_insn (gen_zero_extendqisi2 (gen_rtx (SUBREG, SImode, operands[0], 0), + gen_rtx (MEM, QImode, + plus_constant (base, 1)))); + if (BYTES_BIG_ENDIAN) + emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, + operands[0], 0), + gen_rtx (IOR, SImode, + gen_rtx (ASHIFT, SImode, + gen_rtx (SUBREG, SImode, + operands[0], 0), + GEN_INT (8)), + operands[2]))); + else + emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, + operands[0], 0), + gen_rtx (IOR, SImode, + gen_rtx (ASHIFT, SImode, + operands[2], + GEN_INT (8)), + gen_rtx (SUBREG, SImode, operands[0], 0)))); +} + +void arm_reload_out_hi (operands) rtx *operands; { |