summaryrefslogtreecommitdiffstats
path: root/gcc/config/arm
diff options
context:
space:
mode:
authorams <ams@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-30 13:52:07 +0000
committerams <ams@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-30 13:52:07 +0000
commit87f800b233f39c706f82792424620bea0f719455 (patch)
treed01a1c281be6a2d51e39a0ffbda66be010d76483 /gcc/config/arm
parent917cf02dbe48316cc6c3b2c00517cc2caaa74a7c (diff)
downloadppe42-gcc-87f800b233f39c706f82792424620bea0f719455.tar.gz
ppe42-gcc-87f800b233f39c706f82792424620bea0f719455.zip
2012-04-30 Andrew Stubbs <ams@codesourcery.com>
* config/arm/arm.c (neon_valid_immediate): Allow const_int. (arm_print_operand): Add 'x' format. * config/arm/constraints.md (Dn): Allow const_int. * config/arm/neon.md (neon_mov<mode>): Use VDX to allow DImode. Use 'x' format to print constants. * config/arm/predicates.md (imm_for_neon_mov_operand): Allow const_int. * config/arm/vfp.md (movdi_vfp): Disable for const_int when neon is enabled. (movdi_vfp_cortexa8): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186983 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/arm')
-rw-r--r--gcc/config/arm/arm.c33
-rw-r--r--gcc/config/arm/constraints.md6
-rw-r--r--gcc/config/arm/neon.md6
-rw-r--r--gcc/config/arm/predicates.md2
-rw-r--r--gcc/config/arm/vfp.md8
5 files changed, 43 insertions, 12 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 54b07c5aafa..b4df624d3b4 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -8911,11 +8911,25 @@ neon_valid_immediate (rtx op, enum machine_mode mode, int inverse,
break; \
}
- unsigned int i, elsize = 0, idx = 0, n_elts = CONST_VECTOR_NUNITS (op);
- unsigned int innersize = GET_MODE_SIZE (GET_MODE_INNER (mode));
+ unsigned int i, elsize = 0, idx = 0, n_elts;
+ unsigned int innersize;
unsigned char bytes[16];
int immtype = -1, matches;
unsigned int invmask = inverse ? 0xff : 0;
+ bool vector = GET_CODE (op) == CONST_VECTOR;
+
+ if (vector)
+ {
+ n_elts = CONST_VECTOR_NUNITS (op);
+ innersize = GET_MODE_SIZE (GET_MODE_INNER (mode));
+ }
+ else
+ {
+ n_elts = 1;
+ if (mode == VOIDmode)
+ mode = DImode;
+ innersize = GET_MODE_SIZE (mode);
+ }
/* Vectors of float constants. */
if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
@@ -8951,7 +8965,7 @@ neon_valid_immediate (rtx op, enum machine_mode mode, int inverse,
/* Splat vector constant out into a byte vector. */
for (i = 0; i < n_elts; i++)
{
- rtx el = CONST_VECTOR_ELT (op, i);
+ rtx el = vector ? CONST_VECTOR_ELT (op, i) : op;
unsigned HOST_WIDE_INT elpart;
unsigned int part, parts;
@@ -17579,6 +17593,19 @@ arm_print_operand (FILE *stream, rtx x, int code)
}
return;
+ /* An integer that we want to print in HEX. */
+ case 'x':
+ switch (GET_CODE (x))
+ {
+ case CONST_INT:
+ fprintf (stream, "#" HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
+ break;
+
+ default:
+ output_operand_lossage ("Unsupported operand for code '%c'", code);
+ }
+ return;
+
case 'B':
if (GET_CODE (x) == CONST_INT)
{
diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md
index 6b59e8772e5..0b80e1fe91e 100644
--- a/gcc/config/arm/constraints.md
+++ b/gcc/config/arm/constraints.md
@@ -260,9 +260,9 @@
(define_constraint "Dn"
"@internal
- In ARM/Thumb-2 state a const_vector which can be loaded with a Neon vmov
- immediate instruction."
- (and (match_code "const_vector")
+ In ARM/Thumb-2 state a const_vector or const_int which can be loaded with a
+ Neon vmov immediate instruction."
+ (and (match_code "const_vector,const_int")
(match_test "TARGET_32BIT
&& imm_for_neon_mov_operand (op, GET_MODE (op))")))
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index c0a46d06b85..960bf313076 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -156,9 +156,9 @@
(define_attr "vqh_mnem" "vadd,vmin,vmax" (const_string "vadd"))
(define_insn "*neon_mov<mode>"
- [(set (match_operand:VD 0 "nonimmediate_operand"
+ [(set (match_operand:VDX 0 "nonimmediate_operand"
"=w,Uv,w, w, ?r,?w,?r,?r, ?Us")
- (match_operand:VD 1 "general_operand"
+ (match_operand:VDX 1 "general_operand"
" w,w, Dn,Uvi, w, r, r, Usi,r"))]
"TARGET_NEON
&& (register_operand (operands[0], <MODE>mode)
@@ -177,7 +177,7 @@
if (width == 0)
return "vmov.f32\t%P0, %1 @ <mode>";
else
- sprintf (templ, "vmov.i%d\t%%P0, %%1 @ <mode>", width);
+ sprintf (templ, "vmov.i%d\t%%P0, %%x1 @ <mode>", width);
return templ;
}
diff --git a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md
index 428f9e053be..fa2027c8ff0 100644
--- a/gcc/config/arm/predicates.md
+++ b/gcc/config/arm/predicates.md
@@ -504,7 +504,7 @@
})
(define_predicate "imm_for_neon_mov_operand"
- (match_code "const_vector")
+ (match_code "const_vector,const_int")
{
return neon_immediate_valid_for_move (op, mode, NULL, NULL);
})
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index 6530570d9ea..20614144d29 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -138,7 +138,9 @@
(match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,r,r,w,w,Uvi,w"))]
"TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune != cortexa8
&& ( register_operand (operands[0], DImode)
- || register_operand (operands[1], DImode))"
+ || register_operand (operands[1], DImode))
+ && !(TARGET_NEON && CONST_INT_P (operands[1])
+ && neon_immediate_valid_for_move (operands[1], DImode, NULL, NULL))"
"*
switch (which_alternative)
{
@@ -187,7 +189,9 @@
(match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,r,r,w,w,Uvi,w"))]
"TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && arm_tune == cortexa8
&& ( register_operand (operands[0], DImode)
- || register_operand (operands[1], DImode))"
+ || register_operand (operands[1], DImode))
+ && !(TARGET_NEON && CONST_INT_P (operands[1])
+ && neon_immediate_valid_for_move (operands[1], DImode, NULL, NULL))"
"*
switch (which_alternative)
{
OpenPOWER on IntegriCloud