Commit 66b01cc3 by Andrew Stubbs Committed by Andrew Stubbs

Disallow 'B' constraints on amdgcn addc/subb

2020-01-07  Andrew Stubbs  <ams@codesourcery.com>

	gcc/
	* config/gcn/constraints.md (DA): Update description and match.
	(DB): Likewise.
	(Db): New constraint.
	* config/gcn/gcn-protos.h (gcn_inline_constant64_p): Add second
	parameter.
	* config/gcn/gcn.c (gcn_inline_constant64_p): Add 'mixed' parameter.
	Implement 'Db' mixed immediate type.
	* config/gcn/gcn-valu.md (addcv64si3<exec_vcc>): Rework constraints.
	(addcv64si3_dup<exec_vcc>): Delete.
	(subcv64si3<exec_vcc>): Rework constraints.
	(addv64di3): Rework constraints.
	(addv64di3_exec): Rework constraints.
	(subv64di3): Rework constraints.
	(addv64di3_dup): Delete.
	(addv64di3_dup_exec): Delete.
	(addv64di3_zext): Rework constraints.
	(addv64di3_zext_exec): Rework constraints.
	(addv64di3_zext_dup): Rework constraints.
	(addv64di3_zext_dup_exec): Rework constraints.
	(addv64di3_zext_dup2): Rework constraints.
	(addv64di3_zext_dup2_exec): Rework constraints.
	(addv64di3_sext_dup2): Rework constraints.
	(addv64di3_sext_dup2_exec): Rework constraints.

From-SVN: r279959
parent 77aecac1
2020-01-07 Andrew Stubbs <ams@codesourcery.com>
* config/gcn/constraints.md (DA): Update description and match.
(DB): Likewise.
(Db): New constraint.
* config/gcn/gcn-protos.h (gcn_inline_constant64_p): Add second
parameter.
* config/gcn/gcn.c (gcn_inline_constant64_p): Add 'mixed' parameter.
Implement 'Db' mixed immediate type.
* config/gcn/gcn-valu.md (addcv64si3<exec_vcc>): Rework constraints.
(addcv64si3_dup<exec_vcc>): Delete.
(subcv64si3<exec_vcc>): Rework constraints.
(addv64di3): Rework constraints.
(addv64di3_exec): Rework constraints.
(subv64di3): Rework constraints.
(addv64di3_dup): Delete.
(addv64di3_dup_exec): Delete.
(addv64di3_zext): Rework constraints.
(addv64di3_zext_exec): Rework constraints.
(addv64di3_zext_dup): Rework constraints.
(addv64di3_zext_dup_exec): Rework constraints.
(addv64di3_zext_dup2): Rework constraints.
(addv64di3_zext_dup2_exec): Rework constraints.
(addv64di3_sext_dup2): Rework constraints.
(addv64di3_sext_dup2_exec): Rework constraints.
2020-01-07 Andre Vieira <andre.simoesdiasvieira@arm.com> 2020-01-07 Andre Vieira <andre.simoesdiasvieira@arm.com>
* doc/sourcebuild.texi (arm_little_endian, arm_nothumb): Documented * doc/sourcebuild.texi (arm_little_endian, arm_nothumb): Documented
......
...@@ -53,12 +53,17 @@ ...@@ -53,12 +53,17 @@
(match_test "gcn_constant64_p (op)"))) (match_test "gcn_constant64_p (op)")))
(define_constraint "DA" (define_constraint "DA"
"Splittable inline immediate 64-bit parameter" "Immediate 64-bit parameter, low and high part match 'A'"
(and (match_code "const_int,const_double,const_vector") (and (match_code "const_int,const_double,const_vector")
(match_test "gcn_inline_constant64_p (op)"))) (match_test "gcn_inline_constant64_p (op, 0)")))
(define_constraint "Db"
"Immediate 64-bit parameter, low part matches 'B', high part matches 'A'"
(and (match_code "const_int,const_double,const_vector")
(match_test "gcn_inline_constant64_p (op, 1)")))
(define_constraint "DB" (define_constraint "DB"
"Splittable immediate 64-bit parameter" "Immediate 64-bit parameter, low and high part match 'B'"
(match_code "const_int,const_double,const_vector")) (match_code "const_int,const_double,const_vector"))
(define_constraint "U" (define_constraint "U"
......
...@@ -51,7 +51,7 @@ extern int gcn_hard_regno_nregs (int regno, machine_mode mode); ...@@ -51,7 +51,7 @@ extern int gcn_hard_regno_nregs (int regno, machine_mode mode);
extern void gcn_hsa_declare_function_name (FILE *file, const char *name, extern void gcn_hsa_declare_function_name (FILE *file, const char *name,
tree decl); tree decl);
extern HOST_WIDE_INT gcn_initial_elimination_offset (int, int); extern HOST_WIDE_INT gcn_initial_elimination_offset (int, int);
extern bool gcn_inline_constant64_p (rtx); extern bool gcn_inline_constant64_p (rtx, bool);
extern bool gcn_inline_constant_p (rtx); extern bool gcn_inline_constant_p (rtx);
extern int gcn_inline_fp_constant_p (rtx, bool); extern int gcn_inline_fp_constant_p (rtx, bool);
extern reg_class gcn_mode_code_base_reg_class (machine_mode, addr_space_t, extern reg_class gcn_mode_code_base_reg_class (machine_mode, addr_space_t,
......
...@@ -902,16 +902,17 @@ gcn_constant_p (rtx x) ...@@ -902,16 +902,17 @@ gcn_constant_p (rtx x)
/* Return true if X is a constant representable as two inline immediate /* Return true if X is a constant representable as two inline immediate
constants in a 64-bit instruction that is split into two 32-bit constants in a 64-bit instruction that is split into two 32-bit
instructions. */ instructions.
When MIXED is set, the low-part is permitted to use the full 32-bits. */
bool bool
gcn_inline_constant64_p (rtx x) gcn_inline_constant64_p (rtx x, bool mixed)
{ {
if (GET_CODE (x) == CONST_VECTOR) if (GET_CODE (x) == CONST_VECTOR)
{ {
if (!vgpr_vector_mode_p (GET_MODE (x))) if (!vgpr_vector_mode_p (GET_MODE (x)))
return false; return false;
if (!gcn_inline_constant64_p (CONST_VECTOR_ELT (x, 0))) if (!gcn_inline_constant64_p (CONST_VECTOR_ELT (x, 0), mixed))
return false; return false;
for (int i = 1; i < 64; i++) for (int i = 1; i < 64; i++)
if (CONST_VECTOR_ELT (x, i) != CONST_VECTOR_ELT (x, 0)) if (CONST_VECTOR_ELT (x, i) != CONST_VECTOR_ELT (x, 0))
...@@ -925,7 +926,8 @@ gcn_inline_constant64_p (rtx x) ...@@ -925,7 +926,8 @@ gcn_inline_constant64_p (rtx x)
rtx val_lo = gcn_operand_part (DImode, x, 0); rtx val_lo = gcn_operand_part (DImode, x, 0);
rtx val_hi = gcn_operand_part (DImode, x, 1); rtx val_hi = gcn_operand_part (DImode, x, 1);
return gcn_inline_constant_p (val_lo) && gcn_inline_constant_p (val_hi); return ((mixed || gcn_inline_constant_p (val_lo))
&& gcn_inline_constant_p (val_hi));
} }
/* Return true if X is a constant representable as an immediate constant /* Return true if X is a constant representable as an immediate constant
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment