00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00027 
#ifndef ARBINST_HPP
00028 
#define ARBINST_HPP
00029 
00030 
#include "ShVariable.hpp"
00031 
00032 
namespace shgl {
00033 
00036 
enum ArbOp {
00037   
00038   
00039   
00040   SH_ARB_ABS,
00041   SH_ARB_FLR,
00042   SH_ARB_FRC,
00043   SH_ARB_LIT,
00044   SH_ARB_MOV,
00045 
00046   
00047   SH_ARB_EX2,
00048   SH_ARB_LG2,
00049   SH_ARB_RCP,
00050   SH_ARB_RSQ,
00051 
00052   
00053   SH_ARB_POW,
00054 
00055   
00056   SH_ARB_ADD,
00057   SH_ARB_DP3,
00058   SH_ARB_DP4,
00059   SH_ARB_DPH,
00060   SH_ARB_DST,
00061   SH_ARB_MAX,
00062   SH_ARB_MIN,
00063   SH_ARB_MUL,
00064   SH_ARB_SGE,
00065   SH_ARB_SLT,
00066   SH_ARB_SUB,
00067   SH_ARB_XPD,
00068 
00069   
00070   SH_ARB_MAD,
00071 
00072   
00073   SH_ARB_SWZ,
00074 
00075   
00076   
00077   SH_ARB_EXP,
00078   SH_ARB_LOG,
00079   
00080   
00081   
00082   SH_ARB_COS,
00083   SH_ARB_SIN,
00084   SH_ARB_SCS,
00085 
00086   
00087   SH_ARB_CMP,
00088   SH_ARB_LRP,
00089 
00090   
00091   SH_ARB_TEX,
00092   SH_ARB_TXP,
00093   SH_ARB_TXB,
00094 
00095   
00096   SH_ARB_KIL,
00097 
00098   
00099   SH_ARB_SEQ,
00100   SH_ARB_SGT,
00101   SH_ARB_SLE,
00102   SH_ARB_SNE,
00103   SH_ARB_SFL,
00104   SH_ARB_STR,
00105 
00106   
00107   SH_ARB_DDX,
00108   SH_ARB_DDY,
00109   SH_ARB_RFL,
00110   SH_ARB_TXD,
00111 
00112   
00113   SH_ARB_SSG,
00114   SH_ARB_BRA,
00115   SH_ARB_LABEL, 
00116   
00117   
00118   SH_ARB_DIV,
00119   SH_ARB_DP2,
00120   SH_ARB_NRM,
00121   SH_ARB_IF,
00122   SH_ARB_ELSE,
00123   SH_ARB_ENDIF,
00124   SH_ARB_REP,
00125   SH_ARB_ENDREP,
00126   SH_ARB_BRK,
00127   
00128   
00129   SH_ARB_FUN
00130 };
00131 
00134 struct ArbOpInfo {
00135   
char* name;
00136   
int arity;
00137   
bool collectingOp;
00138 };
00139 
00140 
extern ArbOpInfo arbOpInfo[];
00141 
00144 struct ArbInst {
00145   
static const int max_num_sources = 4;
00146   
00147   
ArbInst(ArbOp op, 
int label)
00148     : op(op), label(label), invert(
false),
00149       
update_cc(
false), 
ccode(NOCC)
00150   {
00151   }
00152 
00153   
ArbInst(ArbOp op, 
int label, 
const SH::ShVariable& condition)
00154     : op(op), label(label), invert(
false),
00155       
update_cc(
false), 
ccode(NOCC)
00156   {
00157     src[0] = condition;
00158   }
00159   
00160   
ArbInst(ArbOp op, 
const SH::ShVariable& dest)
00161     : op(op), dest(dest), invert(
false),
00162       
update_cc(
false), 
ccode(NOCC)
00163   {
00164   }
00165 
00166   
ArbInst(ArbOp op, 
const SH::ShVariable& dest, 
const SH::ShVariable& src0)
00167     : op(op), dest(dest), invert(
false),
00168       
update_cc(
false), 
ccode(NOCC)
00169   {
00170     src[0] = src0;
00171   }
00172 
00173   
ArbInst(ArbOp op, 
const SH::ShVariable& dest, 
const SH::ShVariable& src0,
00174           
const SH::ShVariable& src1)
00175     : op(op), dest(dest), invert(
false),
00176       
update_cc(
false), 
ccode(NOCC)
00177   {
00178     src[0] = src0;
00179     src[1] = src1;
00180   }
00181   
ArbInst(ArbOp op, 
const SH::ShVariable& dest, 
const SH::ShVariable& src0,
00182           
const SH::ShVariable& src1, 
const SH::ShVariable& src2)
00183     : op(op), dest(dest), invert(
false),
00184       
update_cc(
false), 
ccode(NOCC)
00185   {
00186     src[0] = src0;
00187     src[1] = src1;
00188     src[2] = src2;
00189   }
00190   
ArbInst(ArbOp op, 
const SH::ShVariable& dest, 
const SH::ShVariable& src0,
00191           
const SH::ShVariable& src1, 
const SH::ShVariable& src2,
00192           
const SH::ShVariable& src3)
00193     : op(op), dest(dest), invert(
false),
00194       
update_cc(
false), 
ccode(NOCC)
00195   {
00196     src[0] = src0;
00197     src[1] = src1;
00198     src[2] = src2;
00199     src[3] = src3;
00200   }
00201   
00202   ArbOp op;
00203   
SH::ShVariable dest;
00204 
00205   
SH::ShVariable src[max_num_sources];
00206 
00207   
int label; 
00208   
bool invert; 
00209 
00210   
00211   bool update_cc; 
00212   
00213   
enum CCode {
00214     NOCC,
00215     EQ,
00216     GE,
00217     GT,
00218     LE,
00219     LT,
00220     NE,
00221     TR,
00222     FL
00223   } ccode; 
00224 
00225   
SH::ShSwizzle ccswiz;
00226   
00227 };
00228 
00229 
extern char* arbCCnames[];
00230 
00231 }
00232 
00233 
#endif