tgsi: Fix parsing an instruction with no operands.
authorMichal Krol <michal@tungstengraphics.com>
Thu, 17 Jul 2008 18:40:13 +0000 (20:40 +0200)
committerMichal Krol <michal@tungstengraphics.com>
Thu, 17 Jul 2008 18:40:13 +0000 (20:40 +0200)
src/gallium/auxiliary/tgsi/util/tgsi_text.c

index 803f7a23b8e218f0d9d72c57c314b9533f59b590..9ed0f52fc7c0abcd8d56de457b8e51b37258dc7a 100644 (file)
@@ -758,13 +758,20 @@ parse_instruction(
    for (i = 0; i < TGSI_OPCODE_LAST; i++) {
       const char *cur = ctx->cur;
 
-      if (str_match_no_case( &cur, opcode_info[i].mnemonic )) {
+      info = &opcode_info[i];
+      if (str_match_no_case( &cur, info->mnemonic )) {
          if (str_match_no_case( &cur, "_SATNV" ))
             saturate = TGSI_SAT_MINUS_PLUS_ONE;
          else if (str_match_no_case( &cur, "_SAT" ))
             saturate = TGSI_SAT_ZERO_ONE;
 
-         if (*cur == '\0' || eat_white( &cur )) {
+         if (info->num_dst + info->num_src + info->is_tex == 0) {
+            if (!is_digit_alpha_underscore( cur )) {
+               ctx->cur = cur;
+               break;
+            }
+         }
+         else if (*cur == '\0' || eat_white( &cur )) {
             ctx->cur = cur;
             break;
          }
@@ -777,7 +784,6 @@ parse_instruction(
          report_error( ctx, "Expected `DCL', `IMM' or a label" );
       return FALSE;
    }
-   info = &opcode_info[i];
 
    inst = tgsi_default_full_instruction();
    inst.Instruction.Opcode = i;
@@ -1031,6 +1037,9 @@ static boolean translate( struct translate_ctx *ctx )
          return FALSE;
       }
 
+      if (*ctx->cur == '\0')
+         break;
+
       if (parse_label( ctx, &label_val )) {
          if (!parse_instruction( ctx, TRUE ))
             return FALSE;