/*
 * Mesa 3-D graphics library
 * Version:  6.5.3
 *
 * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

/**
 * \file slang_ir.h
 * Mesa GLSL Intermediate Representation tree types and constants.
 * \author Brian Paul
 */


#ifndef SLANG_IR_H
#define SLANG_IR_H


#include "main/imports.h"
#include "slang_compile.h"
#include "slang_label.h"
#include "main/mtypes.h"


/**
 * Intermediate Representation opcodes
 */
typedef enum
{
   IR_NOP = 0,
   IR_SEQ,     /* sequence (eval left, then right) */
   IR_SCOPE,   /* new variable scope (one child) */

   IR_LABEL,   /* target of a jump or cjump */

   IR_COND,    /* conditional expression/predicate */

   IR_IF,      /* high-level IF/then/else */
               /* Children[0] = conditional expression */
               /* Children[1] = if-true part */
               /* Children[2] = if-else part, or NULL */

   IR_BEGIN_SUB, /* begin subroutine */
   IR_END_SUB,   /* end subroutine */
   IR_RETURN,    /* return from subroutine */
   IR_CALL,      /* call subroutine */

   IR_LOOP,      /* high-level loop-begin / loop-end */
                 /* Children[0] = loop body */
                 /* Children[1] = loop tail code, or NULL */

   IR_CONT,      /* continue loop */
                 /* n->Parent = ptr to parent IR_LOOP Node */
   IR_BREAK,     /* break loop */

   IR_BREAK_IF_TRUE, /**< Children[0] = the condition expression */
   IR_CONT_IF_TRUE,

   IR_COPY,       /**< assignment/copy */
   IR_MOVE,       /**< assembly MOV instruction */

   /* vector ops: */
   IR_ADD,        /**< assembly ADD instruction */
   IR_SUB,
   IR_MUL,
   IR_DIV,
   IR_DOT4,
   IR_DOT3,
   IR_CROSS,   /* vec3 cross product */
   IR_LRP,
   IR_CLAMP,
   IR_MIN,
   IR_MAX,
   IR_SEQUAL,  /* Set if args are equal (vector) */
   IR_SNEQUAL, /* Set if args are not equal (vector) */
   IR_SGE,     /* Set if greater or equal (vector) */
   IR_SGT,     /* Set if greater than (vector) */
   IR_SLE,     /* Set if less or equal (vector) */
   IR_SLT,     /* Set if less than (vector) */
   IR_POW,     /* x^y */
   IR_EXP,     /* e^x */
   IR_EXP2,    /* 2^x */
   IR_LOG2,    /* log base 2 */
   IR_RSQ,     /* 1/sqrt() */
   IR_RCP,     /* reciprocol */
   IR_FLOOR,
   IR_FRAC,
   IR_ABS,     /* absolute value */
   IR_NEG,     /* negate */
   IR_DDX,     /* derivative w.r.t. X */
   IR_DDY,     /* derivative w.r.t. Y */
   IR_SIN,     /* sine */
   IR_COS,     /* cosine */
   IR_NOISE1,  /* noise(x) */
   IR_NOISE2,  /* noise(x, y) */
   IR_NOISE3,  /* noise(x, y, z) */
   IR_NOISE4,  /* noise(x, y, z, w) */

   IR_EQUAL,   /* boolean equality */
   IR_NOTEQUAL,/* boolean inequality */
   IR_NOT,     /* boolean not */

   IR_VAR,     /* variable reference */
   IR_VAR_DECL,/* var declaration */

   IR_ELEMENT, /* array element */
   IR_FIELD,   /* struct field */
   IR_SWIZZLE, /* swizzled storage access */

   IR_TEX,     /* texture lookup */
   IR_TEXB,    /* texture lookup with LOD bias */
   IR_TEXP,    /* texture lookup with projection */

   IR_FLOAT,
   IR_I_TO_F,  /* int[4] to float[4] conversion */
   IR_F_TO_I,  /* float[4] to int[4] conversion */

   IR_KILL     /* fragment kill/discard */
} slang_ir_opcode;


/**
 * Describes where data storage is allocated.
 */
struct _slang_ir_storage
{
   enum register_file File;  /**< PROGRAM_TEMPORARY, PROGRAM_INPUT, etc */
   GLint Index;  /**< -1 means unallocated */
   GLint Size;  /**< number of floats */
   GLuint Swizzle;
   GLint RefCount; /**< Used during IR tree delete */
   GLboolean RelAddr;

   /** If Parent is non-null, Index is relative to parent.
    * The other fields are ignored.
    */
   struct _slang_ir_storage *Parent;
};

typedef struct _slang_ir_storage slang_ir_storage;


/**
 * Intermediate Representation (IR) tree node
 * Basically a binary tree, but IR_LRP and IR_CLAMP have three children.
 */
typedef struct slang_ir_node_
{
   slang_ir_opcode Opcode;
   struct slang_ir_node_ *Children[3];
   slang_ir_storage *Store;  /**< location of result of this operation */
   GLint InstLocation;  /**< Location of instruction emitted for this node */

   /** special fields depending on Opcode: */
   const char *Field;  /**< If Opcode == IR_FIELD */
   GLuint Writemask;  /**< If Opcode == IR_MOVE */
   GLfloat Value[4];    /**< If Opcode == IR_FLOAT */
   slang_variable *Var;  /**< If Opcode == IR_VAR or IR_VAR_DECL */
   struct slang_ir_node_ *List;  /**< For various linked lists */
   struct slang_ir_node_ *Parent;  /**< Pointer to logical parent (ie. loop) */
   slang_label *Label;  /**< Used for branches */
} slang_ir_node;



/**
 * Assembly and IR info
 */
typedef struct
{
   slang_ir_opcode IrOpcode;
   const char *IrName;
   gl_inst_opcode InstOpcode;
   GLuint ResultSize, NumParams;
} slang_ir_info;



extern const slang_ir_info *
_slang_ir_info(slang_ir_opcode opcode);


extern slang_ir_storage *
_slang_new_ir_storage(enum register_file file, GLint index, GLint size);


extern slang_ir_storage *
_slang_new_ir_storage_swz(enum register_file file, GLint index, GLint size,
                          GLuint swizzle);

extern slang_ir_storage *
_slang_new_ir_storage_relative(GLint index, GLint size,
                               slang_ir_storage *parent);



extern void
_slang_free_ir_tree(slang_ir_node *n);


extern void
_slang_print_ir_tree(const slang_ir_node *n, int indent);


#endif /* SLANG_IR_H */
