aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <erich@gnu.org>1994-10-02 15:10:48 +0000
committerRichard Earnshaw <erich@gnu.org>1994-10-02 15:10:48 +0000
commit0a81f500044e97d296deb70b3ee657a0eeabe9f0 (patch)
treee7faa57b689158ecebe68e194fc91abb17a0001b /gcc
parent2ce9c1b9e15da5507207c4f2f217bcdde90babea (diff)
downloadgcc-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.c33
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;
{