GEN68.H
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:6k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21. /*
  22.  *      code generation structures and constants
  23.  */
  24. /* address mode specifications */
  25. #define F_DREG  1       /* data register direct mode allowed */
  26. #define F_AREG  2       /* address register direct mode allowed */
  27. #define F_MEM   4       /* memory alterable modes allowed */
  28. #define F_IMMED 8       /* immediate mode allowed */
  29. #define F_ALT   7       /* alterable modes */
  30. #define F_DALT  5       /* data alterable modes */
  31. #define F_FREG  16   /* FP register */
  32. #define F_INDX  64 /* indexed memory alterable mode allowed */
  33. #define F_ALL   63      /* all modes allowed */
  34. #define F_VOL   128      /* need volitile operand */
  35. #define F_NOVALUE 256    /* dont need result value */
  36. #define F_NOBIT 512 /* Don't get the bit val, get the address */
  37. enum e_op {
  38.         op_reserved, op_line, op_seq, op_slit, op_label, op_funclabel, op_genword, 
  39. op_dcl,op_dcr,
  40. op_abcd,op_add,op_adda,op_addi,
  41. op_addq,op_addx,op_and,op_andi,op_asl,op_asr,
  42. op_bra,op_beq,op_bne,op_blt,op_ble,op_bgt,op_bge,
  43. op_bhi,op_bhs,op_blo,op_bls,op_bsr,op_bcc,
  44. op_bcs,op_bmi,op_bpl,op_bvc,op_bvs,op_bchg,
  45. op_bclr,op_bfchg,op_bfclr,op_bfexts,op_bfextu,op_bfffo,
  46. op_bfins,op_bfset,op_bftst,op_bkpt,op_bset,op_btst,
  47. op_chk,op_chk2,op_clr,op_cmp,op_cmpa,op_cmpi,
  48. op_cmpm,op_cmp2,op_dbeq,op_dbne,op_dblt,op_dble,op_dbgt,
  49. op_dbge,op_dbhi,op_dbhs,op_dblo,op_dbls,op_dbsr,
  50. op_dbcc,op_dbcs,op_dbmi,op_dbpl,op_dbvc,op_dbvs,
  51. op_dbt,op_dbf,op_dbra,op_divs,op_divu,op_divsl,
  52. op_divul,op_eor,op_eori,op_exg,op_ext,op_extb,
  53. op_illegal,op_jmp,op_jsr,op_lea,op_link,op_lsl,
  54. op_lsr,op_move,op_movea,op_movec,op_movem,op_movep,
  55. op_moveq,op_moves,op_muls,op_mulu,op_nbcd,op_neg,
  56. op_negx,op_nop,op_not,op_or,op_ori,op_pack,
  57. op_pea,op_reset,op_rol,op_ror,op_roxl,op_roxr,
  58. op_rtd,op_rte,op_rtr,op_rts,op_sbcd,op_seteq,
  59. op_setne,op_setlt,op_setle,op_setgt,op_setge,op_sethi,op_seths,
  60. op_setlo,op_setls,op_setsr,op_setcc,op_setcs,op_setmi,
  61. op_setpl,op_setvc,op_setvs,op_sett,op_setf,op_sub,
  62. op_stop,op_suba,op_subi,op_subq,op_subx,op_swap,
  63. op_tas,op_trap,op_trapeq,op_trapne,op_traplt,op_traple,op_trapgt,
  64. op_trapge,op_traphi,op_traphs,op_traplo,op_trapls,op_trapsr,
  65. op_trapcc,op_trapcs,op_trapmi,op_trappl,op_trapvc,op_trapvs,
  66. op_trapt,op_trapf,op_trapv,op_tst,op_unlk,op_unpk,
  67. op_fabs,op_facos,op_fadd,op_fasin,op_fatan,op_fatanh,
  68. op_fbeq,op_fbne,op_fbgt,op_fbngt,op_fbge,op_fbnge,
  69. op_fblt,op_fbnlt,op_fble,op_fbnle,op_fbgl,op_fbngl,
  70. op_fbgle,op_fbngle,op_fbogt,op_fbule,op_fboge,op_fbult,
  71. op_fbolt,op_fbuge,op_fbole,op_fbugt,op_fbogl,op_fbueq,
  72. op_fbor,op_fbun,op_fbt,op_fbf,op_fbst,op_fbsf,
  73. op_fbseq,op_fbsne,op_fcmp,op_fcos,op_fcosh,op_fdbeq,
  74. op_fdbne,op_fdbgt,op_fdbngt,op_fdbge,op_fdbnge,op_fdblt,
  75. op_fdbnlt,op_fdble,op_fdbnle,op_fdbgl,op_fdbngl,op_fdbgle,
  76. op_fdbngle,op_fdbogt,op_fdbule,op_fdboge,op_fdbult,op_fdbolt,
  77. op_fdbuge,op_fdbole,op_fdbugt,op_fdbogl,op_fdbueq,op_fdbor,
  78. op_fdbun,op_fdbt,op_fdbf,op_fdbst,op_fdbsf,op_fdbseq,
  79. op_fdbsne,op_fdiv,op_fetox,op_fetoxm1,op_fgetexp,op_fgetman,
  80. op_fint,op_fintrz,op_flog10,op_flog2,op_flogn,op_flognp1,
  81. op_fmod,op_fmove,op_fmovecr,op_fmovem,op_fmul,op_fneg,
  82. op_fnop,op_frem,op_fscale,op_fseq,op_fsne,op_fsgt,
  83. op_fsngt,op_fsge,op_fsnge,op_fslt,op_fsnlt,op_fsle,
  84. op_fsnle,op_fsgl,op_fsngl,op_fsgle,op_fsngle,op_fsogt,
  85. op_fsule,op_fsoge,op_fsult,op_fsolt,op_fsuge,op_fsole,
  86. op_fsugt,op_fsogl,op_fsueq,op_fsor,op_fsun,op_fst,
  87. op_fsf,op_fsst,op_fssf,op_fsseq,op_fssne,op_fsgldiv,
  88. op_fsglmul,op_fsin,op_fsincos,op_fsinh,op_fsqrt,op_fsub,
  89. op_ftan,op_ftanh,op_ftentox,op_ftrapeq,op_ftrapne,op_ftrapgt,
  90. op_ftrapngt,op_ftrapge,op_ftrapnge,op_ftraplt,op_ftrapnlt,op_ftraple,
  91. op_ftrapnle,op_ftrapgl,op_ftrapngl,op_ftrapgle,op_ftrapngle,op_ftrapogt,
  92. op_ftrapule,op_ftrapoge,op_ftrapult,op_ftrapolt,op_ftrapuge,op_ftrapole,
  93. op_ftrapugt,op_ftrapogl,op_ftrapueq,op_ftrapor,op_ftrapun,op_ftrapt,
  94. op_ftrapf,op_ftrapst,op_ftrapsf,op_ftrapseq,op_ftrapsne,op_ftst,
  95. op_ftwotox
  96. };
  97. enum e_am {
  98.         am_none, am_dreg, am_areg, am_freg, am_ind, am_ainc, am_adec, am_indx, am_baseindxaddr,
  99.         am_direct, am_adirect, am_immed, am_mask, am_fmask, am_baseindxdata, am_pcindx,
  100. am_divsl, am_bf, am_sr };
  101. /*      addressing mode structure       */
  102. struct amode {
  103.         enum e_am       mode;
  104.         char            preg;
  105.         char            sreg;
  106. char scale;
  107.         char            tempflag;
  108.         struct enode    *offset;
  109.         };
  110. /*      output code structure   */
  111. struct ocode {
  112.         struct ocode    *fwd, *back;
  113.         enum e_op       opcode;
  114.         short           length;
  115.         struct amode    *oper1, *oper2,*oper3;
  116. long addr;
  117. char noopt;
  118. char diag;
  119.         };
  120. /* Used for fixup gen */
  121. typedef struct dl {
  122. struct dl *next;
  123. SYM *sp;
  124. int offset;
  125. short type;
  126. } DATALINK;
  127. #define AMODE struct amode
  128. #define OCODE struct ocode
  129. enum e_gt { nogen, bytegen, wordgen, longgen, floatgen, doublegen, longdoublegen, srrefgen };
  130. enum e_sg { noseg, codeseg, dataseg, bssxseg,startupxseg,rundownxseg,cppxseg,fixcseg,fixdseg };
  131. /*  structures for binary code gen: mem arenas and fixups
  132.  */
  133. typedef struct _arena {
  134. struct _mem {
  135. struct _arena *link;
  136. unsigned char *mem;
  137. } *m,*active;
  138. long size;
  139. long pos;
  140. short id;
  141. struct _fixup {
  142. struct _fixup *link;
  143. SYM *sp;
  144. long address;
  145. long offset;
  146. long label;
  147. char size;
  148. char pcrel;
  149. char pureofs;
  150. } *head,*tail;
  151. } ARENA;
  152. typedef struct _mem MEM;
  153. typedef struct _fixup FIXUP;
  154. #define MEMSIZE 1024 /* size of the smallest hunk in an arena */
  155. #include "cc68.p"