⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iexpr.h

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 H
字号:
/* 
Copyright 1994-2003 Free Software Foundation, Inc.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  

This program is derived from the cc68k complier by 
Matthew Brandt (mattb@walkingdog.net) 

You may contact the author of this derivative at:

mailto::camille@bluegrass.net

or by snail mail at:

David Lindauer
850 Washburn Ave Apt 99
Louisville, KY 40222
 */
/*
 * iexpr.h
 *
 * ICODE structures
 */

#define F_ADDR 1
#define F_NOVALUE 2
#define F_VOL 4

/* icode innstruction opcodes */
enum i_ops
{
        /* note, the branches MUST be higher in the ordering than the sets */
    	i_nop, i_line, i_passthrough, i_label, i_goto, i_gosub, i_fargosub, i_trap, i_int, i_ret,
        i_rett, i_add, i_sub, i_udiv, i_umod, i_sdiv, i_smod, i_umul, i_smul,
        i_lsl, i_lsr, i_asl, i_asr, i_neg, i_not, i_and, i_or, i_eor, 
        i_asadd, i_assub, i_asudiv, i_asumod, i_assdiv, i_assmod, i_asumul, i_assmul,
        i_aslsl, i_aslsr, i_asasl, i_asasr, i_asand, i_asor, i_aseor, i_asuminus, i_ascompl,
        i_setne, i_sete, i_setc, i_seta, i_setnc, i_setbe, i_setl, i_setg, i_setle,
        i_setge, i_assn, i_genword, i_coswitch, i_swbranch, i_dc, i_assnblock, i_clrblock, i_jc, i_ja,
        i_je, i_jnc, i_jbe, i_jne, i_jl, i_jg, i_jle, i_jge, i_parm, i_parmadj, i_parmblock,
        i_array, i_arrayindex, i_cppini, i_block, i_livein, i_icon, i_fcon, i_imcon, i_cxcon, 
		i_prologue, i_epilogue, i_blockstart, i_blockend, i_pushcontext, i_popcontext, i_loadcontext,
        i_substack,
    /* Dag- specific stuff */
    	i_var, i_const, i_ptr, i_labcon, 
        /* end marker */
        i_endoflist
};

/* icode address modes annd special regs */
enum i_adr
{
    i_none, i_immed, i_direct, i_ind, i_bf, i_specialreg, 
    /* special named nodes come AFTER rsp for no bugs */
    i_rsp, i_rret, i_this, i_rlink, i_rstruct, i_rstructstar
};
/*
 * structure for startup/rundown records (used in #pragma ) 
 */
typedef struct _startup
{
    struct _startup *link;
    char *name; /* name */
    int val; /* prio */
} STARTUP;

/*
 * address mode
 */
typedef struct _imode_
{
    enum i_adr mode; /* mode */
    int useindx;
    char size; /* size */
    char startbit, bits; /* bit width  for i_Bf*/
    char vol; /* TRUE if is a node for a volatile var */
	char restricted; /* TRUE if pointer type is set to restricted */
	char seg;	/* seg reg  for segmented architectures */
    struct enode *offset; /* offset */
}

//-------------------------------------------------------------------------

IMODE;

#define IM_LIVELEFT 1
#define IM_LIVERIGHT 2
/*
 * icode node
 * this is also used for dag nodes
 */

typedef struct quad
{
    struct _basic_dag
    {
        enum i_ops opcode; /* opcode */
        IMODE *left; /* ans = left opcode right */
        /* for a i_label node, left is the label nnumber cast
         * to a imode* */
        IMODE *right;
        union ival
        {
             /* values for constant nodes */
            LLONG_TYPE i;
            long double f;
			struct {
				long double r;
				long double i;
			} c;
        } v;
        long label; /* aux values used by i_coswitch */
    }
    dc;
    char livein;
	struct quad *fwd, *back;
    IMODE *ans;
    int definition;
    int available;
    int sourceindx;
    int copy;
}

//-------------------------------------------------------------------------

QUAD;

#define DAGCOMPARE sizeof(struct _basic_dag)
#define DAGSIZE 1023

/* constant node combinattions:
 * ic = prefix
 * l = int
 * r = real
 * i = imaginary
 * c = complex
 */
enum e_icmode {
	icnone,icnl,icnr,icni,icnc, 
	icln,icll,iclr,icli,iclc, 
	icrn,icrl,icrr,icri,icrc,
	icin,icil,icir,icii,icic,
	iccn,iccl,iccr,icci,iccc
};
struct cases {
    LLONG_TYPE bottom;
    LLONG_TYPE top;
    int count;
    int deflab;
    int tablepos;
    int diddef : 1;
    struct caseptrs {
        int label;
        int binlabel;
        LLONG_TYPE id;
    } *ptrs;
} ;

#include "iexpr.p"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -