r600: Correct IDIV if DST and SRC use the same temporary
authorGert Wollny <gw.fossdev@gmail.com>
Sat, 26 May 2018 16:48:31 +0000 (18:48 +0200)
committerDave Airlie <airlied@redhat.com>
Mon, 28 May 2018 01:57:46 +0000 (02:57 +0100)
commit42cd2810aa30dfd825d46a305134fbc8f239247c
tree4c239145f80d0bb759cb9adf52bc33332a47fd5d
parent58fb613a51994d111ee77a65bc7f3d60b155c687
r600: Correct IDIV if DST and SRC use the same temporary

In cases like

  IDIV TEMP[0].xy TEMP[0].xx TEMP[1].yy

the result will be written to the same register that is also a source register.
Since the components are evaluated one by one, this may result in overwriting
the source value for a later operation. Work around this by adding another
temporary to store the result if the destination temporary index is equal to
one of the source temporary indices.

Fixes:
  dEQP-GLES2.functional.shaders.operator.binary_operator.div.*
Signed-off-by: Gert Wollny <gw.fossdev@gmail.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c