The patches implement gallium opcodes ddiv, dmul, dmax, dmin, dslt,
dsge, dseq, drcp, dqsrt and dmad and add tests to it.
They are applicable in gallium-double-opcode  branch.
The next patchs i will add documentation and missing double opcodes
implementation like dfrac, dldexp and dfracexp.

Igor
From 0762c16db13543aa79c77c1c8ebbcfdc581fc8b1 Mon Sep 17 00:00:00 2001
From: Igor Oliveira <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 13:54:19 -0400
Subject: [PATCH 1/6] gallium: add double opcodes ddiv, dmul, dmax, dmin, dslt, dsge, dseq, drcp and dqsrt

---
 src/gallium/include/pipe/p_shader_tokens.h |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 5975146..ccfe41c 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -323,7 +323,16 @@ struct tgsi_property_data {
 #define TGSI_OPCODE_D2F                 146
 #define TGSI_OPCODE_DMOV                147
 #define TGSI_OPCODE_DADD                148
-#define TGSI_OPCODE_LAST                149
+#define TGSI_OPCODE_DDIV                149
+#define TGSI_OPCODE_DMUL                150
+#define TGSI_OPCODE_DMAX                151
+#define TGSI_OPCODE_DMIN                152
+#define TGSI_OPCODE_DSLT                153
+#define TGSI_OPCODE_DSGE                154
+#define TGSI_OPCODE_DSEQ                155
+#define TGSI_OPCODE_DRCP                156
+#define TGSI_OPCODE_DSQRT               157
+#define TGSI_OPCODE_LAST                158
 
 #define TGSI_SAT_NONE            0  /* do not saturate */
 #define TGSI_SAT_ZERO_ONE        1  /* clamp to [0,1] */
-- 
1.6.3.3

From 1139cb4c0cdfa7e8b1a1af7e6876f8f4ed3098df Mon Sep 17 00:00:00 2001
From: Igor Olivera <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 13:56:58 -0400
Subject: [PATCH 2/6] tgsi: implement double opcodes

---
 src/gallium/auxiliary/tgsi/tgsi_exec.c |  127 ++++++++++++++++++++++++++++++++
 src/gallium/auxiliary/tgsi/tgsi_info.c |   11 +++-
 2 files changed, 137 insertions(+), 1 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index b9ea761..c66c41a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -180,6 +180,96 @@ micro_dmov(union tgsi_double_channel *dst,
 }
 
 static void
+micro_ddiv(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0]/src[1].d[0];
+   dst->d[1] = src[0].d[1]/src[1].d[1];
+   dst->d[2] = src[0].d[2]/src[1].d[2];
+   dst->d[3] = src[0].d[3]/src[1].d[3];
+}
+
+static void
+micro_dmul(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0]*src[1].d[0];
+   dst->d[1] = src[0].d[1]*src[1].d[1];
+   dst->d[2] = src[0].d[2]*src[1].d[2];
+   dst->d[3] = src[0].d[3]*src[1].d[3];
+}
+
+static void
+micro_dmax(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] > src[1].d[0] ? src[0].d[0] : src[1].d[0];
+   dst->d[1] = src[0].d[1] > src[1].d[1] ? src[0].d[1] : src[1].d[1];
+   dst->d[2] = src[0].d[2] > src[1].d[2] ? src[0].d[2] : src[1].d[2];
+   dst->d[3] = src[0].d[3] > src[1].d[3] ? src[0].d[3] : src[1].d[3];
+}
+
+static void
+micro_dmin(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] < src[1].d[0] ? src[0].d[0] : src[1].d[0];
+   dst->d[1] = src[0].d[1] < src[1].d[1] ? src[0].d[1] : src[1].d[1];
+   dst->d[2] = src[0].d[2] < src[1].d[2] ? src[0].d[2] : src[1].d[2];
+   dst->d[3] = src[0].d[3] < src[1].d[3] ? src[0].d[3] : src[1].d[3];
+}
+
+static void
+micro_dslt(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] < src[1].d[0] ? 1.0F : 0.0F;
+   dst->d[1] = src[0].d[1] < src[1].d[1] ? 1.0F : 0.0F;
+   dst->d[2] = src[0].d[2] < src[1].d[2] ? 1.0F : 0.0F;
+   dst->d[3] = src[0].d[3] < src[1].d[3] ? 1.0F : 0.0F;
+}
+
+static void
+micro_dsge(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] >= src[1].d[0] ? 1.0F : 0.0F;
+   dst->d[1] = src[0].d[1] >= src[1].d[1] ? 1.0F : 0.0F;
+   dst->d[2] = src[0].d[2] >= src[1].d[2] ? 1.0F : 0.0F;
+   dst->d[3] = src[0].d[3] >= src[1].d[3] ? 1.0F : 0.0F;
+}
+
+static void
+micro_dseq(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] == src[1].d[0] ? 1.0F : 0.0F;
+   dst->d[1] = src[0].d[1] == src[1].d[1] ? 1.0F : 0.0F;
+   dst->d[2] = src[0].d[2] == src[1].d[2] ? 1.0F : 0.0F;
+   dst->d[3] = src[0].d[3] == src[1].d[3] ? 1.0F : 0.0F;
+}
+
+static void
+micro_drcp(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = 1.0F/src->d[0];
+   dst->d[1] = 1.0F/src->d[1];
+   dst->d[2] = 1.0F/src->d[2];
+   dst->d[3] = 1.0F/src->d[3];
+}
+
+static void
+micro_dsqrt(union tgsi_double_channel *dst,
+            const union tgsi_double_channel *src)
+{
+   dst->d[0] = sqrt(src->d[0]);
+   dst->d[1] = sqrt(src->d[1]);
+   dst->d[2] = sqrt(src->d[2]);
+   dst->d[3] = sqrt(src->d[3]);
+}
+
+static void
 micro_exp2(union tgsi_exec_channel *dst,
            const union tgsi_exec_channel *src)
 {
@@ -3729,7 +3819,44 @@ exec_instruction(
       exec_double_binary(mach, inst, micro_dadd);
       break;
 
+   case TGSI_OPCODE_DDIV:
+      exec_double_binary(mach, inst, micro_ddiv);
+      break;
+
+   case TGSI_OPCODE_DMUL:
+      exec_double_binary(mach, inst, micro_dmul);
+      break;
+
+   case TGSI_OPCODE_DMAX:
+      exec_double_binary(mach, inst, micro_dmax);
+      break;
+
+   case TGSI_OPCODE_DMIN:
+      exec_double_binary(mach, inst, micro_dmin);
+      break;
+
+   case TGSI_OPCODE_DSLT:
+      exec_double_binary(mach, inst, micro_dslt);
+      break;
+
+   case TGSI_OPCODE_DSGE:
+      exec_double_binary(mach, inst, micro_dsge);
+      break;
+
+   case TGSI_OPCODE_DSEQ:
+      exec_double_binary(mach, inst, micro_dseq);
+      break;
+
+   case TGSI_OPCODE_DRCP:
+      exec_double_unary(mach, inst, micro_drcp);
+      break;
+
+   case TGSI_OPCODE_DSQRT:
+      exec_double_unary(mach, inst, micro_dsqrt);
+      break;
+
    default:
+      printf("%d", inst->Instruction.Opcode);
       assert( 0 );
    }
 }
diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c
index c02b29c..6403e61 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_info.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
@@ -179,7 +179,16 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
    { 1, 1, 0, 0, 0, 0, "F2D", TGSI_OPCODE_F2D },
    { 1, 1, 0, 0, 0, 0, "D2F", TGSI_OPCODE_D2F },
    { 1, 1, 0, 0, 0, 0, "DMOV", TGSI_OPCODE_DMOV },
-   { 1, 2, 0, 0, 0, 0, "DADD", TGSI_OPCODE_DADD }
+   { 1, 2, 0, 0, 0, 0, "DADD", TGSI_OPCODE_DADD },
+   { 1, 2, 0, 0, 0, 0, "DDIV", TGSI_OPCODE_DDIV },
+   { 1, 2, 0, 0, 0, 0, "DMUL", TGSI_OPCODE_DMUL },
+   { 1, 2, 0, 0, 0, 0, "DMAX", TGSI_OPCODE_DMAX },
+   { 1, 2, 0, 0, 0, 0, "DMIN", TGSI_OPCODE_DMIN },
+   { 1, 2, 0, 0, 0, 0, "DSLT", TGSI_OPCODE_DSLT },
+   { 1, 2, 0, 0, 0, 0, "DSGE", TGSI_OPCODE_DSGE },
+   { 1, 2, 0, 0, 0, 0, "DSEQ", TGSI_OPCODE_DSEQ },
+   { 1, 1, 0, 0, 0, 0, "DRCP", TGSI_OPCODE_DRCP },
+   { 1, 1, 0, 0 ,0, 0, "DSQRT", TGSI_OPCODE_DSQRT }
 };
 
 const struct tgsi_opcode_info *
-- 
1.6.3.3

From 31a58c492a419bc9e28370c643c417dd1920a4f9 Mon Sep 17 00:00:00 2001
From: Igor Oliveira <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 13:59:14 -0400
Subject: [PATCH 3/6] python state tracker: add double opcode tests

---
 .../tests/regress/fragment-shader/frag-ddiv.sh     |   20 +++++++++++++
 .../tests/regress/fragment-shader/frag-dmax.sh     |   25 ++++++++++++++++
 .../tests/regress/fragment-shader/frag-dmin.sh     |   25 ++++++++++++++++
 .../tests/regress/fragment-shader/frag-dmul.sh     |   15 ++++++++++
 .../tests/regress/fragment-shader/frag-dsge.sh     |   30 ++++++++++++++++++++
 .../tests/regress/fragment-shader/frag-dslt.sh     |   30 ++++++++++++++++++++
 .../tests/regress/fragment-shader/frag-dsqrt.sh    |   17 +++++++++++
 .../regress/fragment-shader/fragment-shader.py     |    7 ++++
 8 files changed, 169 insertions(+), 0 deletions(-)
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-ddiv.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmax.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmin.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmul.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsge.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dslt.sh
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsqrt.sh

diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-ddiv.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-ddiv.sh
new file mode 100644
index 0000000..7a28d53
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-ddiv.sh
@@ -0,0 +1,20 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..3]
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1],  IN[0].zwzw
+DMUL TEMP[0], TEMP[0], TEMP[1]
+DDIV TEMP[0], TEMP[0], TEMP[1]
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmax.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmax.sh
new file mode 100644
index 0000000..38c3128
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmax.sh
@@ -0,0 +1,25 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..5]
+
+IMM FLT32 { 0.4, 0.4, 0.4, 0.0 }
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+F2D TEMP[4], IMM[0]
+F2D TEMP[5], IMM[0].zwzw
+DMAX TEMP[0], TEMP[4], TEMP[0]
+DMAX TEMP[1], TEMP[5], TEMP[1]
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmin.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmin.sh
new file mode 100644
index 0000000..cdc8d02
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmin.sh
@@ -0,0 +1,25 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..5]
+
+IMM FLT32 { 0.6, 0.6, 0.6, 1.0 }
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+F2D TEMP[4], IMM[0]
+F2D TEMP[5], IMM[0].zwzw
+DMIN TEMP[0], TEMP[4], TEMP[0]
+DMIN TEMP[1], TEMP[5], TEMP[1]
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmul.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmul.sh
new file mode 100644
index 0000000..a2b8efe
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmul.sh
@@ -0,0 +1,15 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..1]
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+DMUL TEMP[0], TEMP[0], TEMP[0]
+DMUL TEMP[1], TEMP[1], TEMP[1]
+D2F OUT[0].xy, TEMP[0]
+D2F TEMP[1].xy, TEMP[1]
+MOV OUT[0].zw, TEMP[1].xyxy
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsge.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsge.sh
new file mode 100644
index 0000000..20bc436
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsge.sh
@@ -0,0 +1,30 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..5]
+
+IMM FLT32 { 0.6, 0.6, 0.6, 0.0 }
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+F2D TEMP[4], IMM[0]
+F2D TEMP[5], IMM[0].zwzw
+
+DSGE TEMP[4], TEMP[0], TEMP[4]
+DSGE TEMP[5], TEMP[1], TEMP[5]
+
+DMUL TEMP[0], TEMP[0], TEMP[4]
+DMUL TEMP[1], TEMP[1], TEMP[5]
+
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dslt.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dslt.sh
new file mode 100644
index 0000000..c96ab3e
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dslt.sh
@@ -0,0 +1,30 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..5]
+
+IMM FLT32 { 0.6, 0.6, 0.6, 0.0 }
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+F2D TEMP[4], IMM[0]
+F2D TEMP[5], IMM[0].zwzw
+
+DSLT TEMP[4], TEMP[0], TEMP[4]
+DSLT TEMP[5], TEMP[1], TEMP[5]
+
+DMUL TEMP[0], TEMP[0], TEMP[4]
+DMUL TEMP[1], TEMP[1], TEMP[5]
+
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsqrt.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsqrt.sh
new file mode 100644
index 0000000..e1c28c8
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dsqrt.sh
@@ -0,0 +1,17 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..1]
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+DMUL TEMP[0], TEMP[0], TEMP[0]
+DMUL TEMP[1], TEMP[1], TEMP[1]
+DSQRT TEMP[0], TEMP[0]
+DSQRT TEMP[1], TEMP[1]
+D2F OUT[0].xy, TEMP[0]
+D2F TEMP[1].xy, TEMP[1]
+MOV OUT[0].zw, TEMP[1].xyxy
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py b/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
index 9f3edc0..4372c4a 100644
--- a/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
@@ -186,6 +186,13 @@ def main():
         'add',
         'dadd',
         'dmov',
+        'ddiv',
+        'dmax',
+        'dmin',
+        'dmul',
+        'dsge',
+        'dslt',
+        'dsqrt',
         'dp3',
         'dp4',
         'dst',
-- 
1.6.3.3

From d7df936df6249afa0b83e125716bb2769963be79 Mon Sep 17 00:00:00 2001
From: Igor Oliveira <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 14:41:53 -0400
Subject: [PATCH 4/6] tgsi: add support to trinary opcodes

---
 src/gallium/auxiliary/tgsi/tgsi_exec.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index c66c41a..f3f50b2 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -2351,6 +2351,30 @@ exec_double_binary(struct tgsi_exec_machine *mach,
 }
 
 static void
+exec_double_trinary(struct tgsi_exec_machine *mach,
+                    const struct tgsi_full_instruction *inst,
+                    micro_dop op)
+{
+   union tgsi_double_channel src[3];
+   union tgsi_double_channel dst;
+
+   if ((inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY) == TGSI_WRITEMASK_XY) {
+      fetch_double_channel(mach, &src[0], &inst->Src[0], CHAN_X, CHAN_Y);
+      fetch_double_channel(mach, &src[1], &inst->Src[1], CHAN_X, CHAN_Y);
+      fetch_double_channel(mach, &src[2], &inst->Src[2], CHAN_X, CHAN_Y);
+      op(&dst, src);
+      store_double_channel(mach, &dst, &inst->Dst[0], inst, CHAN_X, CHAN_Y);
+   }
+   if ((inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_ZW) == TGSI_WRITEMASK_ZW) {
+      fetch_double_channel(mach, &src[0], &inst->Src[0], CHAN_Z, CHAN_W);
+      fetch_double_channel(mach, &src[1], &inst->Src[1], CHAN_Z, CHAN_W);
+      fetch_double_channel(mach, &src[2], &inst->Src[2], CHAN_Z, CHAN_W);
+      op(&dst, src);
+      store_double_channel(mach, &dst, &inst->Dst[0], inst, CHAN_Z, CHAN_W);
+   }
+}
+
+static void
 exec_f2d(struct tgsi_exec_machine *mach,
          const struct tgsi_full_instruction *inst)
 {
-- 
1.6.3.3

From c98e8519bf078f65553b2d4098910f905b0b7a86 Mon Sep 17 00:00:00 2001
From: Igor Oliveira <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 14:49:15 -0400
Subject: [PATCH 5/6] tgsi: implement DMAD trinary opcode

---
 src/gallium/auxiliary/tgsi/tgsi_exec.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index f3f50b2..e67a24d 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -270,6 +270,16 @@ micro_dsqrt(union tgsi_double_channel *dst,
 }
 
 static void
+micro_dmad(union tgsi_double_channel *dst,
+           const union tgsi_double_channel *src)
+{
+   dst->d[0] = src[0].d[0] * src[1].d[0] + src[2].d[0];
+   dst->d[1] = src[0].d[1] * src[1].d[1] + src[2].d[1];
+   dst->d[2] = src[0].d[2] * src[1].d[2] + src[2].d[2];
+   dst->d[3] = src[0].d[3] * src[1].d[3] + src[2].d[3];
+}
+
+static void
 micro_exp2(union tgsi_exec_channel *dst,
            const union tgsi_exec_channel *src)
 {
@@ -3879,6 +3889,10 @@ exec_instruction(
       exec_double_unary(mach, inst, micro_dsqrt);
       break;
 
+   case TGSI_OPCODE_DMAD:
+      exec_double_trinary(mach, inst, micro_dmad);
+      break;
+
    default:
       printf("%d", inst->Instruction.Opcode);
       assert( 0 );
-- 
1.6.3.3

From 1da4d2d04640df496b99bfbe5fe8a269b0c240e3 Mon Sep 17 00:00:00 2001
From: Igor Oliveira <igor.olive...@openbossa.org>
Date: Mon, 18 Jan 2010 14:49:59 -0400
Subject: [PATCH 6/6] python state tracker: add dmad test

---
 .../tests/regress/fragment-shader/frag-dmad.sh     |   30 ++++++++++++++++++++
 .../regress/fragment-shader/fragment-shader.py     |    1 +
 2 files changed, 31 insertions(+), 0 deletions(-)
 create mode 100644 src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmad.sh

diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmad.sh b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmad.sh
new file mode 100644
index 0000000..13e25ff
--- /dev/null
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/frag-dmad.sh
@@ -0,0 +1,30 @@
+FRAG
+
+DCL IN[0], COLOR, LINEAR
+DCL OUT[0], COLOR
+DCL TEMP[0..7]
+
+IMM FLT32 { 0.5, 0.4, 0.6, 1.0 }
+IMM FLT32 { 0.5, 0.4, 0.6, 0.0 }
+
+F2D TEMP[0], IN[0]
+F2D TEMP[1], IN[0].zwzw
+F2D TEMP[4], IMM[0]
+F2D TEMP[5], IMM[0].zwzw
+F2D TEMP[6], IMM[1]
+F2D TEMP[7], IMM[1].zwzw
+
+DMAD TEMP[0], TEMP[0], TEMP[4], TEMP[6]
+DMAD TEMP[1], TEMP[1], TEMP[5], TEMP[7]
+
+DMOV TEMP[2].zw, TEMP[0]
+DMOV TEMP[3].xy, TEMP[1].zwzw
+D2F OUT[0].x, TEMP[0]
+D2F OUT[0].y, TEMP[2]
+D2F TEMP[0].x, TEMP[1]
+D2F TEMP[1].x, TEMP[3]
+MOV OUT[0].z, TEMP[0].zzxz
+MOV OUT[0].w, TEMP[1].xxxx
+
+
+END
diff --git a/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py b/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
index 4372c4a..ee7e3ad 100644
--- a/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
+++ b/src/gallium/state_trackers/python/tests/regress/fragment-shader/fragment-shader.py
@@ -193,6 +193,7 @@ def main():
         'dsge',
         'dslt',
         'dsqrt',
+        'dmad',
         'dp3',
         'dp4',
         'dst',
-- 
1.6.3.3

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to