diff mbox

[75/90] assembler: Introduce set_intruction_pred_cond()

Message ID 1359991705-5254-76-git-send-email-damien.lespiau@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lespiau, Damien Feb. 4, 2013, 3:28 p.m. UTC
This allow us to factor out the test that checks if, when using both
predicates and conditional modifiers, we are using the same flag
register.

Also get rid of of a FIXME that we are now dealing with (the warning
mentioned above).

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 assembler/gram.y |   88 +++++++++++++++++++-----------------------------------
 1 files changed, 31 insertions(+), 57 deletions(-)
diff mbox

Patch

diff --git a/assembler/gram.y b/assembler/gram.y
index 2d72037..917bccf 100644
--- a/assembler/gram.y
+++ b/assembler/gram.y
@@ -104,6 +104,10 @@  static void set_instruction_options(struct brw_program_instruction *instr,
 				    struct options options);
 static void set_instruction_predicate(struct brw_program_instruction *instr,
 				      struct predicate *p);
+static void set_instruction_pred_cond(struct brw_program_instruction *instr,
+				      struct predicate *p,
+				      struct condition *c,
+				      YYLTYPE *location);
 static void set_direct_dst_operand(struct brw_reg *dst, struct brw_reg *reg,
 				   int type);
 static void set_direct_src_operand(struct src_operand *src, struct brw_reg *reg,
@@ -992,28 +996,15 @@  unaryinstruction:
 		{
 		  memset(&$$, 0, sizeof($$));
 		  set_instruction_opcode(&$$, $2);
-		  GEN(&$$)->header.destreg__conditionalmod = $3.cond;
 		  GEN(&$$)->header.saturate = $4;
 		  $6.width = $5;
 		  set_instruction_options(&$$, $8);
-		  set_instruction_predicate(&$$, &$1);
+		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
 		  if (set_instruction_dest(&$$, &$6) != 0)
 		    YYERROR;
 		  if (set_instruction_src0(&$$, &$7, &@7) != 0)
 		    YYERROR;
 
-		  if ($3.flag_subreg_nr != -1) {
-		    if (GEN(&$$)->header.predicate_control != BRW_PREDICATE_NONE &&
-                        ($1.flag_reg_nr != $3.flag_reg_nr ||
-                         $1.flag_subreg_nr != $3.flag_subreg_nr))
-                        warn(ALWAYS, &@3, "must use the same flag register if "
-			     "both prediction and conditional modifier are "
-			     "enabled\n");
-
-		    GEN(&$$)->bits2.da1.flag_reg_nr = $3.flag_reg_nr;
-		    GEN(&$$)->bits2.da1.flag_subreg_nr = $3.flag_subreg_nr;
-		  }
-
 		  if (!IS_GENp(6) && 
 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
@@ -1031,10 +1022,9 @@  binaryinstruction:
 		{
 		  memset(&$$, 0, sizeof($$));
 		  set_instruction_opcode(&$$, $2);
-		  GEN(&$$)->header.destreg__conditionalmod = $3.cond;
 		  GEN(&$$)->header.saturate = $4;
 		  set_instruction_options(&$$, $9);
-		  set_instruction_predicate(&$$, &$1);
+		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
 		  $6.width = $5;
 		  if (set_instruction_dest(&$$, &$6) != 0)
 		    YYERROR;
@@ -1043,18 +1033,6 @@  binaryinstruction:
 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
 		    YYERROR;
 
-		  if ($3.flag_subreg_nr != -1) {
-		    if (GEN(&$$)->header.predicate_control != BRW_PREDICATE_NONE &&
-                        ($1.flag_reg_nr != $3.flag_reg_nr ||
-                         $1.flag_subreg_nr != $3.flag_subreg_nr))
-                        warn(ALWAYS, &@3, "must use the same flag register if "
-			     "both prediction and conditional modifier are "
-			     "enabled\n");
-
-		    GEN(&$$)->bits2.da1.flag_reg_nr = $3.flag_reg_nr;
-		    GEN(&$$)->bits2.da1.flag_subreg_nr = $3.flag_subreg_nr;
-		  }
-
 		  if (!IS_GENp(6) && 
 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
@@ -1072,11 +1050,10 @@  binaryaccinstruction:
 		{
 		  memset(&$$, 0, sizeof($$));
 		  set_instruction_opcode(&$$, $2);
-		  GEN(&$$)->header.destreg__conditionalmod = $3.cond;
 		  GEN(&$$)->header.saturate = $4;
 		  $6.width = $5;
 		  set_instruction_options(&$$, $9);
-		  set_instruction_predicate(&$$, &$1);
+		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
 		  if (set_instruction_dest(&$$, &$6) != 0)
 		    YYERROR;
 		  if (set_instruction_src0(&$$, &$7, &@7) != 0)
@@ -1084,18 +1061,6 @@  binaryaccinstruction:
 		  if (set_instruction_src1(&$$, &$8, &@8) != 0)
 		    YYERROR;
 
-		  if ($3.flag_subreg_nr != -1) {
-		    if (GEN(&$$)->header.predicate_control != BRW_PREDICATE_NONE &&
-                        ($1.flag_reg_nr != $3.flag_reg_nr ||
-                         $1.flag_subreg_nr != $3.flag_subreg_nr))
-                        warn(ALWAYS, &@3, "must use the same flag register if "
-			     "both prediction and conditional modifier are "
-			     "enabled\n");
-
-		    GEN(&$$)->bits2.da1.flag_reg_nr = $3.flag_reg_nr;
-		    GEN(&$$)->bits2.da1.flag_subreg_nr = $3.flag_subreg_nr;
-		  }
-
 		  if (!IS_GENp(6) && 
 				get_type_size(GEN(&$$)->bits1.da1.dest_reg_type) * (1 << $6.width) == 64)
 		    GEN(&$$)->header.compression_control = BRW_COMPRESSION_COMPRESSED;
@@ -1115,10 +1080,9 @@  trinaryinstruction:
 {
 		  memset(&$$, 0, sizeof($$));
 
-		  set_instruction_predicate(&$$, &$1);
+		  set_instruction_pred_cond(&$$, &$1, &$3, &@3);
 
 		  set_instruction_opcode(&$$, $2);
-		  GEN(&$$)->header.destreg__conditionalmod = $3.cond;
 		  GEN(&$$)->header.saturate = $4;
 		  GEN(&$$)->header.execution_size = $5;
 
@@ -1131,15 +1095,6 @@  trinaryinstruction:
 		  if (set_instruction_src2_three_src(&$$, &$9))
 		    YYERROR;
 		  set_instruction_options(&$$, $10);
-
-		  if ($3.flag_subreg_nr != -1) {
-		    if (GEN(&$$)->header.predicate_control != BRW_PREDICATE_NONE &&
-                        ($1.flag_reg_nr != $3.flag_reg_nr ||
-                         $1.flag_subreg_nr != $3.flag_subreg_nr))
-                        warn(ALWAYS, &@3, "must use the same flag register if "
-			     "both prediction and conditional modifier are "
-			     "enabled\n");
-		  }
 }
 ;
 
@@ -2670,10 +2625,6 @@  predicate:	/* empty */
 		| LPAREN predstate flagreg predctrl RPAREN
 		{
 		  $$.pred_control = $4;
-		  /* XXX: Should deal with erroring when the user tries to
-		   * set a predicate for one flag register and conditional
-		   * modification on the other flag register.
-		   */
 		  $$.flag_reg_nr = $3.nr;
 		  $$.flag_subreg_nr = $3.subnr;
 		  $$.pred_inverse = $2;
@@ -3061,6 +3012,29 @@  static void set_instruction_predicate(struct brw_program_instruction *instr,
 	GEN(instr)->bits2.da1.flag_subreg_nr = p->flag_subreg_nr;
 }
 
+static void set_instruction_pred_cond(struct brw_program_instruction *instr,
+				      struct predicate *p,
+				      struct condition *c,
+				      YYLTYPE *location)
+{
+    set_instruction_predicate(instr, p);
+    GEN(instr)->header.destreg__conditionalmod = c->cond;
+
+    if (c->flag_subreg_nr == -1)
+	return;
+
+    if (p->pred_control != BRW_PREDICATE_NONE &&
+	(p->flag_reg_nr != c->flag_reg_nr ||
+	 p->flag_subreg_nr != c->flag_subreg_nr))
+    {
+	warn(ALWAYS, location, "must use the same flag register if both "
+	     "prediction and conditional modifier are enabled\n");
+    }
+
+    GEN(instr)->bits2.da1.flag_reg_nr = c->flag_reg_nr;
+    GEN(instr)->bits2.da1.flag_subreg_nr = c->flag_subreg_nr;
+}
+
 static void set_direct_dst_operand(struct brw_reg *dst, struct brw_reg *reg,
 				   int type)
 {