tgsi: add source/destination type from opcodes. (v2)
authorDave Airlie <airlied@redhat.com>
Tue, 24 Jan 2012 11:55:14 +0000 (11:55 +0000)
committerDave Airlie <airlied@redhat.com>
Fri, 17 Feb 2012 17:39:01 +0000 (17:39 +0000)
These two functions produce the src/dst types for an opcode.

MOV is special since it can be used to mov float->float and int->int,
so just return VOID.

v2: use a new enum for the opcode type as per Jose's suggestion.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/tgsi/tgsi_info.c
src/gallium/auxiliary/tgsi/tgsi_info.h

index 2407448..a44f48c 100644 (file)
@@ -243,3 +243,100 @@ tgsi_get_processor_name( uint processor )
       return "unknown shader type!";
    }
 }
+
+/*
+ * infer the source type of a TGSI opcode.
+ * MOV is special so return VOID
+ */
+enum tgsi_opcode_type
+tgsi_opcode_infer_src_type( uint opcode )
+{
+   switch (opcode) {
+   case TGSI_OPCODE_MOV:
+      return TGSI_TYPE_UNTYPED;
+   case TGSI_OPCODE_AND:
+   case TGSI_OPCODE_OR:
+   case TGSI_OPCODE_XOR:
+   case TGSI_OPCODE_SAD:
+   case TGSI_OPCODE_U2F:
+   case TGSI_OPCODE_UADD:
+   case TGSI_OPCODE_UDIV:
+   case TGSI_OPCODE_UMOD:
+   case TGSI_OPCODE_UMAD:
+   case TGSI_OPCODE_UMUL:
+   case TGSI_OPCODE_UMAX:
+   case TGSI_OPCODE_UMIN:
+   case TGSI_OPCODE_USEQ:
+   case TGSI_OPCODE_USGE:
+   case TGSI_OPCODE_USLT:
+   case TGSI_OPCODE_USNE:
+   case TGSI_OPCODE_USHR:
+   case TGSI_OPCODE_SHL:
+   case TGSI_OPCODE_TXQ:
+      return TGSI_TYPE_UNSIGNED;
+   case TGSI_OPCODE_MOD:
+   case TGSI_OPCODE_I2F:
+   case TGSI_OPCODE_IDIV:
+   case TGSI_OPCODE_IMAX:
+   case TGSI_OPCODE_IMIN:
+   case TGSI_OPCODE_INEG:
+   case TGSI_OPCODE_ISGE:
+   case TGSI_OPCODE_ISHR:
+   case TGSI_OPCODE_ISLT:
+   case TGSI_OPCODE_IABS:
+   case TGSI_OPCODE_ISSG:
+   case TGSI_OPCODE_UARL:
+      return TGSI_TYPE_SIGNED;
+   default:
+      return TGSI_TYPE_FLOAT;
+   }
+}
+
+/*
+ * infer the destination type of a TGSI opcode.
+ * MOV is special so return VOID
+ */
+enum tgsi_opcode_type
+tgsi_opcode_infer_dst_type( uint opcode )
+{
+   switch (opcode) {
+   case TGSI_OPCODE_MOV:
+      return TGSI_TYPE_UNTYPED;
+   case TGSI_OPCODE_F2U:
+   case TGSI_OPCODE_AND:
+   case TGSI_OPCODE_OR:
+   case TGSI_OPCODE_XOR:
+   case TGSI_OPCODE_SAD:
+   case TGSI_OPCODE_UADD:
+   case TGSI_OPCODE_UDIV:
+   case TGSI_OPCODE_UMOD:
+   case TGSI_OPCODE_UMAD:
+   case TGSI_OPCODE_UMUL:
+   case TGSI_OPCODE_UMAX:
+   case TGSI_OPCODE_UMIN:
+   case TGSI_OPCODE_USEQ:
+   case TGSI_OPCODE_USGE:
+   case TGSI_OPCODE_USLT:
+   case TGSI_OPCODE_USNE:
+   case TGSI_OPCODE_USHR:
+   case TGSI_OPCODE_SHL:
+   case TGSI_OPCODE_TXQ:
+      return TGSI_TYPE_UNSIGNED;
+   case TGSI_OPCODE_F2I:
+   case TGSI_OPCODE_IDIV:
+   case TGSI_OPCODE_IMAX:
+   case TGSI_OPCODE_IMIN:
+   case TGSI_OPCODE_INEG:
+   case TGSI_OPCODE_ISGE:
+   case TGSI_OPCODE_ISHR:
+   case TGSI_OPCODE_ISLT:
+   case TGSI_OPCODE_MOD:
+   case TGSI_OPCODE_UARL:
+   case TGSI_OPCODE_ARL:
+   case TGSI_OPCODE_IABS:
+   case TGSI_OPCODE_ISSG:
+      return TGSI_TYPE_SIGNED;
+   default:
+      return TGSI_TYPE_FLOAT;
+   }
+}
index c0427fb..5414916 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "pipe/p_compiler.h"
 #include "pipe/p_shader_tokens.h"
+#include "util/u_format.h"
 
 #if defined __cplusplus
 extern "C" {
@@ -90,6 +91,20 @@ tgsi_get_opcode_name( uint opcode );
 const char *
 tgsi_get_processor_name( uint processor );
 
+enum tgsi_opcode_type {
+   TGSI_TYPE_UNTYPED, /* for MOV */
+   TGSI_TYPE_VOID,
+   TGSI_TYPE_UNSIGNED,
+   TGSI_TYPE_SIGNED,
+   TGSI_TYPE_FLOAT,
+   TGSI_TYPE_DOUBLE,
+};
+
+enum tgsi_opcode_type
+tgsi_opcode_infer_src_type( uint opcode );
+
+enum tgsi_opcode_type
+tgsi_opcode_infer_dst_type( uint opcode );
 
 #if defined __cplusplus
 }