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