aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.4.3
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2012-11-28 14:40:14 +0800
committerAndrew Hsieh <andrewhsieh@google.com>2012-11-28 14:40:14 +0800
commite9e89d212eb19a7cd0c503b9de93086d4c886257 (patch)
tree1ef581ee014e2f701688afb58d0ef3746ec1f57c /gcc-4.4.3
parent954a4ce00a0a2a93c783c30141e9703cca2442f6 (diff)
downloadtoolchain_gcc-e9e89d212eb19a7cd0c503b9de93086d4c886257.tar.gz
toolchain_gcc-e9e89d212eb19a7cd0c503b9de93086d4c886257.tar.bz2
toolchain_gcc-e9e89d212eb19a7cd0c503b9de93086d4c886257.zip
Fix GCC 4.4.3 ARM ICE at postreload.c:396
Backport r147577 to fix issue http://code.google.com/p/android/issues/detail?id=22345 2009-05-15 Paul Brook <paul@codesourcery.com> Sandra Loosemore <sandra@codesourcery.com> gcc/ * config/arm/arm.c (neon_vector_mem_operand): Handle element/structure loads. Allow PRE_DEC. (output_move_neon): Handle PRE_DEC. (arm_print_operand): Add 'A' for neon structure loads. * config/arm/arm-protos.h (neon_vector_mem_operand): Update prototype. * config/arm/neon.md (neon_mov): Update comment. * config/arm/constraints.md (Un, Us): Update neon_vector_mem_operand calls. (Um): New constraint. Change-Id: I3eb5e7ab55277cfe04b1c6833d656c1426b24708
Diffstat (limited to 'gcc-4.4.3')
-rw-r--r--gcc-4.4.3/gcc/config/arm/arm-protos.h2
-rw-r--r--gcc-4.4.3/gcc/config/arm/arm.c52
-rw-r--r--gcc-4.4.3/gcc/config/arm/constraints.md13
-rw-r--r--gcc-4.4.3/gcc/config/arm/neon.md2
4 files changed, 48 insertions, 21 deletions
diff --git a/gcc-4.4.3/gcc/config/arm/arm-protos.h b/gcc-4.4.3/gcc/config/arm/arm-protos.h
index ee0a34393..5b94ba040 100644
--- a/gcc-4.4.3/gcc/config/arm/arm-protos.h
+++ b/gcc-4.4.3/gcc/config/arm/arm-protos.h
@@ -88,7 +88,7 @@ extern bool arm_cannot_force_const_mem (rtx);
extern int cirrus_memory_offset (rtx);
extern int arm_coproc_mem_operand (rtx, bool);
-extern int neon_vector_mem_operand (rtx, bool);
+extern int neon_vector_mem_operand (rtx, int);
extern int neon_struct_mem_operand (rtx);
extern int arm_no_early_store_addr_dep (rtx, rtx);
extern int arm_no_early_alu_shift_dep (rtx, rtx);
diff --git a/gcc-4.4.3/gcc/config/arm/arm.c b/gcc-4.4.3/gcc/config/arm/arm.c
index 0904cbda9..4bad1ca72 100644
--- a/gcc-4.4.3/gcc/config/arm/arm.c
+++ b/gcc-4.4.3/gcc/config/arm/arm.c
@@ -8096,10 +8096,13 @@ arm_coproc_mem_operand (rtx op, bool wb)
}
/* Return TRUE if OP is a memory operand which we can load or store a vector
- to/from. If CORE is true, we're moving from ARM registers not Neon
- registers. */
+ to/from. TYPE is one of the following values:
+ 0 - Vector load/stor (vldr)
+ 1 - Core registers (ldm)
+ 2 - Element/structure loads (vld1)
+ */
int
-neon_vector_mem_operand (rtx op, bool core)
+neon_vector_mem_operand (rtx op, int type)
{
rtx ind;
@@ -8132,23 +8135,15 @@ neon_vector_mem_operand (rtx op, bool core)
return arm_address_register_rtx_p (ind, 0);
/* Allow post-increment with Neon registers. */
- if (!core && GET_CODE (ind) == POST_INC)
+ if (type != 1 && (GET_CODE (ind) == POST_INC || GET_CODE (ind) == PRE_DEC))
return arm_address_register_rtx_p (XEXP (ind, 0), 0);
-#if 0
- /* FIXME: We can support this too if we use VLD1/VST1. */
- if (!core
- && GET_CODE (ind) == POST_MODIFY
- && arm_address_register_rtx_p (XEXP (ind, 0), 0)
- && GET_CODE (XEXP (ind, 1)) == PLUS
- && rtx_equal_p (XEXP (XEXP (ind, 1), 0), XEXP (ind, 0)))
- ind = XEXP (ind, 1);
-#endif
+ /* FIXME: vld1 allows register post-modify. */
/* Match:
(plus (reg)
(const)). */
- if (!core
+ if (type == 0
&& GET_CODE (ind) == PLUS
&& GET_CODE (XEXP (ind, 0)) == REG
&& REG_MODE_OK_FOR_BASE_P (XEXP (ind, 0), VOIDmode)
@@ -8218,7 +8213,7 @@ coproc_secondary_reload_class (enum machine_mode mode, rtx x, bool wb)
if (TARGET_NEON
&& (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
|| GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
- && neon_vector_mem_operand (x, FALSE))
+ && neon_vector_mem_operand (x, 0))
return NO_REGS;
if (arm_coproc_mem_operand (x, wb) || s_register_operand (x, mode))
@@ -12007,7 +12002,7 @@ output_move_double (rtx *operands)
}
/* Output a move, load or store for quad-word vectors in ARM registers. Only
- handles MEMs accepted by neon_vector_mem_operand with CORE=true. */
+ handles MEMs accepted by neon_vector_mem_operand with TYPE=1. */
const char *
output_move_quad (rtx *operands)
@@ -12203,6 +12198,13 @@ output_move_neon (rtx *operands)
ops[1] = reg;
break;
+ case PRE_DEC:
+ /* FIXME: We should be using vld1/vst1 here in BE mode? */
+ templ = "v%smdb%%?\t%%0!, %%h1";
+ ops[0] = XEXP (addr, 0);
+ ops[1] = reg;
+ break;
+
case POST_MODIFY:
/* FIXME: Not currently enabled in neon_vector_mem_operand. */
gcc_unreachable ();
@@ -15070,6 +15072,24 @@ arm_print_operand (FILE *stream, rtx x, int code)
}
return;
+ /* Memory operand for vld1/vst1 instruction. */
+ case 'A':
+ {
+ rtx addr;
+ bool postinc = FALSE;
+ gcc_assert (GET_CODE (x) == MEM);
+ addr = XEXP (x, 0);
+ if (GET_CODE (addr) == POST_INC)
+ {
+ postinc = 1;
+ addr = XEXP (addr, 0);
+ }
+ asm_fprintf (stream, "[%r]", REGNO (addr));
+ if (postinc)
+ fputs("!", stream);
+ }
+ return;
+
default:
if (x == 0)
{
diff --git a/gcc-4.4.3/gcc/config/arm/constraints.md b/gcc-4.4.3/gcc/config/arm/constraints.md
index 8cab39a66..9bb29fd57 100644
--- a/gcc-4.4.3/gcc/config/arm/constraints.md
+++ b/gcc-4.4.3/gcc/config/arm/constraints.md
@@ -34,7 +34,7 @@
;; in Thumb-2 state: Ps, Pt, Pw, Px
;; The following memory constraints have been used:
-;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Us
+;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Um, Us
;; in ARM state: Uq
@@ -255,17 +255,24 @@
(define_memory_constraint "Un"
"@internal
+ In ARM/Thumb-2 state a valid address for Neon doubleword vector
+ load/store instructions."
+ (and (match_code "mem")
+ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 0)")))
+
+(define_memory_constraint "Um"
+ "@internal
In ARM/Thumb-2 state a valid address for Neon element and structure
load/store instructions."
(and (match_code "mem")
- (match_test "TARGET_32BIT && neon_vector_mem_operand (op, FALSE)")))
+ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 2)")))
(define_memory_constraint "Us"
"@internal
In ARM/Thumb-2 state a valid address for non-offset loads/stores of
quad-word values in four ARM registers."
(and (match_code "mem")
- (match_test "TARGET_32BIT && neon_vector_mem_operand (op, TRUE)")))
+ (match_test "TARGET_32BIT && neon_vector_mem_operand (op, 1)")))
(define_memory_constraint "Uq"
"@internal
diff --git a/gcc-4.4.3/gcc/config/arm/neon.md b/gcc-4.4.3/gcc/config/arm/neon.md
index a3d3e73d2..01d84d814 100644
--- a/gcc-4.4.3/gcc/config/arm/neon.md
+++ b/gcc-4.4.3/gcc/config/arm/neon.md
@@ -481,7 +481,7 @@
/* FIXME: If the memory layout is changed in big-endian mode, output_move_vfp
below must be changed to output_move_neon (which will use the
- element/structure loads/stores), and the constraint changed to 'Un' instead
+ element/structure loads/stores), and the constraint changed to 'Um' instead
of 'Uv'. */
switch (which_alternative)