diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_parse.c b/src/gallium/auxiliary/tgsi/util/tgsi_parse.c
index c3526cb..1bb15b1 100644
--- a/src/gallium/auxiliary/tgsi/util/tgsi_parse.c
+++ b/src/gallium/auxiliary/tgsi/util/tgsi_parse.c
@@ -42,9 +42,6 @@ void
 tgsi_full_token_free(
    union tgsi_full_token *full_token )
 {
-   if( full_token->Token.Type == TGSI_TOKEN_TYPE_IMMEDIATE ) {
-      FREE( full_token->FullImmediate.u.Pointer );
-   }
 }
 
 unsigned
@@ -98,6 +95,17 @@ next_token(
    *(struct tgsi_token *) token = ctx->Tokens[ctx->Position++];
 }
 
+
+static void
+skip_token(
+   struct tgsi_parse_context *ctx )
+{
+   assert( !tgsi_parse_end_of_tokens( ctx ) );
+
+   ctx->Tokens[ctx->Position++];
+}
+
+
 void
 tgsi_parse_token(
    struct tgsi_parse_context *ctx )
@@ -153,10 +161,9 @@ tgsi_parse_token(
 
       switch (imm->Immediate.DataType) {
       case TGSI_IMM_FLOAT32:
-         imm->u.Pointer = MALLOC(
-            sizeof( struct tgsi_immediate_float32 ) * (imm->Immediate.Size - 1) );
+         imm->u.Pointer = (const void *)ctx->Tokens;
          for( i = 0; i < imm->Immediate.Size - 1; i++ ) {
-            next_token( ctx, &imm->u.ImmediateFloat32[i] );
+            skip_token( ctx );
          }
          break;
 
