diff options
| author | Eric Anholt <eric@anholt.net> | 2010-10-11 13:19:47 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-10-11 15:26:58 -0700 | 
| commit | 25cf241540007088936a6df16c849441087f722c (patch) | |
| tree | 476f1a1ba55251445e13d9e5684c8eb434d150ff /src/mesa | |
| parent | 41c2079855cde03470d811a637e9abf1b5a3763f (diff) | |
i965: Don't consider gen6 math instructions to write to MRFs.
This was leftover from the pre-gen6 cleanups.  One tests regresses
where compute-to-MRF now occurs.
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 55 | 
1 files changed, 38 insertions, 17 deletions
| diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 645145d3af..0f1f4fa26e 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -532,8 +532,10 @@ fs_visitor::emit_math(fs_opcodes opcode, fs_reg dst, fs_reg src)     }     fs_inst *inst = emit(fs_inst(opcode, dst, src)); -   inst->base_mrf = 2; -   inst->mlen = 1; +   if (intel->gen < 6) { +      inst->base_mrf = 2; +      inst->mlen = 1; +   }     return inst;  } @@ -541,13 +543,20 @@ fs_visitor::emit_math(fs_opcodes opcode, fs_reg dst, fs_reg src)  fs_inst *  fs_visitor::emit_math(fs_opcodes opcode, fs_reg dst, fs_reg src0, fs_reg src1)  { -   assert(opcode == FS_OPCODE_POW); +   int base_mrf = 2; +   fs_inst *inst; -   fs_inst *inst = emit(fs_inst(opcode, dst, src0, src1)); +   assert(opcode == FS_OPCODE_POW); -   inst->base_mrf = 2; -   inst->mlen = 2; +   if (intel->gen >= 6) { +      inst = emit(fs_inst(opcode, dst, src0, src1)); +   } else { +      emit(fs_inst(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + 1), src1)); +      inst = emit(fs_inst(opcode, dst, src0, reg_null)); +      inst->base_mrf = base_mrf; +      inst->mlen = 2; +   }     return inst;  } @@ -1757,19 +1766,31 @@ fs_visitor::generate_math(fs_inst *inst,        break;     } -   assert(inst->mlen >= 1); +   if (intel->gen >= 6) { +      assert(inst->mlen == 0); -   if (inst->opcode == FS_OPCODE_POW) { -      brw_MOV(p, brw_message_reg(inst->base_mrf + 1), src[1]); -   } +      if (inst->opcode == FS_OPCODE_POW) { +	 brw_math2(p, dst, op, src[0], src[1]); +      } else { +	 brw_math(p, dst, +		  op, +		  inst->saturate ? BRW_MATH_SATURATE_SATURATE : +		  BRW_MATH_SATURATE_NONE, +		  0, src[0], +		  BRW_MATH_DATA_VECTOR, +		  BRW_MATH_PRECISION_FULL); +      } +   } else { +      assert(inst->mlen >= 1); -   brw_math(p, dst, -	    op, -	    inst->saturate ? BRW_MATH_SATURATE_SATURATE : -	    BRW_MATH_SATURATE_NONE, -	    inst->base_mrf, src[0], -	    BRW_MATH_DATA_VECTOR, -	    BRW_MATH_PRECISION_FULL); +      brw_math(p, dst, +	       op, +	       inst->saturate ? BRW_MATH_SATURATE_SATURATE : +	       BRW_MATH_SATURATE_NONE, +	       inst->base_mrf, src[0], +	       BRW_MATH_DATA_VECTOR, +	       BRW_MATH_PRECISION_FULL); +   }  }  void | 
