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

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

?? i386-gen.c

?? 小而快的c編譯器
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  X86 code generator for TCC *  *  Copyright (c) 2001, 2002, 2003 Fabrice Bellard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* number of available registers */#define NB_REGS             4/* a register can belong to several classes. The classes must be   sorted from more general to more precise (see gv2() code which does   assumptions on it). */#define RC_INT     0x0001 /* generic integer register */#define RC_FLOAT   0x0002 /* generic float register */#define RC_EAX     0x0004#define RC_ST0     0x0008 #define RC_ECX     0x0010#define RC_EDX     0x0020#define RC_IRET    RC_EAX /* function return: integer register */#define RC_LRET    RC_EDX /* function return: second integer register */#define RC_FRET    RC_ST0 /* function return: float register *//* pretty names for the registers */enum {    TREG_EAX = 0,    TREG_ECX,    TREG_EDX,    TREG_ST0,};int reg_classes[NB_REGS] = {    /* eax */ RC_INT | RC_EAX,    /* ecx */ RC_INT | RC_ECX,    /* edx */ RC_INT | RC_EDX,    /* st0 */ RC_FLOAT | RC_ST0,};/* return registers for function */#define REG_IRET TREG_EAX /* single word int return register */#define REG_LRET TREG_EDX /* second word return register (for long long) */#define REG_FRET TREG_ST0 /* float return register *//* defined if function parameters must be evaluated in reverse order */#define INVERT_FUNC_PARAMS/* defined if structures are passed as pointers. Otherwise structures   are directly pushed on stack. *///#define FUNC_STRUCT_PARAM_AS_PTR/* pointer size, in bytes */#define PTR_SIZE 4/* long double size and alignment, in bytes */#define LDOUBLE_SIZE  12#define LDOUBLE_ALIGN 4/* maximum alignment (for aligned attribute support) */#define MAX_ALIGN     8/* relocation type for 32 bit data relocation */#define R_DATA_32 R_386_32/******************************************************/static unsigned long func_sub_sp_offset;static unsigned long func_bound_offset;static int func_ret_sub;/* XXX: make it faster ? */void g(int c){    int ind1;    ind1 = ind + 1;    if (ind1 > cur_text_section->data_allocated)        section_realloc(cur_text_section, ind1);    cur_text_section->data[ind] = c;    ind = ind1;}void o(int c){    while (c) {        g(c);        c = c / 256;    }}void gen_le32(int c){    g(c);    g(c >> 8);    g(c >> 16);    g(c >> 24);}/* output a symbol and patch all calls to it */void gsym_addr(int t, int a){    int n, *ptr;    while (t) {        ptr = (int *)(cur_text_section->data + t);        n = *ptr; /* next value */        *ptr = a - t - 4;        t = n;    }}void gsym(int t){    gsym_addr(t, ind);}/* psym is used to put an instruction with a data field which is a   reference to a symbol. It is in fact the same as oad ! */#define psym oad/* instruction + 4 bytes data. Return the address of the data */static int oad(int c, int s){    int ind1;    o(c);    ind1 = ind + 4;    if (ind1 > cur_text_section->data_allocated)        section_realloc(cur_text_section, ind1);    *(int *)(cur_text_section->data + ind) = s;    s = ind;    ind = ind1;    return s;}/* output constant with relocation if 'r & VT_SYM' is true */static void gen_addr32(int r, Sym *sym, int c){    if (r & VT_SYM)        greloc(cur_text_section, sym, ind, R_386_32);    gen_le32(c);}/* generate a modrm reference. 'op_reg' contains the addtionnal 3   opcode bits */static void gen_modrm(int op_reg, int r, Sym *sym, int c){    op_reg = op_reg << 3;    if ((r & VT_VALMASK) == VT_CONST) {        /* constant memory reference */        o(0x05 | op_reg);        gen_addr32(r, sym, c);    } else if ((r & VT_VALMASK) == VT_LOCAL) {        /* currently, we use only ebp as base */        if (c == (char)c) {            /* short reference */            o(0x45 | op_reg);            g(c);        } else {            oad(0x85 | op_reg, c);        }    } else {        g(0x00 | op_reg | (r & VT_VALMASK));    }}/* load 'r' from value 'sv' */void load(int r, SValue *sv){    int v, t, ft, fc, fr;    SValue v1;    fr = sv->r;    ft = sv->type.t;    fc = sv->c.ul;    v = fr & VT_VALMASK;    if (fr & VT_LVAL) {        if (v == VT_LLOCAL) {            v1.type.t = VT_INT;            v1.r = VT_LOCAL | VT_LVAL;            v1.c.ul = fc;            load(r, &v1);            fr = r;        }        if ((ft & VT_BTYPE) == VT_FLOAT) {            o(0xd9); /* flds */            r = 0;        } else if ((ft & VT_BTYPE) == VT_DOUBLE) {            o(0xdd); /* fldl */            r = 0;        } else if ((ft & VT_BTYPE) == VT_LDOUBLE) {            o(0xdb); /* fldt */            r = 5;        } else if ((ft & VT_TYPE) == VT_BYTE) {            o(0xbe0f);   /* movsbl */        } else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED)) {            o(0xb60f);   /* movzbl */        } else if ((ft & VT_TYPE) == VT_SHORT) {            o(0xbf0f);   /* movswl */        } else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED)) {            o(0xb70f);   /* movzwl */        } else {            o(0x8b);     /* movl */        }        gen_modrm(r, fr, sv->sym, fc);    } else {        if (v == VT_CONST) {            o(0xb8 + r); /* mov $xx, r */            gen_addr32(fr, sv->sym, fc);        } else if (v == VT_LOCAL) {            o(0x8d); /* lea xxx(%ebp), r */            gen_modrm(r, VT_LOCAL, sv->sym, fc);        } else if (v == VT_CMP) {            oad(0xb8 + r, 0); /* mov $0, r */            o(0x0f); /* setxx %br */            o(fc);            o(0xc0 + r);        } else if (v == VT_JMP || v == VT_JMPI) {            t = v & 1;            oad(0xb8 + r, t); /* mov $1, r */            o(0x05eb); /* jmp after */            gsym(fc);            oad(0xb8 + r, t ^ 1); /* mov $0, r */        } else if (v != r) {            o(0x89);            o(0xc0 + r + v * 8); /* mov v, r */        }    }}/* store register 'r' in lvalue 'v' */void store(int r, SValue *v){    int fr, bt, ft, fc;    ft = v->type.t;    fc = v->c.ul;    fr = v->r & VT_VALMASK;    bt = ft & VT_BTYPE;    /* XXX: incorrect if float reg to reg */    if (bt == VT_FLOAT) {        o(0xd9); /* fsts */        r = 2;    } else if (bt == VT_DOUBLE) {        o(0xdd); /* fstpl */        r = 2;    } else if (bt == VT_LDOUBLE) {        o(0xc0d9); /* fld %st(0) */        o(0xdb); /* fstpt */        r = 7;    } else {        if (bt == VT_SHORT)            o(0x66);        if (bt == VT_BYTE)            o(0x88);        else            o(0x89);    }    if (fr == VT_CONST ||        fr == VT_LOCAL ||        (v->r & VT_LVAL)) {        gen_modrm(r, v->r, v->sym, fc);    } else if (fr != r) {        o(0xc0 + fr + r * 8); /* mov r, fr */    }}static void gadd_sp(int val){    if (val == (char)val) {        o(0xc483);        g(val);    } else {        oad(0xc481, val); /* add $xxx, %esp */    }}/* 'is_jmp' is '1' if it is a jump */static void gcall_or_jmp(int is_jmp){    int r;    if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {        /* constant case */        if (vtop->r & VT_SYM) {            /* relocation case */            greloc(cur_text_section, vtop->sym,                    ind + 1, R_386_PC32);        } else {            /* put an empty PC32 relocation */            put_elf_reloc(symtab_section, cur_text_section,                           ind + 1, R_386_PC32, 0);        }        oad(0xe8 + is_jmp, vtop->c.ul - 4); /* call/jmp im */    } else {        /* otherwise, indirect call */        r = gv(RC_INT);        o(0xff); /* call/jmp *r */        o(0xd0 + r + (is_jmp << 4));    }}/* Generate function call. The function address is pushed first, then   all the parameters in call order. This functions pops all the   parameters and the function address. */void gfunc_call(int nb_args){    int size, align, r, args_size, i;    Sym *func_sym;        args_size = 0;    for(i = 0;i < nb_args; i++) {        if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {            size = type_size(&vtop->type, &align);            /* align to stack align size */            size = (size + 3) & ~3;            /* allocate the necessary size on stack */            oad(0xec81, size); /* sub $xxx, %esp */            /* generate structure store */            r = get_reg(RC_INT);            o(0x89); /* mov %esp, r */            o(0xe0 + r);            vset(&vtop->type, r | VT_LVAL, 0);            vswap();            vstore();            args_size += size;        } else if (is_float(vtop->type.t)) {            gv(RC_FLOAT); /* only one float register */            if ((vtop->type.t & VT_BTYPE) == VT_FLOAT)                size = 4;            else if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE)                size = 8;            else                size = 12;            oad(0xec81, size); /* sub $xxx, %esp */            if (size == 12)                o(0x7cdb);            else                o(0x5cd9 + size - 4); /* fstp[s|l] 0(%esp) */            g(0x24);            g(0x00);            args_size += size;        } else {            /* simple type (currently always same size) */            /* XXX: implicit cast ? */            r = gv(RC_INT);            if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {                size = 8;                o(0x50 + vtop->r2); /* push r */            } else {                size = 4;            }            o(0x50 + r); /* push r */            args_size += size;        }        vtop--;    }    save_regs(0); /* save used temporary registers */    func_sym = vtop->type.ref;    gcall_or_jmp(0);    if (args_size && func_sym->r == FUNC_CDECL)        gadd_sp(args_size);    vtop--;}/* generate function prolog of type 't' */void gfunc_prolog(CType *func_type){    int addr, align, size, func_call;    Sym *sym;    CType *type;    sym = func_type->ref;    func_call = sym->r;    addr = 8;    /* if the function returns a structure, then add an       implicit pointer parameter */    func_vt = sym->type;    if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {        func_vc = addr;        addr += 4;    }    /* define parameters */    while ((sym = sym->next) != NULL) {        type = &sym->type;        sym_push(sym->v & ~SYM_FIELD, type,                 VT_LOCAL | VT_LVAL, addr);        size = type_size(type, &align);        size = (size + 3) & ~3;#ifdef FUNC_STRUCT_PARAM_AS_PTR        /* structs are passed as pointer */        if ((type->t & VT_BTYPE) == VT_STRUCT) {            size = 4;        }#endif        addr += size;    }    func_ret_sub = 0;    /* pascal type call ? */    if (func_call == FUNC_STDCALL)        func_ret_sub = addr - 8;    o(0xe58955); /* push   %ebp, mov    %esp, %ebp */    func_sub_sp_offset = oad(0xec81, 0); /* sub $xxx, %esp */    /* leave some room for bound checking code */    if (do_bounds_check) {        oad(0xb8, 0); /* lbound section pointer */        oad(0xb8, 0); /* call to function */        func_bound_offset = lbounds_section->data_offset;    }}/* generate function epilog */void gfunc_epilog(void){#ifdef CONFIG_TCC_BCHECK    if (do_bounds_check && func_bound_offset != lbounds_section->data_offset) {        int saved_ind;        int *bounds_ptr;        Sym *sym, *sym_data;        /* add end of table info */        bounds_ptr = section_ptr_add(lbounds_section, sizeof(int));        *bounds_ptr = 0;        /* generate bound local allocation */        saved_ind = ind;        ind = func_sub_sp_offset + 4;        sym_data = get_sym_ref(&char_pointer_type, lbounds_section,                                func_bound_offset, lbounds_section->data_offset);        greloc(cur_text_section, sym_data,               ind + 1, R_386_32);        oad(0xb8, 0); /* mov %eax, xxx */        sym = external_global_sym(TOK___bound_local_new, &func_old_type, 0);        greloc(cur_text_section, sym,                ind + 1, R_386_PC32);        oad(0xe8, -4);        ind = saved_ind;        /* generate bound check local freeing */        o(0x5250); /* save returned value, if any */        greloc(cur_text_section, sym_data,               ind + 1, R_386_32);        oad(0xb8, 0); /* mov %eax, xxx */        sym = external_global_sym(TOK___bound_local_delete, &func_old_type, 0);        greloc(cur_text_section, sym,                ind + 1, R_386_PC32);        oad(0xe8, -4);        o(0x585a); /* restore returned value, if any */    }#endif    o(0xc9); /* leave */    if (func_ret_sub == 0) {        o(0xc3); /* ret */    } else {        o(0xc2); /* ret n */        g(func_ret_sub);        g(func_ret_sub >> 8);    }    /* align local size to word & save local variables */    *(int *)(cur_text_section->data + func_sub_sp_offset) = (-loc + 3) & -4; }/* generate a jump to a label */int gjmp(int t){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲bt欧美bt精品| 三级欧美在线一区| 精品粉嫩aⅴ一区二区三区四区| 欧美日韩美少妇| 欧美日韩国产在线观看| 欧美一区二区在线免费播放| 9191久久久久久久久久久| 欧美一区二区成人6969| 精品入口麻豆88视频| 精品久久免费看| 国产亚洲欧美色| 中文字幕一区二区三| 亚洲综合一区二区精品导航| 婷婷激情综合网| 激情图片小说一区| 东方欧美亚洲色图在线| 91免费精品国自产拍在线不卡| 色诱亚洲精品久久久久久| 欧美视频精品在线| 精品国偷自产国产一区| 国产欧美日韩卡一| 亚洲一卡二卡三卡四卡五卡| 久久国产视频网| 欧美性生活影院| 欧美一级一区二区| 国产精品美女一区二区| 亚洲午夜三级在线| 极品美女销魂一区二区三区免费| 国产成人av一区二区| 欧美中文字幕一区二区三区亚洲 | 国产一区二区三区久久久 | 欧美韩日一区二区三区四区| 国产精品国产自产拍在线| 性做久久久久久久免费看| 国产91丝袜在线观看| 在线不卡的av| 国产精品国产三级国产普通话99 | 精品制服美女丁香| 91猫先生在线| 久久美女高清视频| 亚洲一区二区三区在线播放| 国产精品中文字幕日韩精品| 在线一区二区三区四区| 久久久精品2019中文字幕之3| 亚洲女性喷水在线观看一区| 精品一区二区三区久久久| 欧美午夜一区二区| 国产精品久久久久影院老司| 日韩成人精品视频| 欧美性感一区二区三区| 日本一区二区三区高清不卡| 蜜桃av一区二区在线观看| 91免费精品国自产拍在线不卡| 久久久久久免费| 美女诱惑一区二区| 欧美疯狂性受xxxxx喷水图片| 中文字幕日韩一区二区| 国产福利一区二区三区视频在线| 欧美一区二区不卡视频| 午夜视频在线观看一区二区三区| 成人高清视频免费观看| 国产日韩欧美一区二区三区乱码| 日韩电影在线免费观看| 欧美日韩在线直播| 亚洲国产综合色| 在线亚洲欧美专区二区| 亚洲精品国久久99热| 成人国产精品视频| 中文字幕一区免费在线观看| 国产99久久久国产精品潘金网站| 精品国产乱子伦一区| 老司机免费视频一区二区 | 国产精品888| 国产人成亚洲第一网站在线播放 | 最新国产成人在线观看| 99精品欧美一区二区三区小说 | 水蜜桃久久夜色精品一区的特点 | 欧美成人一级视频| 美女www一区二区| 国产婷婷精品av在线| 成人小视频在线| 国产精品电影一区二区| 91麻豆国产福利在线观看| 一色屋精品亚洲香蕉网站| 91色九色蝌蚪| 亚洲成av人在线观看| 91精品国产手机| 国产一区二区中文字幕| 国产精品午夜春色av| 99久久精品久久久久久清纯| 成人欧美一区二区三区黑人麻豆 | 久久久国产综合精品女国产盗摄| 国产精品一区二区91| 国产精品久久三| 欧美人妖巨大在线| 国产精品1024久久| 亚洲免费看黄网站| 日韩欧美高清一区| 成人成人成人在线视频| 午夜精品久久久| 国产亚洲欧洲997久久综合 | 亚洲欧美日韩国产一区二区三区| 在线观看av一区| 麻豆成人91精品二区三区| 欧美激情资源网| 91精品国产综合久久福利软件| 激情综合网激情| 亚洲一区二区三区四区在线观看| 欧美一级在线观看| www.日韩精品| 免费欧美日韩国产三级电影| 中文字幕中文字幕在线一区| 欧美一级久久久| 91久久人澡人人添人人爽欧美 | 成人手机电影网| 日日夜夜免费精品| 亚洲欧洲另类国产综合| 日韩一级黄色片| 在线亚洲免费视频| 岛国精品在线观看| 久久99精品国产| 亚洲国产成人高清精品| 国产精品久久久久毛片软件| 欧美岛国在线观看| 欧美日韩在线播| 91丨porny丨户外露出| 国产伦精品一区二区三区视频青涩| 一区二区三区波多野结衣在线观看| 久久久久国产精品麻豆| 欧美一区二区精品久久911| 欧洲av在线精品| 91猫先生在线| www.66久久| 懂色av中文一区二区三区| 蜜桃一区二区三区四区| 水野朝阳av一区二区三区| 亚洲第一狼人社区| 一区二区三区成人在线视频 | 欧美唯美清纯偷拍| 91蜜桃在线免费视频| kk眼镜猥琐国模调教系列一区二区| 狠狠色丁香婷婷综合久久片| 麻豆国产精品777777在线| 日韩av在线发布| 麻豆高清免费国产一区| 成人动漫在线一区| 国产成人av电影在线观看| 国产老妇另类xxxxx| 国产麻豆精品95视频| 国产不卡一区视频| 成人一区在线观看| 91在线看国产| 97精品视频在线观看自产线路二| 成人av在线资源网| 91福利国产精品| 欧美日韩免费不卡视频一区二区三区 | 欧美丰满高潮xxxx喷水动漫| 欧美日韩你懂得| 91精品国产综合久久婷婷香蕉| 欧美一区二区三区四区五区| 欧美videos大乳护士334| 久久综合九色综合欧美亚洲| 久久精品一级爱片| 亚洲手机成人高清视频| 艳妇臀荡乳欲伦亚洲一区| 亚洲午夜电影网| 免费看欧美女人艹b| 国产一区三区三区| 99久久99精品久久久久久| 在线观看www91| 精品国免费一区二区三区| 中文字幕电影一区| 亚洲综合在线观看视频| 蜜桃在线一区二区三区| 国产**成人网毛片九色| 日本精品视频一区二区三区| 亚洲色图欧美偷拍| 午夜不卡在线视频| 国产精品资源网站| 99视频在线精品| 欧美日本精品一区二区三区| 欧美大肚乱孕交hd孕妇| 中文字幕在线视频一区| 视频在线在亚洲| 国产一区二区成人久久免费影院| 成人黄色av电影| 91精品国产91久久久久久一区二区 | 国产欧美一区在线| 夜夜操天天操亚洲| 国产麻豆成人精品| 欧美三级日本三级少妇99| 久久综合给合久久狠狠狠97色69| 亚洲免费观看高清完整版在线观看| 奇米影视7777精品一区二区| 成人免费看的视频| 欧美mv日韩mv亚洲| 亚洲444eee在线观看| caoporn国产一区二区| 精品国产欧美一区二区| 亚洲最新视频在线播放|