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

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

?? constfold.c

?? cg編譯器
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************************\
Copyright (c) 2002, NVIDIA Corporation.

NVIDIA Corporation("NVIDIA") supplies this software to you in
consideration of your agreement to the following terms, and your use,
installation, modification or redistribution of this NVIDIA software
constitutes acceptance of these terms.  If you do not agree with these
terms, please do not use, install, modify or redistribute this NVIDIA
software.

In consideration of your agreement to abide by the following terms, and
subject to these terms, NVIDIA grants you a personal, non-exclusive
license, under NVIDIA's copyrights in this original NVIDIA software (the
"NVIDIA Software"), to use, reproduce, modify and redistribute the
NVIDIA Software, with or without modifications, in source and/or binary
forms; provided that if you redistribute the NVIDIA Software, you must
retain the copyright notice of NVIDIA, this notice and the following
text and disclaimers in all such redistributions of the NVIDIA Software.
Neither the name, trademarks, service marks nor logos of NVIDIA
Corporation may be used to endorse or promote products derived from the
NVIDIA Software without specific prior written permission from NVIDIA.
Except as expressly stated in this notice, no other rights or licenses
express or implied, are granted by NVIDIA herein, including but not
limited to any patent rights that may be infringed by your derivative
works or by other works in which the NVIDIA Software may be
incorporated. No hardware is licensed hereunder. 

THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
PRODUCTS.

IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\****************************************************************************/

//
// constfold.c
//

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//#include <string.h>

#include "slglobals.h"

#if 0
#define DB(X)   X
#else
#define DB(X)
#endif

// IsConstant(expr *)
// return true iff the argument is a constant
static int IsConstant(expr *fexpr)
{
    return fexpr && fexpr->common.kind == CONST_N;
} // IsConstant

// IsConstList(expr *)
// return true iff the argument is a constant or a list of constants
static int IsConstList(expr *fexpr)
{
    while (fexpr &&
           fexpr->common.kind == BINARY_N &&
           fexpr->bin.op == EXPR_LIST_OP
    ) {
        if (!IsConstant(fexpr->bin.left)) return 0;
        if (!(fexpr = fexpr->bin.right)) return 1;
    }
    return fexpr && fexpr->common.kind == CONST_N;
} // IsConstList

// NewConst
// create a new blank constant node we can fill in
// This is a bit of a hack, as the opcode field is really redundant with
// the type info in the node, so we just create an opcode that's as close
// as possible to what we want -- which sometimes may not exist (vectors
// other than float
static expr *NewConst(int base, int len)
{
    float       tmp[4] = { 0, 0, 0, 0 };
    opcode      op = FCONST_OP;

    // This is a bit of a hack -- we use NewFConstNodeV to allocate a node
    // even for non-FCONST_V nodes.  It turns out that it works out ok.
    if (runtime_ops[base]) op = runtime_ops[base]->const_opcode;
    if (len) op++;
    return (expr *)NewFConstNodeV(op, tmp, len, base);
}

// GetConstVal
// get the actual value from a constant node
static scalar_constant *GetConstVal(expr *constexpr) {
    if (!constexpr || constexpr->common.kind != CONST_N) return 0;
    return constexpr->co.val;
} // GetConstVal

typedef struct constlist_iter {
    expr        *curr, *rest;
    int         i, lim;
} constlist_iter;

static void InitConstList_iter(constlist_iter *iter, expr *fexpr)
{
    iter->curr = 0;
    iter->rest = fexpr;
    iter->i = iter->lim = 0;
} // InitConstList_iter

static scalar_constant *ConstListNext(constlist_iter *iter) {
    if (iter->i >= iter->lim) {
        do {
            if (!iter->rest) return 0;
            if (iter->rest->common.kind == BINARY_N &&
                iter->rest->bin.op == EXPR_LIST_OP
            ) {
                iter->curr = iter->rest->bin.left;
                iter->rest = iter->rest->bin.right;
            } else if (iter->rest->common.kind == CONST_N) {
                iter->curr = iter->rest;
                iter->rest = 0;
            } else {
                iter->rest = 0;
                return 0;
            }
        } while (!iter->curr || iter->curr->common.kind != CONST_N);
        iter->i = 0;
        iter->lim = SUBOP_GET_S(iter->curr->co.subop);
    }
    return &iter->curr->co.val[iter->i++];
} // ConstListNext

DB(
static void pconst(scalar_constant *v, int type) {
    switch(type) {
    case TYPE_BASE_BOOLEAN:
        printf("%c", v->i ? 'T' : 'F');
        break;
    case TYPE_BASE_INT:
    case TYPE_BASE_CINT:
        printf("%d", v->i);
        break;
    default:
        printf("%g", v->f);
        break;
    }
}

static void DumpConstList(expr *fexpr, int type) {
    constlist_iter      iter;
    int                 first = 1;
    scalar_constant     *v;

    InitConstList_iter(&iter, fexpr);
    printf("(");
    while ((v = ConstListNext(&iter))) {
        if (first) first = 0;
        else printf(", ");
        pconst(v, type);
    }
    printf(")");
}
)

/*
 * FoldConstants() - Fold this expression if possible.
 *
 */

expr *FoldConstants(expr *fexpr)
{
    return PostApplyToNodes(ConstantFoldNode, fexpr, 0, 0);
}


// ConstantFoldNode
// all the real work is done here
expr *ConstantFoldNode(expr *fexpr, void *_arg1, int arg2)
{
    expr *rv = fexpr;
    int base, target;
    int len;
    int i;
    scalar_constant *a1, *a2;
    void (*unfn)(scalar_constant *, const scalar_constant *) = 0;
    void (*binfn)(scalar_constant *, const scalar_constant *, const scalar_constant *) = 0;
    void (*shfn)(scalar_constant *, const scalar_constant *, int) = 0;
    int (*cmpfn)(const scalar_constant *, const scalar_constant *) = 0;
    int op_offset, a1_mask, a2_mask;
    if (!fexpr) return fexpr;
    switch(fexpr->common.kind) {
    case UNARY_N:
        base = SUBOP_GET_T(fexpr->un.subop);
        len = SUBOP_GET_S(fexpr->un.subop);
        if (fexpr->un.op == VECTOR_V_OP && IsConstList(fexpr->un.arg)) {
            constlist_iter      iter;
            DB (printf("fold VECTOR_V_OP[%d:%d]", len, base);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            InitConstList_iter(&iter, fexpr->un.arg);
            rv = NewConst(base, len);
            for (i=0; i<len; i++) {
                rv->co.val[i] = *ConstListNext(&iter);
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], base);)
            }
            DB(printf("\n");)
            return rv;
        }
        if (!IsConstant(fexpr->un.arg)) break;
        if (!runtime_ops[base]) break;
        a1 = GetConstVal(fexpr->un.arg);
        switch (fexpr->un.op) {
        case SWIZZLE_Z_OP: {
            int mask = SUBOP_GET_MASK(fexpr->un.subop);
            len = SUBOP_GET_S2(fexpr->un.subop);
            DB (printf("fold SWIZ[%d:%d].", len, base);
                for (i=0; i<len; i++)
                    putchar("xyzw"[(mask>>(i*2))&3]);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            rv = NewConst(base, len);
            for (i=0; i==0 || i<len; i++) {
                rv->co.val[i] = a1[mask&3];
                mask >>= 2;
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], base);)
            }
            DB(printf("\n");)
            break; }
        case SWIZMAT_Z_OP:
            break;
        case CAST_CS_OP:
        case CAST_CV_OP:
            target = SUBOP_GET_T2(fexpr->un.subop);
            DB (printf("fold CAST[%d:%d->%d]", len, base, target);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            unfn = runtime_ops[base]->cvtTo[target];
            if (!unfn && runtime_ops[target])
                unfn = runtime_ops[target]->cvtFrom[base];
            base = target;
            goto normal_unop;
        case CAST_CM_OP:
            break;
        case NEG_OP:
        case NEG_V_OP:
            DB (printf("fold NEG[%d:%d]", len, base);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            unfn = runtime_ops[base]->op_neg;
        normal_unop:
            if (!unfn) {
                DB(printf("no function, abort\n");)
                break;
            }
            rv = NewConst(base, len);
            for (i=0; i==0 || i<len; i++) {
                unfn(&rv->co.val[i], &a1[i]);
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], base);)
            }
            DB(printf("\n");)
            break;
        case POS_OP:
        case POS_V_OP:
            rv = fexpr->un.arg;
            break;
        case NOT_OP:
        case NOT_V_OP:
            DB (printf("fold NOT[%d:%d]", len, base);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            unfn = runtime_ops[base]->op_not;
            goto normal_unop;
        case BNOT_OP:
        case BNOT_V_OP:
            DB (printf("fold BNOT[%d:%d]", len, base);
                DumpConstList(fexpr->un.arg, base);
                printf(" -> ");)
            unfn = runtime_ops[base]->op_bnot;
            goto normal_unop;
            break;
        default:
            break;
        }
        break;
    case BINARY_N:
        if (!IsConstant(fexpr->bin.left) ||
            !IsConstant(fexpr->bin.right)
        )
            break;
        base = SUBOP_GET_T(fexpr->bin.subop);
        if (!runtime_ops[base]) break;
        len = SUBOP_GET_S(fexpr->bin.subop);
        a1 = GetConstVal(fexpr->bin.left);
        a2 = GetConstVal(fexpr->bin.right);
        switch(fexpr->bin.op) {
        case MEMBER_SELECTOR_OP:
        case ARRAY_INDEX_OP:
        case FUN_CALL_OP:
        case FUN_BUILTIN_OP:
        case FUN_ARG_OP:
        case EXPR_LIST_OP:
            break;
        case MUL_OP:
        case MUL_V_OP:
        case MUL_SV_OP:
        case MUL_VS_OP:
            DB (printf("fold MUL");)
            binfn = runtime_ops[base]->op_mul;
            op_offset = fexpr->bin.op - MUL_OP;
        normal_binop:
            DB (printf("[%d:%d]", len, base);
                DumpConstList(fexpr->bin.left, base);
                DumpConstList(fexpr->bin.right, base);
                printf(" -> ");)
            if (!binfn) {
                DB(printf("no function, abort\n");)
                break;
            }
            rv = NewConst(base, len);
            // set a1_mask to all 0s or all 1s, depending on whether a1
            // (left arg) is scalar (all 0s) or vector (all 1s).  a2_mask
            // is set according to a2.  This is dependent on the ordering
            // of the OFFSET_ tags in supprt.h
            a1_mask = 0 - (op_offset&1);
            a2_mask = 0 - (((op_offset>>1)^op_offset)&1);
            for (i=0; i==0 || i<len; i++) {
                binfn(&rv->co.val[i], &a1[i & a1_mask], &a2[i & a2_mask]);
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], base);)
            }
            DB(printf("\n");)
            break;
        case DIV_OP:
        case DIV_V_OP:
        case DIV_SV_OP:
        case DIV_VS_OP:
            DB (printf("fold DIV");)
            binfn = runtime_ops[base]->op_div;
            op_offset = fexpr->bin.op - DIV_OP;
            goto normal_binop;
        case MOD_OP:
        case MOD_V_OP:
        case MOD_SV_OP:
        case MOD_VS_OP:
            DB (printf("fold MOD");)
            binfn = runtime_ops[base]->op_mod;
            op_offset = fexpr->bin.op - MOD_OP;
            goto normal_binop;
        case ADD_OP:
        case ADD_V_OP:
        case ADD_SV_OP:
        case ADD_VS_OP:
            DB (printf("fold ADD");)
            binfn = runtime_ops[base]->op_add;
            op_offset = fexpr->bin.op - ADD_OP;
            goto normal_binop;
        case SUB_OP:
        case SUB_V_OP:
        case SUB_SV_OP:
        case SUB_VS_OP:
            DB (printf("fold SUB");)
            binfn = runtime_ops[base]->op_sub;
            op_offset = fexpr->bin.op - SUB_OP;
            goto normal_binop;
        case SHL_OP:
        case SHL_V_OP:
            DB (printf("fold SHL");)
            shfn = runtime_ops[base]->op_shl;
        normal_shiftop:
            DB (printf("[%d:%d]", len, base);
                DumpConstList(fexpr->bin.left, base);
                DumpConstList(fexpr->bin.right, TYPE_BASE_CINT);
                printf(" -> ");)
            if (!shfn) {
                DB(printf("no function, abort\n");)
                break;
            }
            rv = NewConst(base, len);
            for (i=0; i==0 || i<len; i++) {
                shfn(&rv->co.val[i], &a1[i], a2->i);
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], base);)
            }
            DB(printf("\n");)
            break;
        case SHR_OP:
        case SHR_V_OP:
            DB (printf("fold SHR");)
            shfn = runtime_ops[base]->op_shr;
            goto normal_shiftop;
        case LT_OP:
        case LT_V_OP:
        case LT_SV_OP:
        case LT_VS_OP:
            DB (printf("fold LT");)
            cmpfn = runtime_ops[base]->op_lt;
            op_offset = fexpr->bin.op - LT_OP;
        normal_cmpop:
            DB (printf("[%d:%d]", len, base);
                DumpConstList(fexpr->bin.left, base);
                DumpConstList(fexpr->bin.right, TYPE_BASE_CINT);
                printf(" -> ");)
            if (!cmpfn) {
                DB(printf("no function, abort\n");)
                break;
            }
            rv = NewConst(TYPE_BASE_BOOLEAN, len);
            // set a1_mask to all 0s or all 1s, depending on whether a1
            // (left arg) is scalar (all 0s) or vector (all 1s).  a2_mask
            // is set according to a2.  This is dependent on the ordering
            // of the OFFSET_ tags in supprt.h
            a1_mask = 0 - (op_offset&1);
            a2_mask = 0 - (((op_offset>>1)^op_offset)&1);
            for (i=0; i==0 || i<len; i++) {
                rv->co.val[i].i = cmpfn(&a1[i & a1_mask], &a2[i & a2_mask]);
                DB (if (i) printf(", ");
                    pconst(&rv->co.val[i], TYPE_BASE_BOOLEAN);)
            }
            DB(printf("\n");)
            break;
        case GT_OP:
        case GT_V_OP:
        case GT_SV_OP:
        case GT_VS_OP:
            cmpfn = runtime_ops[base]->op_gt;
            op_offset = fexpr->bin.op - GT_OP;
            goto normal_cmpop;
        case LE_OP:
        case LE_V_OP:
        case LE_SV_OP:
        case LE_VS_OP:
            cmpfn = runtime_ops[base]->op_le;
            op_offset = fexpr->bin.op - LE_OP;
            goto normal_cmpop;
        case GE_OP:
        case GE_V_OP:
        case GE_SV_OP:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区综合| 自拍偷拍亚洲欧美日韩| 欧美精选午夜久久久乱码6080| 成人av网站在线观看| 久久国产人妖系列| 麻豆精品一区二区三区| 日韩av中文在线观看| 亚洲一区免费在线观看| 美女国产一区二区| 成人午夜激情片| 日本高清视频一区二区| 欧美日韩国产一二三| 欧美一区二区人人喊爽| 欧美大白屁股肥臀xxxxxx| 欧美va亚洲va在线观看蝴蝶网| 久久久一区二区三区| 国产精品国产三级国产aⅴ入口| 亚洲欧美激情一区二区| 日韩不卡手机在线v区| 成人一区二区三区中文字幕| 91网站黄www| 久久久久久久综合日本| 亚洲欧美激情插| 精品一区二区三区视频在线观看| 国产精品99久久不卡二区| 91亚洲午夜精品久久久久久| 91麻豆精品国产91久久久使用方法| 久久久精品天堂| 爽好久久久欧美精品| www.激情成人| 久久久天堂av| 激情文学综合丁香| 日韩女优毛片在线| 亚洲va韩国va欧美va精品| 国产精品系列在线播放| 精品国产乱码久久久久久久久| 91麻豆精品国产91久久久资源速度 | 一区二区三区欧美亚洲| 成人午夜激情影院| 中文字幕免费在线观看视频一区| 午夜精品福利久久久| 欧日韩精品视频| 亚洲人成在线观看一区二区| 大尺度一区二区| 国产清纯白嫩初高生在线观看91 | 亚洲综合一二区| 色婷婷国产精品综合在线观看| 久久九九久久九九| 成人教育av在线| 亚洲欧美日韩一区二区三区在线观看| 粉嫩一区二区三区在线看| 国产精品人成在线观看免费| 成人av网站在线观看免费| 亚洲三级小视频| 欧美日韩亚洲高清一区二区| 日韩国产精品大片| 欧美激情综合五月色丁香| 色综合久久久久综合体桃花网| 亚洲最大成人综合| 日韩视频在线一区二区| 久久精品国产99久久6| 中文字幕不卡的av| 色狠狠色狠狠综合| 精品一区二区三区在线观看| 中文字幕精品一区二区三区精品| 在线观看www91| 国产精华液一区二区三区| 一区二区三区成人在线视频| 精品少妇一区二区| 欧洲日韩一区二区三区| 激情久久久久久久久久久久久久久久| 国产精品无码永久免费888| 欧美日韩免费高清一区色橹橹 | 欧美久久久久免费| 97久久精品人人做人人爽50路 | 欧美日韩国产乱码电影| 国产suv精品一区二区6| 美女尤物国产一区| 午夜久久久影院| 亚洲精品国产无天堂网2021| 久久人人爽人人爽| 日韩美一区二区三区| 欧美撒尿777hd撒尿| 欧美主播一区二区三区| 色妹子一区二区| 99久久国产综合精品麻豆| 国产精品一品视频| 成人一道本在线| 不卡欧美aaaaa| 99re这里都是精品| 懂色av中文一区二区三区| 国产一区二区三区在线观看精品| 蜜桃一区二区三区四区| 久久99蜜桃精品| 韩国视频一区二区| 懂色av一区二区三区免费观看| 激情六月婷婷综合| 99国产一区二区三精品乱码| 色又黄又爽网站www久久| 欧美色综合网站| 欧美一区二区三区男人的天堂| 欧美一区二区三区性视频| 欧美mv日韩mv国产网站| 中文字幕制服丝袜一区二区三区| 久久亚洲二区三区| 精品国产乱码久久久久久蜜臀| 国产亚洲污的网站| 精品999久久久| 欧美日韩免费一区二区三区 | 日韩手机在线导航| 国产亚洲精品7777| 亚洲成人午夜电影| 成人国产精品免费观看| 欧美一区二区三区免费在线看 | 久久国产人妖系列| 972aa.com艺术欧美| 欧美电影免费提供在线观看| 国产精品美女久久久久久| 日本亚洲视频在线| 欧美在线色视频| 中文字幕亚洲综合久久菠萝蜜| 一区二区高清视频在线观看| 久国产精品韩国三级视频| 日本精品一区二区三区四区的功能| 精品久久99ma| 一区二区三区欧美视频| 99久久精品免费看| 国产精品午夜免费| eeuss鲁一区二区三区| 久久久久国产精品人| 国产一区91精品张津瑜| 777奇米四色成人影色区| 亚洲第一av色| 欧美精品一二三| 夜夜精品视频一区二区| 色久优优欧美色久优优| 亚洲一卡二卡三卡四卡五卡| 色综合久久久久久久| 国产精品护士白丝一区av| 成人免费毛片片v| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲人成精品久久久久| 色综合激情五月| 视频一区二区国产| 制服视频三区第一页精品| 精品无人码麻豆乱码1区2区 | 免费视频一区二区| 精品国产伦一区二区三区观看体验| 美女免费视频一区| 国产精品污网站| 日韩一区二区三区观看| 成人一区二区三区中文字幕| 久久综合狠狠综合| 99国内精品久久| 日韩av电影免费观看高清完整版在线观看| 欧美日本国产视频| 国产.欧美.日韩| 亚洲精品伦理在线| 日韩精品自拍偷拍| 在线视频中文字幕一区二区| 精品一区二区三区免费观看| 久久天天做天天爱综合色| 色噜噜狠狠成人网p站| 国产一区二区主播在线| 亚洲一级片在线观看| 欧美精品一区二区高清在线观看| bt欧美亚洲午夜电影天堂| 视频一区在线播放| 一区二区在线观看av| 久久综合资源网| 精品久久久网站| 欧美精品少妇一区二区三区| 91免费观看视频在线| 成人黄色在线看| 白白色 亚洲乱淫| 韩国视频一区二区| 国产又黄又大久久| 久久电影网站中文字幕| 日韩电影一区二区三区四区| 五月综合激情网| 久久精品理论片| 美国三级日本三级久久99| 国产精品国产三级国产普通话三级| 成人成人成人在线视频| 午夜精品久久久| 裸体一区二区三区| 久久成人免费电影| 国产美女精品在线| 国产成人在线视频免费播放| 国产凹凸在线观看一区二区| 成人妖精视频yjsp地址| 一本久久综合亚洲鲁鲁五月天| 日本久久电影网| 欧美一二三四在线| 国产亚洲一区二区三区四区| √…a在线天堂一区| 日韩—二三区免费观看av| 国产一区二区伦理片| av电影在线观看一区| 欧美精品高清视频|