亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? compile.c

?? nVidia開發的圖形語言 Cg
?? C
?? 第 1 頁 / 共 5 頁
字號:
            break;
        case DISCARD_STMT:
            lStmt = (stmt *) NewDiscardStmt(&fStmt->commonst.loc, fStmt->discardst.cond);
            break;
        case COMMENT_STMT:
            lStmt = (stmt *) NewCommentStmt(&fStmt->commonst.loc,
                                            GetAtomString(atable, fStmt->commentst.str));
            break;
        default:
            lStmt = fStmt;
            assert(!"DuplicateStatement() - not yet finished");
            break;
        }
        PreApplyToExpressions(DuplicateNode, lStmt, arg1, arg2);
    } else {
        lStmt = NULL;
    }
    return lStmt;
} // DuplicateStatement

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// Named Constant Substitution /////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

/*
 * ConvertNamedConstantsExpr() - Replace references to names constants with a const node.
 *
 */

expr *ConvertNamedConstantsExpr(expr *fExpr, void *arg1, int arg2)
{
    Symbol *lSymb;
    Type *lType;
    expr *lExpr;
    int base;

    lExpr = fExpr;
    if (fExpr) {
        switch (fExpr->common.kind) {
        case SYMB_N:

            // The only named constants are "true" and "false":

            lSymb = fExpr->sym.symbol;
            lType = lSymb->type;
            if (lSymb->kind == CONSTANT_S) {
                if (IsScalar(lType)) {
                    base = GetBase(lType);
                    switch (base) {
                    case TYPE_BASE_BOOLEAN:
                        lExpr = (expr *) NewBConstNode(BCONST_OP, lSymb->details.con.value,
                                                       TYPE_BASE_BOOLEAN);
                        break;
                    }
                }
            }
            break;
        case CONST_N:
        case UNARY_N:
        case BINARY_N:
        case TRINARY_N:
            break;
        default:
            FatalError("bad kind to ConvertNamedConstantsExpr()");
            break;
        }
    } else {
        lExpr = NULL;
    }
    return lExpr;
} // ConvertNamedConstantsExpr

///////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// Remove Empty Statements //////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

/*
 * RemoveEmptyStatementsStmt() - Expand inline function calls in a statement.
 *
 */

stmt *RemoveEmptyStatementsStmt(stmt *fStmt, void *arg1, int arg2)
{
    if (fStmt->commonst.kind == EXPR_STMT) {
        if (!fStmt->exprst.exp)
            fStmt = NULL;
    }
    return fStmt;
} // RemoveEmptyStatementsStmt

///////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// Remove Empty Statements //////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

typedef struct DebugFunctionData_Rec {
    Symbol *color;
    Symbol *flag;
    Symbol *outConnector;
    Symbol *COLSymb;
} DebugFunctionData;

/*
 * ConvertDebugCallsStmt() - Expand inline function calls in a statement.
 *
 */

stmt *ConvertDebugCallsStmt(stmt *fStmt, void *arg1, int arg2)
{
    DebugFunctionData *lDebugData = (DebugFunctionData *) arg1;
    expr *eExpr, *sExpr, *lExpr, *mExpr, *bExpr, *rExpr;
    stmt *lStmt, *mStmt;
    Symbol *lSymb;

    if (fStmt->commonst.kind == EXPR_STMT) {

        // Look for a call to "debug(float4)":

        eExpr = fStmt->exprst.exp;
        if (eExpr && eExpr->common.kind == BINARY_N && eExpr->bin.op == FUN_BUILTIN_OP) {
            sExpr = eExpr->bin.left;
            if (sExpr->common.kind == SYMB_N) {
                lSymb = sExpr->sym.symbol;
#define BUILTIN_GROUP_NV30FP_DBG     0
                if (lSymb->details.fun.group == BUILTIN_GROUP_NV30FP_DBG &&
                    lSymb->details.fun.index == 0x444)
                {
                    if (arg2) {

                        // Turn: "debug(arg);" statements into:
                        //
                        //     $debug-color@@(!$debug-set) = arg;
                        //     $debug-set = true;

                        rExpr = eExpr->bin.right->bin.left;
                        mExpr = GenSymb(lDebugData->flag);
                        mExpr = GenBoolNot(mExpr);
                        lExpr = GenSymb(lDebugData->color);
                        lExpr = GenCondSVAssign(lExpr, mExpr, rExpr, TYPE_BASE_FLOAT, 4);
                        lStmt = (stmt *) NewExprStmt(Cg->pLastSourceLoc, lExpr);
                        lExpr = GenSymb(lDebugData->flag);
                        rExpr = GenBoolConst(1);
                        lExpr = GenBoolAssign(lExpr, rExpr);
                        mStmt = (stmt *) NewExprStmt(Cg->pLastSourceLoc, lExpr);
                        lStmt->commonst.next = mStmt;
                        fStmt = lStmt;
                    } else {

                        // Eliminate: "debug(arg);" statements:

                        fStmt = NULL;
                    }
                }
            }
        }
    } else if (arg2 && fStmt->commonst.kind == RETURN_STMT) {
        rExpr = GenSymb(lDebugData->color);
        mExpr = GenSymb(lDebugData->flag);
        lExpr = GenSymb(lDebugData->outConnector);
        bExpr = GenMember(lDebugData->COLSymb);
        lExpr = GenMemberSelector(lExpr, bExpr);
        lExpr = GenCondSVAssign(lExpr, mExpr, rExpr, TYPE_BASE_FLOAT, 4);
        lStmt = (stmt *) NewExprStmt(Cg->pLastSourceLoc, lExpr);
        lStmt->commonst.next = fStmt;
        fStmt = lStmt;
    }
    return fStmt;
} // ConvertDebugCallsStmt

/*
 * ConvertDebugCalls() - Convert calls to debug to either assignments to global variables, or
 *         delete them, depending on the value of DebugFlag.  Also defines global variables.
 *
 */

stmt *ConvertDebugCalls(SourceLoc *loc, Scope *fScope, stmt *fStmt, int DebugFlag)
{
    Symbol *debugColor, *debugSet;
    DebugFunctionData debugData;
    expr *lExpr, *rExpr;
    stmt *lStmt, *rStmt;
    StmtList lStatements;
    Type *lType;
    int vname, COLname;
    float fdata[4];

    rStmt = fStmt;
    if (DebugFlag) {
        lStatements.first = lStatements.last = NULL;
        //outputSymb = fScope->outConnector;

        // 1) Define global vars used by "-debug" mode:
        //
        //     float $debug-color[4];
        //     bool  $debug-set = 0.0f;

        vname = AddAtom(atable, "$debug-color");
        lType = GetStandardType(TYPE_BASE_FLOAT, 4, 0);
        debugColor = DefineVar(loc, fScope, vname, lType);
        vname = AddAtom(atable, "$debug-set");
        debugSet = DefineVar(loc, fScope, vname, BooleanType);
        lExpr = GenSymb(debugSet);
        rExpr = GenBoolConst(0);
        lExpr = GenBoolAssign(lExpr, rExpr);
        lStmt = (stmt *) NewExprStmt(loc, lExpr);
        AppendStatements(&lStatements, lStmt);

        // 1A) Must initialize $debug-color to something or else the code generator
        //     gets all bent out of shape:
        //
        //     $debug-color = { 0.0f, 0.0f, 0.0f, .0f };

        fdata[0] = fdata[1] = fdata[2] = fdata[3] = 0.0f;
        rExpr = GenFConstV(fdata, 4, TYPE_BASE_FLOAT);
        lExpr = GenSymb(debugColor);
        lExpr = GenVAssign(lExpr, rExpr, TYPE_BASE_FLOAT, 4);
        lStmt = (stmt *) NewExprStmt(loc, lExpr);
        AppendStatements(&lStatements, lStmt);

        // 2) Expand calls to "debug(float4);" into the following code:
        //
        //     $debug-color@@(!$debug-set) = float4;
        //     $debug-set = true;

        debugData.color = debugColor;
        debugData.flag = debugSet;
        debugData.outConnector = Cg->theHAL->varyingOut;
        assert(debugData.outConnector);
        COLname = AddAtom(atable, "COL");
        lType = debugData.outConnector->type;
        assert(IsCategory(lType, TYPE_CATEGORY_CONNECTOR));
        debugData.COLSymb = LookUpLocalSymbol(lType->str.members, COLname);

        // 3) And add the following statement to the end of the program (i.e. before each
        //    "return" statement):
        //
        //     output.COL@@($debug-set) = $debug-color;

        lStmt = PostApplyToStatements(ConvertDebugCallsStmt, fStmt, &debugData, 1);
        AppendStatements(&lStatements, lStmt);

        rStmt = lStatements.first;
    } else {
        rStmt = PostApplyToStatements(ConvertDebugCallsStmt, fStmt, NULL, 0);
    }
    return rStmt;
} // ConvertDebugCalls

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Flatten Chained Assignment Statements ///////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

int IsAssignSVOp(expr *fExpr)
{
    int lop;

    if (fExpr) {
        if (fExpr->common.kind == BINARY_N) {
            lop = fExpr->bin.op;
            if (lop == ASSIGN_OP || lop == ASSIGN_V_OP || lop == ASSIGN_GEN_OP ||
                lop == ASSIGN_MASKED_KV_OP)
            {
                return 1;
            }
        }
    }
    return 0;
} // IsAssignSVOp

int IsAssignCondSVOp(expr *fExpr)
{
    int lop;

    if (fExpr) {
        if (fExpr->common.kind == TRINARY_N) {
            lop = fExpr->tri.op;
            if (lop == ASSIGN_COND_OP || lop == ASSIGN_COND_V_OP || lop == ASSIGN_COND_SV_OP ||
                lop == ASSIGN_COND_GEN_OP)
            {
                return 1;
            }
        }
    }
    return 0;
} // IsAssignCondSVOp

int IsCastOp(expr *fExpr)
{
    int lop;

    if (fExpr) {
        if (fExpr->common.kind == UNARY_N) {
            lop = fExpr->un.op;
            if (lop == CAST_CS_OP || lop == CAST_CV_OP || lop == CAST_CM_OP)
            {
                return 1;
            }
        }
    }
    return 0;
} // IsCastOp

/*
 * NewTmp() - Return a symbol expression for a temp symbol that can
 * hold the value of fExpr.
 *
 */

symb *NewTmp(const expr *fExpr)
{
    Symbol *tmpSym;
    Type *tmpType = DupType(fExpr->common.type);
    tmpType->co.properties &= ~(TYPE_DOMAIN_MASK | TYPE_QUALIFIER_MASK);
    tmpSym = UniqueSymbol(CurrentScope, tmpType, VARIABLE_S);
    return NewSymbNode(VARIABLE_OP, tmpSym);
} // NewTmp

/*
 * FlattenChainedAssignmentsStmt() - Transform chained assignments into multiple simple
 *         assignments.
 *
 *  float3 A, C;  half B;
 *
 *  Simle case:
 *
 *  A = B = C;    (which is equivanemt to:)     A = (float) ( B = (half) C ) ;
 *
 *      =                        =               =
 *    /   \                    /   \           /   \
 *  A      (f)     >>-->>     B     (h)      A      (f)
 *            \                        \               \
 *              =                        C               B'
 *            /   \
 *          B      (h)
 *                    \
 *                      C
 *
 *  where B' is a duplicate of B.
 *
 *  If B contains any function calls, they must be hoisted prior to this step.
 *  
 */

stmt *FlattenChainedAssignmentsStmt(stmt *fStmt, void *arg1, int arg2)
{
    stmt *bStmt, *rStmt;
    expr *assigna, *assignb;
    expr *pb, **ppassignb;

    if (fStmt->commonst.kind == EXPR_STMT) {
        rStmt = fStmt;
        assigna = fStmt->exprst.exp;
        while (1) {
            if (IsAssignSVOp(assigna)) {
                ppassignb = &assigna->bin.right;
            } else if (IsAssignCondSVOp(assigna)) {
                ppassignb = &assigna->tri.arg3;
            } else {
                break;
            }
            // Traverse list of type casts, if any:
            while (IsCastOp(*ppassignb))
                ppassignb = &((**ppassignb).un.arg);
            if (IsAssignSVOp(*ppassignb)) {
                pb = (**ppassignb).bin.left;
            } else if (IsAssignCondSVOp(*ppassignb)) {
                pb = (**ppassignb).tri.arg1;
            } else {
                break;
            }
            assignb = *ppassignb;
            bStmt = (stmt *) NewExprStmt(&fStmt->commonst.loc, assignb);
            *ppassignb = PreApplyToNodes(DuplicateNode, pb, arg1, arg2);
            bStmt->commonst.next = rStmt;
            rStmt = bStmt;
            assigna = assignb;
        }
    } else {
        rStmt = fStmt;
    }
    return rStmt;
} // FlattenChainedAssignmentsStmt

/*
 * PutIndexEpxrsInTemps() - Puts all array indicies in temps and
 * builds a comma list of assignments of the indices to the
 * temporaries.
 *
 * A[e1]...[eN] -> t1 = e1, ..., tN = eN : A[t1]...[tN]
 */
expr *PutIndexEpxrsInTemps(expr *fExpr)
{
    expr *assignments = NULL;
    expr *assign;
    expr *tmp;
    
    assert(IsArrayIndex(fExpr));
    if (IsArrayIndex(fExpr->bin.left))
        assignments = PutIndexEpxrsInTemps(fExpr->bin.left);

    tmp = (expr *) NewTmp(fExpr->bin.right);
    assign = NewSimpleAssignment(Cg->pLastSourceLoc, DupNode(tmp), fExpr->bin.right, 0);

    if (!assignments)
        assignments = assign;
    else
        assignments = (expr *) NewBinopNode(COMMA_OP, assignments, assign);

    if (IsArrayIndex(fExpr->bin.right))
        assignments = (expr *) NewBinopNode(COMMA_OP, assignments,
                                            PutIndexEpxrsInTemps(fExpr->bin.right));

    fExpr->bin.right = tmp;
    return assignments;
} // PutIndexEpxrsInTemps

///////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////// Expand Increment/Decrement Expressions ////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

/*

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人av资源| 美女一区二区在线观看| 一区二区三区在线观看视频| 日本在线观看不卡视频| 国产精华液一区二区三区| 欧美视频日韩视频| 中文字幕在线观看一区二区| 毛片基地黄久久久久久天堂| 欧美亚洲一区二区在线观看| 国产精品午夜在线观看| 黄一区二区三区| 欧美精品久久天天躁| 亚洲美女淫视频| av中文字幕不卡| 久久久久久一二三区| 久久激情综合网| 精品国产网站在线观看| 日韩影视精彩在线| 欧美男女性生活在线直播观看| 国产精品麻豆99久久久久久| 国产毛片精品视频| 亚洲精品一区二区三区在线观看| 亚洲成人动漫av| 在线日韩av片| 亚洲色图清纯唯美| 99久久精品99国产精品| 中文字幕一区免费在线观看| 国产在线精品免费| 国产在线一区观看| 国产91丝袜在线播放0| 欧美国产成人精品| 欧美人狂配大交3d怪物一区| 国产成人a级片| 视频一区视频二区中文字幕| 国产精品成人免费| 成年人网站91| 欧美视频在线一区| 亚洲欧洲日产国码二区| av一区二区三区黑人| 国产亚洲精品中文字幕| 国产精品小仙女| 中文在线一区二区| 97精品国产97久久久久久久久久久久| 国产精品久久久久一区| 91久久国产综合久久| 五月天精品一区二区三区| 91精品国产91久久综合桃花| 久久精品国产77777蜜臀| 日韩视频免费观看高清完整版在线观看 | 北条麻妃国产九九精品视频| 国产精品青草综合久久久久99| 丁香婷婷综合色啪| 日韩码欧中文字| 欧美日韩成人在线| 久久99久久99小草精品免视看| 日韩精品一区二区三区视频| 国产mv日韩mv欧美| 亚洲一区成人在线| 精品国产乱码久久久久久夜甘婷婷 | 欧美日韩国产小视频在线观看| 亚洲综合成人在线视频| 欧美一区二区免费观在线| 韩国一区二区三区| 亚洲精品写真福利| 777色狠狠一区二区三区| 国产一区二区在线观看视频| 自拍偷自拍亚洲精品播放| 777久久久精品| 成人高清免费观看| 日韩av电影免费观看高清完整版| 久久久99久久| 欧美日韩国产一区二区三区地区| 国产精品中文字幕一区二区三区| 亚洲欧美一区二区在线观看| 日韩欧美亚洲另类制服综合在线| 97精品久久久午夜一区二区三区| 日本美女一区二区三区视频| 综合激情成人伊人| 精品处破学生在线二十三| 91啪九色porn原创视频在线观看| 蜜臀a∨国产成人精品| 亚洲欧美国产高清| 337p粉嫩大胆色噜噜噜噜亚洲 | 成人性色生活片| 五月综合激情日本mⅴ| 国产蜜臀av在线一区二区三区| 欧美日韩视频在线观看一区二区三区| 久久99精品久久久久| 亚洲成av人片在线观看| 国产精品美女一区二区三区 | 色av成人天堂桃色av| 国产成人午夜精品影院观看视频| 亚洲成年人影院| 亚洲美女精品一区| 国产日本亚洲高清| 欧美va日韩va| 91麻豆精品国产| 欧美在线小视频| 99re热视频这里只精品| 国产激情精品久久久第一区二区 | 欧美私人免费视频| av亚洲产国偷v产偷v自拍| 极品销魂美女一区二区三区| 午夜激情综合网| 午夜亚洲福利老司机| 亚洲自拍另类综合| 亚洲一区国产视频| 亚洲一区在线电影| 亚洲一区二区三区激情| 亚洲乱码国产乱码精品精98午夜| 国产精品久久久久一区| 中文子幕无线码一区tr| 国产精品毛片a∨一区二区三区| 久久久久久久精| 国产网红主播福利一区二区| 精品国产一区二区在线观看| 精品久久久久一区二区国产| 精品久久久久久久久久久院品网 | 老司机午夜精品| 蜜臀av一级做a爰片久久| 美国十次综合导航| 老司机精品视频导航| 韩国成人精品a∨在线观看| 国产精品自拍三区| 94-欧美-setu| 欧美影院精品一区| 91精品国产综合久久小美女| 日韩午夜在线观看视频| 久久久精品人体av艺术| 中文字幕高清一区| 亚洲一二三四区| 日韩精品电影一区亚洲| 韩国精品主播一区二区在线观看| 国产a视频精品免费观看| eeuss影院一区二区三区 | 成人激情黄色小说| 91成人免费网站| 欧美二区三区91| 欧美精品一区二区在线观看| 欧美国产成人在线| 亚洲午夜一区二区| 久久精品国产亚洲a| 成人性生交大片免费看视频在线| 在线观看日韩高清av| 日韩免费看网站| 亚洲欧美日韩系列| 日韩国产高清在线| 国产馆精品极品| 欧美无砖专区一中文字| 精品国产乱码久久久久久免费| 国产精品美女www爽爽爽| 午夜影视日本亚洲欧洲精品| 国产综合色产在线精品| 91麻豆swag| 日韩小视频在线观看专区| 最新久久zyz资源站| 日日摸夜夜添夜夜添精品视频| 国产精品一品二品| 欧美日韩国产精选| 国产精品女同互慰在线看| 亚洲v日本v欧美v久久精品| 国产69精品久久777的优势| 欧洲一区在线电影| 国产亚洲综合在线| 水蜜桃久久夜色精品一区的特点| 国产成人免费在线| 欧美一区二区成人| 亚洲最新在线观看| 国产精品888| 欧美一区日本一区韩国一区| 中文字幕日韩av资源站| 精品一区二区三区在线观看| 欧美专区日韩专区| 亚洲欧洲成人精品av97| 国产乱码字幕精品高清av| 欧美日韩中字一区| 成人免费一区二区三区视频| 激情综合色播五月| 欧美日韩中文字幕精品| 综合久久国产九一剧情麻豆| 国产精品一卡二卡在线观看| 欧美第一区第二区| 日韩av一区二区在线影视| 色欧美日韩亚洲| 亚洲乱码国产乱码精品精可以看 | 精品日韩欧美在线| 日韩高清中文字幕一区| 一本一道久久a久久精品| 国产亚洲欧美在线| 精品一区二区国语对白| 91精品欧美一区二区三区综合在| 亚洲黄色小视频| 91黄色小视频| 一区二区三区精密机械公司| 97aⅴ精品视频一二三区| 亚洲人成网站精品片在线观看| 99久久精品99国产精品| 日韩伦理av电影| 91日韩一区二区三区| 亚洲女同女同女同女同女同69|