📄 gen68k.h
字号:
/* * C compiler * ========== * * Copyright 1989, 1990, 1991 Christoph van Wuellen. * Credits to Matthew Brandt. * All commercial rights reserved. * * This compiler may be redistributed as long there is no * commercial interest. The compiler must not be redistributed * without its full sources. This notice must stay intact. * * History: * * 1989 starting an 68000 C compiler, starting with material * originally by M. Brandt * 1990 68000 C compiler further bug fixes * started i386 port (December) * 1991 i386 port finished (January) * further corrections in the front end and in the 68000 * code generator. * The next port will be a SPARC port */#ifndef _GEN68K_H#define _GEN68K_Henum{ target_68000, target_68010, target_coldfire, target_68020, target_68030, target_68040};#ifdef COLDFIRE#define is_coldfire() (target_option == target_coldfire)#else
/*lint -emacro( (506), is_coldfire )*//*lint -emacro( (774), is_coldfire )*/
#define is_coldfire() 0#endifenum{ model_absolute, model_small, model_large};typedef unsigned int FLAGS;#define F_NONE ((FLAGS) 0U)#define F_DREG ((FLAGS) 1U) /* data register direct mode allowed */#define F_AREG ((FLAGS) 2U) /* address register direct mode allowed */#define F_FREG ((FLAGS) 4U) /* floating point register mode allowed */#define F_MEM ((FLAGS) 8U) /* memory alterable modes allowed */#define F_IMMED ((FLAGS) 16U) /* immediate mode allowed */#define F_VOL ((FLAGS) 32U) /* need volatile operand */#define F_NOVALUE ((FLAGS) 64U) /* dont need result value */#define F_USES ((FLAGS) 128U) /* need result value more than once */#define F_COLD ((FLAGS) 256U) /* coldfire requires long */ /* this forbids autoincrement modes */#define F_ALL ((FLAGS)(F_DREG | F_AREG | F_FREG | F_MEM | F_IMMED)) /* all modes allowed *//* The instructions *//* * The order of the branch instructions must not be changed * since array revcond[] in the peephole optimizer relies on * them. */enum e_op{ op_move, op_moveq, op_movea, op_add, op_addi, op_addq, op_adda, op_addx, op_sub, op_subi, op_subq, op_suba, op_subx, op_muls, op_mulu, op_divs, op_divu, op_and, op_or, op_eor, op_asl, op_lsr, op_jmp, op_jsr, op_bsr, op_movem, op_rts, op_rte, op_bra, op_beq, op_bne, op_blt, op_ble, op_bgt, op_bge, op_bhi, op_bhs, op_blo, op_bls, op_tst, op_ext, op_extb, op_lea, op_swap, op_neg, op_negx, op_not, op_cmp, op_cmpa, op_clr, op_link, op_unlk, op_pea, op_cmpi, op_dbra, op_asr, op_rol, op_ror, op_roxl, op_roxr, op_seq, op_sne, op_slt, op_sle, op_sgt, op_sge, op_shi, op_shs, op_slo, op_sls, op_nop,
op_trap,#ifdef FLOAT_IEEE op_fadd, op_fsub, op_fdiv, op_fmul, op_fcmp, op_fmove, op_fmovem,#endif /* FLOAT_IEEE */#ifdef ASM op_asm,#endif /* ASM */ op_line, op_label};#define OP_MIN op_move#define OP_MAX op_label/* addressing modes */enum e_am{ am_dreg, /* Dn */ am_areg, /* An */ am_ind, /* (An) */ am_ainc, /* (An)+ */ am_adec, /* -(An) */ am_indx, /* (d16,An) */ am_indx2, /* (d8,An,Dn.l) */ am_indx3, /* (d8,An,Am.l) */ am_indx4, /* (d8,An,Dn.w) */ am_indxpc, /* (d16,PC) */ am_indx2pc, /* (d8,An,PC) */ am_direct, /* (xxx) */ am_immed, /* #(data) */ am_smask, /* Register mask (D0 high, A7 low) */ am_rmask, /* Register mask (A7 high, D0 low) */ am_freg, /* Floating Pointer Register FPn */ am_none, am_mreg, /* Dn/Dm */ am_xreg, /* Dn/Dm/Dl */ am_str, /* string */ am_line /* pseudo mode for line numbers */};/* register naming, special registers */#define D0 ((REG) 0) /* D0 register */#define D1 ((REG) 1) /* D1 register */#define D2 ((REG) 2) /* D2 register */#define D3 ((REG) 3) /* D3 register */#define D4 ((REG) 4) /* D4 register */#define D5 ((REG) 5) /* D5 register */#define D6 ((REG) 6) /* D6 register */#define D7 ((REG) 7) /* D7 register */#define A0 ((REG) 8) /* A0 register */#define A1 ((REG) 9) /* A1 register */#define A2 ((REG) 10) /* A2 register */#define A3 ((REG) 11) /* A3 register */#define A4 ((REG) 12) /* A4 register */#define A5 ((REG) 13) /* A5 register */#define A6 ((REG) 14) /* A6 register */#define A7 ((REG) 15) /* A7 register */#define FP0 ((REG) 16) /* FP0 register */#define FP1 ((REG) 17) /* FP1 register */#define FP2 ((REG) 18) /* FP2 register */#define FP3 ((REG) 19) /* FP3 register */#define FP4 ((REG) 20) /* FP4 register */#define FP5 ((REG) 21) /* FP5 register */#define FP6 ((REG) 22) /* FP6 register */#define FP7 ((REG) 23) /* FP7 register */#define REG_MEMORY ((REG) 24) /* special flag for peephole optimizer */#define NUM_REGS 24 /* number of distinct registers */#define DATAPTR A5 /* global data pointer register */#define FRAMEPTR A6 /* frame pointer register */#define STACKPTR A7 /* system stack pointer register */#ifdef FLOAT_IEEE#define MAX_REG FP7#else#define MAX_REG A7#endif /* FLOAT_IEEE */#define MAX_REG_STACK ((DEEP)30)#define UNUSED ((DEEP)-1)#define EMPTY ((DEEP)0)/* * Defines what the register can be used for */#define D_REG ((REGTYPE)1) /* data register */#define A_REG ((REGTYPE)2) /* address register */#define F_REG ((REGTYPE)4) /* float register */#define T_REG ((REGTYPE)8) /* temporary register */#define is_data_register(r) ((regtype[(int)r] & D_REG) != (REGTYPE)0)#define is_address_register(r) ((regtype[(int)r] & A_REG) != (REGTYPE)0)#define is_float_register(r) ((regtype[(int)r] & F_REG) != (REGTYPE)0)#define is_temporary_register(r) ((regtype[(int)r] & T_REG) != (REGTYPE)0)#define is_temporary_data_register(r) ((regtype[(int)r] & (D_REG|T_REG)) == (D_REG|T_REG))#define is_temporary_address_register(r) ((regtype[(int)r] & (A_REG|T_REG)) == (A_REG|T_REG))#define is_temporary_float_register(r) ((regtype[(int)r] & (F_REG|T_REG)) == (F_REG|T_REG))#define set_temporary_register(r) (regtype[(int)r] |= T_REG)typedef unsigned char REGTYPE;/* support routines */#define SUP_DATA (const CHAR *)".Xdata"#define SUP_ASLDIV (const CHAR *)".Xasldiv"#define SUP_ASLLDIV (const CHAR *)".Xaslldiv"#define SUP_ASLLLSH (const CHAR *)".Xaslllsh"#define SUP_ASLMUL (const CHAR *)".Xaslmul"#define SUP_ASLLMUL (const CHAR *)".Xasllmul"#define SUP_ASLREM (const CHAR *)".Xaslrem"#define SUP_ASLLREM (const CHAR *)".Xasllrem"#define SUP_ASLLRSH (const CHAR *)".Xasllrsh"#define SUP_ASOPL (const CHAR *)".Ybfasop"#define SUP_ASULDIV (const CHAR *)".Xasuldiv"#define SUP_ASULLDIV (const CHAR *)".Xasulldiv"#define SUP_ASULLLSH (const CHAR *)".Xasulllsh"#define SUP_ASULMUL (const CHAR *)".Xasulmul"#define SUP_ASULLMUL (const CHAR *)".Xasullmul"#define SUP_ASULREM (const CHAR *)".Xasulrem"#define SUP_ASULLREM (const CHAR *)".Xasullrem"#define SUP_ASULLRSH (const CHAR *)".Xasullrsh"#define SUP_LDIV (const CHAR *)".Xldiv"#define SUP_LLDIV (const CHAR *)".Xlldiv"#define SUP_LLLSH (const CHAR *)".Xlllsh"#define SUP_LMUL (const CHAR *)".Xlmul"#define SUP_LLMUL (const CHAR *)".Xllmul"#define SUP_LREM (const CHAR *)".Xlrem"#define SUP_LLREM (const CHAR *)".Xllrem"#define SUP_LLRSH (const CHAR *)".Xllrsh"#define SUP_ULDIV (const CHAR *)".Xuldiv"#define SUP_ULLDIV (const CHAR *)".Xulldiv"#define SUP_ULLLSH (const CHAR *)".Xulllsh"#define SUP_ULMUL (const CHAR *)".Xulmul"#define SUP_ULLMUL (const CHAR *)".Xullmul"#define SUP_ULREM (const CHAR *)".Xulrem"#define SUP_ULLREM (const CHAR *)".Xullrem"#define SUP_ULLRSH (const CHAR *)".Xullrsh"#ifdef FLOAT_IEEE#define SUP_ASDFADD (const CHAR *)".Yasdfadd"#define SUP_ASDFDIV (const CHAR *)".Yasdfdiv"#define SUP_ASDIVDC (const CHAR *)".Yasdivdc"#define SUP_ASDIVDF (const CHAR *)".Yasdivdf"#define SUP_ASDIVLC (const CHAR *)".Yasdivlc"#define SUP_ASDIVSC (const CHAR *)".Yasdivsc"#define SUP_ASDFMUL (const CHAR *)".Yasdfmul"#define SUP_ASMULDC (const CHAR *)".Yasmuldc"#define SUP_ASMULDF (const CHAR *)".Yasmuldf"#define SUP_ASMULLC (const CHAR *)".Yasmullc"#define SUP_ASMULSC (const CHAR *)".Yasmulsc"#define SUP_ASMULSF (const CHAR *)".Yasmulsf"#define SUP_ASDFSUB (const CHAR *)".Yasdfsub"#define SUP_ASLFADD (const CHAR *)".Yaslfadd"#define SUP_ASLFDIV (const CHAR *)".Yaslfdiv"#define SUP_ASDIVLF (const CHAR *)".Yasdivlf"#define SUP_ASLFMUL (const CHAR *)".Yaslfmul"#define SUP_ASMULLF (const CHAR *)".Yaslfmullf"#define SUP_ASLFSUB (const CHAR *)".Yaslfsub"#define SUP_ASDCADD (const CHAR *)".Yasdcadd"#define SUP_ASDCDIV (const CHAR *)".Yasdcdiv"#define SUP_ASDCMUL (const CHAR *)".Yasdcmul"#define SUP_ASDCSUB (const CHAR *)".Yasdcsub"#define SUP_ASLCADD (const CHAR *)".Yaslcadd"#define SUP_ASLCDIV (const CHAR *)".Yaslcdiv"#define SUP_ASLCMUL (const CHAR *)".Yaslcmul"#define SUP_ASLCSUB (const CHAR *)".Yaslcsub"#define SUP_ASSCADD (const CHAR *)".Yasscadd"#define SUP_ASSCDIV (const CHAR *)".Yasscdiv"#define SUP_ASSCMUL (const CHAR *)".Yasscmul"#define SUP_ASSCSUB (const CHAR *)".Yasscsub"#define SUP_ASSFSUB (const CHAR *)".Yassfsub"#define SUP_ASSFADD (const CHAR *)".Yassfadd"#define SUP_ASSFDIV (const CHAR *)".Yassfdiv"#define SUP_ASDIVSF (const CHAR *)".Yasdivsf"#define SUP_ASSFMUL (const CHAR *)".Yassfmul"#define SUP_DCADD (const CHAR *)".Ydcadd"#define SUP_DCDIV (const CHAR *)".Ydcdiv"#define SUP_DCINC (const CHAR *)".Ydcinc"#define SUP_DCLTODC (const CHAR *)".Ydcltodc"#define SUP_DCLLTODC (const CHAR *)".Ydclltodc"#define SUP_DCMUL (const CHAR *)".Ydcmul"#define SUP_DCNEG (const CHAR *)".Ydcneg"#define SUP_DCSUB (const CHAR *)".Ydcsub"#define SUP_DCTODF (const CHAR *)".Ydctodf"#define SUP_DCTOL (const CHAR *)".Ydctol"#define SUP_DCTOLC (const CHAR *)".Ydctolc"#define SUP_DCTOLF (const CHAR *)".Ydctolf"#define SUP_DCTOLL (const CHAR *)".Ydctoll"#define SUP_DCTOSC (const CHAR *)".Ydctosc"#define SUP_DCTOSF (const CHAR *)".Ydctosf"#define SUP_DCTOUL (const CHAR *)".Ydctoul"#define SUP_DCTOULL (const CHAR *)".Ydctoull"#define SUP_DCUTODC (const CHAR *)".Ydcutodc"#define SUP_DCULLTODC (const CHAR *)".Ydculltodc"#define SUP_DFADD (const CHAR *)".Ydfadd"#define SUP_DFCMP (const CHAR *)".Xdfcmp"#define SUP_DFDEC (const CHAR *)".Ydfdec"#define SUP_DFDIV (const CHAR *)".Ydfdiv"#define SUP_DFINC (const CHAR *)".Ydfinc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -