ilo: remove our own type inference
authorChia-I Wu <olvaffe@gmail.com>
Wed, 8 May 2013 03:32:22 +0000 (11:32 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 8 May 2013 03:33:34 +0000 (11:33 +0800)
tgsi_opcode_infer_{src,dst}_type() works just fine.

src/gallium/drivers/ilo/shader/toy_tgsi.c

index 046c64628a78bbc3d823c365b28579b1888049e7..f697d1d2ae5607d2ca30f41959f443f21648022c 100644 (file)
@@ -162,7 +162,7 @@ aos_simple(struct toy_compiler *tc,
    case TGSI_OPCODE_UIF:
       cond_modifier = BRW_CONDITIONAL_NEQ;
       num_src = 2;
-      assert(src[0].type == TOY_TYPE_D);
+      assert(src[0].type == TOY_TYPE_UD);
       src[0] = tsrc_swizzle1(src[0], TOY_SWIZZLE_X);
       src[1] = tsrc_imm_d(0);
       break;
@@ -1682,105 +1682,27 @@ ra_src_dimension(const struct tgsi_full_src_register *s)
 static enum toy_type
 ra_infer_opcode_type(int tgsi_opcode, bool is_dst)
 {
-   enum toy_type type;
-
-   if (is_dst) {
-      bool type_valid = false;
-
-      switch (tgsi_opcode) {
-      case TGSI_OPCODE_I2F:
-      case TGSI_OPCODE_U2F:
-      case TGSI_OPCODE_TXF:
-      case TGSI_OPCODE_TXQ:
-      case TGSI_OPCODE_TXQ_LZ:
-      case TGSI_OPCODE_SAMPLE_I:
-      case TGSI_OPCODE_SAMPLE_I_MS:
-      case TGSI_OPCODE_SAMPLE_POS:
-         type = TOY_TYPE_F;
-         type_valid = true;
-         break;
-      case TGSI_OPCODE_ARL:
-      case TGSI_OPCODE_ARR:
-      case TGSI_OPCODE_F2I:
-         type = TOY_TYPE_D;
-         type_valid = true;
-         break;
-      case TGSI_OPCODE_F2U:
-         type = TOY_TYPE_UD;
-         type_valid = true;
-         break;
-      default:
-         break;
-      }
+   enum tgsi_opcode_type type;
 
-      if (type_valid)
-         return type;
-   }
-
-   switch (tgsi_opcode) {
-   case TGSI_OPCODE_UIF:
-   case TGSI_OPCODE_I2F:
-   case TGSI_OPCODE_NOT:
-   case TGSI_OPCODE_AND:
-   case TGSI_OPCODE_OR:
-   case TGSI_OPCODE_MOD:
-   case TGSI_OPCODE_XOR:
-   case TGSI_OPCODE_SAD: /* why? */
-   case TGSI_OPCODE_TXF:
-   case TGSI_OPCODE_TXQ:
-   case TGSI_OPCODE_TXQ_LZ:
-   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_UARL: /* why? */
-   case TGSI_OPCODE_IABS:
-   case TGSI_OPCODE_ISSG:
-   case TGSI_OPCODE_ATOMXCHG:
-   case TGSI_OPCODE_ATOMCAS:
-   case TGSI_OPCODE_ATOMAND:
-   case TGSI_OPCODE_ATOMOR:
-   case TGSI_OPCODE_ATOMXOR:
-   case TGSI_OPCODE_ATOMIMIN:
-   case TGSI_OPCODE_ATOMIMAX:
-      type = TOY_TYPE_D;
-      break;
-   case TGSI_OPCODE_SHL:
-   case TGSI_OPCODE_U2F:
-   case TGSI_OPCODE_UADD:
-   case TGSI_OPCODE_UDIV:
-   case TGSI_OPCODE_UMAD:
-   case TGSI_OPCODE_UMAX:
-   case TGSI_OPCODE_UMIN:
-   case TGSI_OPCODE_UMOD:
-   case TGSI_OPCODE_UMUL:
-   case TGSI_OPCODE_USEQ:
-   case TGSI_OPCODE_USGE:
-   case TGSI_OPCODE_USHR:
-   case TGSI_OPCODE_USLT:
-   case TGSI_OPCODE_USNE:
-   case TGSI_OPCODE_SAMPLE_I:
-   case TGSI_OPCODE_SAMPLE_I_MS:
-   case TGSI_OPCODE_SVIEWINFO:
-   case TGSI_OPCODE_SAMPLE_POS:
-   case TGSI_OPCODE_SAMPLE_INFO:
-   case TGSI_OPCODE_UCMP:
-   case TGSI_OPCODE_LOAD:
-   case TGSI_OPCODE_STORE:
-   case TGSI_OPCODE_ATOMUADD:
-   case TGSI_OPCODE_ATOMUMIN:
-   case TGSI_OPCODE_ATOMUMAX:
-      type = TOY_TYPE_UD;
-      break;
+   if (is_dst)
+      type = tgsi_opcode_infer_dst_type(tgsi_opcode);
+   else
+      type = tgsi_opcode_infer_src_type(tgsi_opcode);
+
+   switch (type) {
+   case TGSI_TYPE_UNSIGNED:
+      return TOY_TYPE_UD;
+   case TGSI_TYPE_SIGNED:
+      return TOY_TYPE_D;
+   case TGSI_TYPE_FLOAT:
+      return TOY_TYPE_F;
+   case TGSI_TYPE_UNTYPED:
+   case TGSI_TYPE_VOID:
+   case TGSI_TYPE_DOUBLE:
    default:
-      type = TOY_TYPE_F;
-      break;
+      assert(!"unsupported TGSI type");
+      return TOY_TYPE_UD;
    }
-
-   return type;
 }
 
 /**
@@ -1814,6 +1736,14 @@ ra_get_type(struct toy_tgsi *tgsi, const struct tgsi_full_instruction *tgsi_inst
 
       return type;
    }
+   else if (tgsi_inst->Instruction.Opcode == TGSI_OPCODE_UCMP) {
+      if (!is_dst && operand == 0)
+         type = TOY_TYPE_UD;
+      else
+         type = TOY_TYPE_F;
+
+      return type;
+   }
 
    type = ra_infer_opcode_type(tgsi_inst->Instruction.Opcode, is_dst);