i965/vs: Create instruction generators outside of the emit() functions.
authorEric Anholt <eric@anholt.net>
Fri, 26 Aug 2011 23:43:06 +0000 (16:43 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 31 Aug 2011 18:15:49 +0000 (11:15 -0700)
v2: Fixed gen6 IF().

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 327977357f73ef6030efdbf094168e996f2d25fc..dfda82b60f22476b15bbe117654705a9ba1f908c 100644 (file)
@@ -406,6 +406,26 @@ public:
    vec4_instruction *emit(enum opcode opcode, dst_reg dst,
                          src_reg src0, src_reg src1, src_reg src2);
 
+   vec4_instruction *MOV(dst_reg dst, src_reg src0);
+   vec4_instruction *NOT(dst_reg dst, src_reg src0);
+   vec4_instruction *RNDD(dst_reg dst, src_reg src0);
+   vec4_instruction *RNDE(dst_reg dst, src_reg src0);
+   vec4_instruction *RNDZ(dst_reg dst, src_reg src0);
+   vec4_instruction *FRC(dst_reg dst, src_reg src0);
+   vec4_instruction *ADD(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *MUL(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *MACH(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *MAC(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *AND(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *OR(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *XOR(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *DP3(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *DP4(dst_reg dst, src_reg src0, src_reg src1);
+   vec4_instruction *CMP(dst_reg dst, src_reg src0, src_reg src1,
+                        uint32_t condition);
+   vec4_instruction *IF(src_reg src0, src_reg src1, uint32_t condition);
+   vec4_instruction *IF(uint32_t predicate);
+
    bool try_rewrite_rhs_to_dst(ir_assignment *ir,
                               dst_reg dst,
                               src_reg src,
index 4babc56bac4dd2511584775c3f99de305716daa1..d41c1e6039a5b914363fb96492705ccc18e66adf 100644 (file)
@@ -120,6 +120,76 @@ vec4_visitor::emit(enum opcode opcode)
    return emit(new(mem_ctx) vec4_instruction(this, opcode, dst_reg()));
 }
 
+#define ALU1(op)                                                       \
+   vec4_instruction *                                                  \
+   vec4_visitor::op(dst_reg dst, src_reg src0)                         \
+   {                                                                   \
+      return new(mem_ctx) vec4_instruction(this, BRW_OPCODE_##op, dst, \
+                                          src0);                       \
+   }
+
+#define ALU2(op)                                                       \
+   vec4_instruction *                                                  \
+   vec4_visitor::op(dst_reg dst, src_reg src0, src_reg src1)           \
+   {                                                                   \
+      return new(mem_ctx) vec4_instruction(this, BRW_OPCODE_##op, dst, \
+                                          src0, src1);                 \
+   }
+
+ALU1(NOT)
+ALU1(MOV)
+ALU1(FRC)
+ALU1(RNDD)
+ALU1(RNDE)
+ALU1(RNDZ)
+ALU2(ADD)
+ALU2(MUL)
+ALU2(MACH)
+ALU2(AND)
+ALU2(OR)
+ALU2(XOR)
+ALU2(DP3)
+ALU2(DP4)
+
+/** Gen4 predicated IF. */
+vec4_instruction *
+vec4_visitor::IF(uint32_t predicate)
+{
+   vec4_instruction *inst;
+
+   inst = new(mem_ctx) vec4_instruction(this, BRW_OPCODE_IF);
+   inst->predicate = predicate;
+
+   return inst;
+}
+
+/** Gen6+ IF with embedded comparison. */
+vec4_instruction *
+vec4_visitor::IF(src_reg src0, src_reg src1, uint32_t condition)
+{
+   assert(intel->gen >= 6);
+
+   vec4_instruction *inst;
+
+   inst = new(mem_ctx) vec4_instruction(this, BRW_OPCODE_IF, dst_null_d(),
+                                       src0, src1);
+   inst->conditional_mod = condition;
+
+   return inst;
+}
+
+vec4_instruction *
+vec4_visitor::CMP(dst_reg dst, src_reg src0, src_reg src1, uint32_t condition)
+{
+   vec4_instruction *inst;
+
+   inst = new(mem_ctx) vec4_instruction(this, BRW_OPCODE_CMP, dst,
+                                       src0, src1, src_reg());
+   inst->conditional_mod = condition;
+
+   return inst;
+}
+
 void
 vec4_visitor::emit_dp(dst_reg dst, src_reg src0, src_reg src1, unsigned elements)
 {