aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorSofiane Naci <sofiane.naci@arm.com>2013-04-02 09:02:17 +0000
committerSofiane Naci <sofiane@gcc.gnu.org>2013-04-02 09:02:17 +0000
commit051d0e2f45082269e127c6e048c69faee664b129 (patch)
treec4e3ff162f89a1e7fcfb2d19aec27e6fdf10021a /gcc/config
parent0ee1e3d98397c166a0bc74d1fbb7032cc3e99421 (diff)
downloadgcc-051d0e2f45082269e127c6e048c69faee664b129.zip
gcc-051d0e2f45082269e127c6e048c69faee664b129.tar.gz
gcc-051d0e2f45082269e127c6e048c69faee664b129.tar.bz2
aarch64.md (*mov<mode>_aarch64): Add alternatives for scalar move.
* config/aarch64/aarch64.md (*mov<mode>_aarch64): Add alternatives for scalar move. * config/aarch64/aarch64.c (aarch64_simd_scalar_immediate_valid_for_move): New. * config/aarch64/aarch64-protos.h (aarch64_simd_scalar_immediate_valid_for_move): New. * config/aarch64/constraints.md (Dh, Dq): New. * config/aarch64/iterators.md (hq): New. From-SVN: r197341
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/aarch64/aarch64-protos.h1
-rw-r--r--gcc/config/aarch64/aarch64.c15
-rw-r--r--gcc/config/aarch64/aarch64.md12
-rw-r--r--gcc/config/aarch64/constraints.md16
-rw-r--r--gcc/config/aarch64/iterators.md3
5 files changed, 42 insertions, 5 deletions
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 5d0072f..7ebbf51 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -151,6 +151,7 @@ bool aarch64_regno_ok_for_base_p (int, bool);
bool aarch64_regno_ok_for_index_p (int, bool);
bool aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode);
bool aarch64_simd_imm_zero_p (rtx, enum machine_mode);
+bool aarch64_simd_scalar_immediate_valid_for_move (rtx, enum machine_mode);
bool aarch64_simd_shift_imm_p (rtx, enum machine_mode, bool);
bool aarch64_symbolic_address_p (rtx);
bool aarch64_symbolic_constant_p (rtx, enum aarch64_symbol_context,
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 6a024d0..bd33cd6 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -6407,6 +6407,21 @@ aarch64_simd_gen_const_vector_dup (enum machine_mode mode, int val)
return gen_rtx_CONST_VECTOR (mode, v);
}
+/* Check OP is a legal scalar immediate for the MOVI instruction. */
+
+bool
+aarch64_simd_scalar_immediate_valid_for_move (rtx op, enum machine_mode mode)
+{
+ enum machine_mode vmode;
+
+ gcc_assert (!VECTOR_MODE_P (mode));
+ vmode = aarch64_preferred_simd_mode (mode);
+ rtx op_v = aarch64_simd_gen_const_vector_dup (vmode, INTVAL (op));
+ int retval = aarch64_simd_immediate_valid_for_move (op_v, vmode, 0,
+ NULL, NULL, NULL, NULL);
+ return retval;
+}
+
/* Construct and return a PARALLEL RTX vector. */
rtx
aarch64_simd_vect_par_cnst_half (enum machine_mode mode, bool high)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index ab73ae3..01f04aa 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -763,19 +763,21 @@
)
(define_insn "*mov<mode>_aarch64"
- [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r,r,m, r,*w")
- (match_operand:SHORT 1 "general_operand" " r,M,m,rZ,*w,r"))]
+ [(set (match_operand:SHORT 0 "nonimmediate_operand" "=r,r, *w,r, m, r,*w,*w")
+ (match_operand:SHORT 1 "general_operand" " r,M,D<hq>,m,rZ,*w, r,*w"))]
"(register_operand (operands[0], <MODE>mode)
|| aarch64_reg_or_zero (operands[1], <MODE>mode))"
"@
mov\\t%w0, %w1
mov\\t%w0, %1
+ movi\\t%0.<Vallxd>, %1
ldr<size>\\t%w0, %1
str<size>\\t%w1, %0
umov\\t%w0, %1.<v>[0]
- dup\\t%0.<Vallxd>, %w1"
- [(set_attr "v8type" "move,alu,load1,store1,*,*")
- (set_attr "simd_type" "*,*,*,*,simd_movgp,simd_dupgp")
+ dup\\t%0.<Vallxd>, %w1
+ dup\\t%0, %1.<v>[0]"
+ [(set_attr "v8type" "move,alu,alu,load1,store1,*,*,*")
+ (set_attr "simd_type" "*,*,simd_move_imm,*,*,simd_movgp,simd_dupgp,simd_dup")
(set_attr "mode" "<MODE>")
(set_attr "simd_mode" "<MODE>")]
)
diff --git a/gcc/config/aarch64/constraints.md b/gcc/config/aarch64/constraints.md
index 917b939..18ac16a 100644
--- a/gcc/config/aarch64/constraints.md
+++ b/gcc/config/aarch64/constraints.md
@@ -152,6 +152,22 @@
NULL, NULL, NULL,
NULL, NULL) != 0")))
+(define_constraint "Dh"
+ "@internal
+ A constraint that matches an immediate operand valid for\
+ AdvSIMD scalar move in HImode."
+ (and (match_code "const_int")
+ (match_test "aarch64_simd_scalar_immediate_valid_for_move (op,
+ HImode)")))
+
+(define_constraint "Dq"
+ "@internal
+ A constraint that matches an immediate operand valid for\
+ AdvSIMD scalar move in QImode."
+ (and (match_code "const_int")
+ (match_test "aarch64_simd_scalar_immediate_valid_for_move (op,
+ QImode)")))
+
(define_constraint "Dl"
"@internal
A constraint that matches vector of immediates for left shifts."
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index ce81ac5..863a4af 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -249,6 +249,9 @@
;; 32-bit version and "%x0" in the 64-bit version.
(define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")])
+;; For constraints used in scalar immediate vector moves
+(define_mode_attr hq [(HI "h") (QI "q")])
+
;; For scalar usage of vector/FP registers
(define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d")
(V8QI "") (V16QI "")