📄 outas68.c
字号:
/*
* 68K/386 32-bit C compiler.
*
* copyright (c) 1997, David Lindauer
*
* This compiler is intended for educational use. It may not be used
* for profit without the express written consent of the author.
*
* It may be freely redistributed, as long as this notice remains intact
* and either the original sources or derived sources
* are distributed along with any executables derived from the originals.
*
* The author is not responsible for any damages that may arise from use
* of this software, either idirect or consequential.
*
* v1.35 March 1997
* David Lindauer, gclind01@starbase.spd.louisville.edu
*
* Credits to Mathew Brandt for original K&R C compiler
*
*/
#include <stdio.h>
#include <ctype.h>
#include "expr.h"
#include "c.h"
#include "gen68.h"
#include "diag.h"
/* variable initialization */
extern int global_flag;
extern SYM *currentfunc;
extern HASHREC **globalhash;
extern OCODE *peep_insert, *peep_head, *peep_tail;
extern int prm_rel;
extern long nextlabel;
extern FILE *outputFile;
extern int prm_asmfile;
extern int prm_lines;
extern int phiused;
extern int prm_cmangle;
enum e_gt gentype = nogen; /* Current DC type */
enum e_sg curseg = noseg; /* Current seg */
int outcol = 0; /* Curront col (roughly) */
int dataofs; /* Offset from last label */
SYM *datasp; /* Symbol of last named label */
static DATALINK *datahead, *datatail; /* links for fixup gen */
static int phiput;
ASMREG reglst[] = {
{ 0 , 0 , 0 },
};
/* List of opcodes
* This list MUST be in the same order as the op_ enums
*/
ASMNAME oplst[] = {
{ "?reserved",op_reserved,0 },
{ "?line#",op_reserved,0 },
{ "?seq@",op_reserved,0 },
{ "?slit",op_reserved,0 },
{ "?label",op_reserved,0 },
{ "?flabel",op_reserved,0 },
{ "dc",op_reserved,0 },
{ "dc",op_reserved,0 },
{ "dc",op_reserved,0 },
{ "abcd",op_abcd,0 },
{ "add",op_add,0 },
{ "adda",op_adda,0 },
{ "addi",op_addi,0 },
{ "addq",op_addq,0 },
{ "addx",op_addx,0 },
{ "and",op_and,0 },
{ "andi",op_andi,0 },
{ "asl",op_asl,0 },
{ "asr",op_asr,0 },
{ "bra",op_bra,0 },
{ "beq",op_beq,0 },
{ "bne",op_bne,0 },
{ "blt",op_blt,0 },
{ "ble",op_ble,0 },
{ "bgt",op_bgt,0 },
{ "bge",op_bge,0 },
{ "bhi",op_bhi,0 },
{ "bhs",op_bhs,0 },
{ "blo",op_blo,0 },
{ "bls",op_bls,0 },
{ "bsr",op_bsr,0 },
{ "bcc", op_bcc,0 },
{ "bcs", op_bcs,0 },
{ "bmi", op_bmi,0 },
{ "bpl", op_bpl,0 },
{ "bvc", op_bvc,0 },
{ "bvs", op_bvs,0 },
{ "bchg",op_bchg,0 },
{ "bclr",op_bclr,0 },
{ "bfchg",op_bfchg,0 },
{ "bfclr",op_bfclr,0 },
{ "bfexts",op_bfexts,0 },
{ "bfextu",op_bfextu,0 },
{ "bfffo",op_bfffo,0 },
{ "bfins",op_bfins,0 },
{ "bfset",op_bfset,0 },
{ "bftst",op_bftst,0 },
{ "bkpt", op_bkpt,0 },
{ "bset",op_bset,0 },
{ "btst",op_btst,0 },
{ "chk",op_chk,0 },
{ "chk2",op_chk2,0 },
{ "clr",op_clr,0 },
{ "cmp",op_cmp,0 },
{ "cmpa",op_cmpa,0 },
{ "cmpi",op_cmpi,0 },
{ "cmpm",op_cmpm,0 },
{ "cmp2",op_cmp2,0 },
{ "dbeq",op_dbeq,0 },
{ "dbne",op_dbne,0 },
{ "dblt",op_dblt,0 },
{ "dble",op_dble,0 },
{ "dbgt",op_dbgt,0 },
{ "dbge",op_dbge,0 },
{ "dbhi",op_dbhi,0 },
{ "dbhs",op_dbhs,0 },
{ "dblo",op_dblo,0 },
{ "dbls",op_dbls,0 },
{ "dbsr",op_dbsr,0 },
{ "dbcc", op_dbcc,0 },
{ "dbcs", op_dbcs,0 },
{ "dbmi", op_dbmi,0 },
{ "dbpl", op_dbpl,0 },
{ "dbvc", op_dbvc,0 },
{ "dbvs", op_dbvs,0 },
{ "dbt", op_dbt,0 },
{ "dbf", op_dbf,0 },
{ "dbra",op_dbra,0 },
{ "divs",op_divs,0 },
{ "divu",op_divu,0 },
{ "divsl",op_divsl,0 },
{ "divul",op_divul,0 },
{ "eor",op_eor,0 },
{ "eori",op_eori,0 },
{ "exg",op_exg,0 },
{ "ext",op_ext,0 },
{ "extb",op_extb,0 },
{ "illegal", op_illegal, 0 },
{ "jmp",op_jmp,0 },
{ "jsr",op_jsr,0 },
{ "lea",op_lea,0 },
{ "link",op_link,0 },
{ "lsl",op_lsl,0 },
{ "lsr",op_lsr,0 },
{ "move",op_move,0 },
{ "movea",op_movea,0 },
{ "movec",op_movec,0 },
{ "movem",op_movem,0 },
{ "movep",op_movep,0 },
{ "moveq",op_moveq,0 },
{ "moves",op_moves,0 },
{ "muls",op_muls,0 },
{ "mulu",op_mulu,0 },
{ "nbcd",op_nbcd,0 },
{ "neg",op_neg,0 },
{ "negx",op_negx,0 },
{ "nop",op_nop,0 },
{ "not",op_not,0 },
{ "or",op_or,0 },
{ "ori",op_ori,0 },
{ "pack",op_pack,0 },
{ "pea",op_pea,0 },
{ "reset",op_reset,0 },
{ "rol",op_rol,0 },
{ "ror",op_ror,0 },
{ "roxl",op_roxl,0 },
{ "roxr",op_roxr,0 },
{ "rtd",op_rtd,0 },
{ "rte",op_rte,0 },
{ "rtr",op_rtr,0 },
{ "rts",op_rts,0 },
{ "sbcd",op_sbcd,0 },
{ "seteq",op_seteq,0 },
{ "setne",op_setne,0 },
{ "setlt",op_setlt,0 },
{ "setle",op_setle,0 },
{ "setgt",op_setgt,0 },
{ "setge",op_setge,0 },
{ "sethi",op_sethi,0 },
{ "seths",op_seths,0 },
{ "setlo",op_setlo,0 },
{ "setls",op_setls,0 },
{ "setsr",op_setsr,0 },
{ "setcc", op_setcc,0 },
{ "setcs", op_setcs,0 },
{ "setmi", op_setmi,0 },
{ "setpl", op_setpl,0 },
{ "setvc", op_setvc,0 },
{ "setvs", op_setvs,0 },
{ "sett", op_sett,0 },
{ "setf", op_setf,0 },
{ "sub",op_sub,0 },
{ "stop",op_stop,0 },
{ "suba",op_suba,0 },
{ "subi",op_subi,0 },
{ "subq",op_subq,0 },
{ "subx",op_subx,0 },
{ "swap",op_swap,0 },
{ "tas",op_tas,0 },
{ "trap",op_trap,0 },
{ "trapeq",op_trapeq,0 },
{ "trapne",op_trapne,0 },
{ "traplt",op_traplt,0 },
{ "traple",op_traple,0 },
{ "trapgt",op_trapgt,0 },
{ "trapge",op_trapge,0 },
{ "traphi",op_traphi,0 },
{ "traphs",op_traphs,0 },
{ "traplo",op_traplo,0 },
{ "trapls",op_trapls,0 },
{ "trapsr",op_trapsr,0 },
{ "trapcc", op_trapcc,0 },
{ "trapcs", op_trapcs,0 },
{ "trapmi", op_trapmi,0 },
{ "trappl", op_trappl,0 },
{ "trapvc", op_trapvc,0 },
{ "trapvs", op_trapvs,0 },
{ "trapt", op_trapt,0 },
{ "trapf", op_trapf,0 },
{ "trapv", op_trapv,0 },
{ "tst",op_tst,0 },
{ "unlk",op_unlk,0 },
{ "unpk",op_unpk,0 },
{ "fabs",op_fabs,0 },
{ "facos",op_facos,0 },
{ "fadd",op_fadd,0 },
{ "fasin",op_fasin,0 },
{ "fatan",op_fatan,0 },
{ "fatanh",op_fatanh,0 },
{ "fbeq", op_fbeq, 0 },
{ "fbne", op_fbne, 0 },
{ "fbgt", op_fbgt, 0 },
{ "fbngt", op_fbngt, 0 },
{ "fbge", op_fbge, 0 },
{ "fbnge", op_fbnge, 0 },
{ "fblt", op_fblt, 0 },
{ "fbnlt", op_fbnlt, 0 },
{ "fble", op_fble, 0 },
{ "fbnle", op_fbnle, 0 },
{ "fbgl", op_fbgl, 0 },
{ "fbngl", op_fbngl, 0 },
{ "fbgle", op_fbgle, 0 },
{ "fbngle", op_fbngle, 0 },
{ "fbogt", op_fbogt, 0 },
{ "fbule", op_fbule, 0 },
{ "fboge", op_fboge, 0 },
{ "fbult", op_fbult, 0 },
{ "fbolt", op_fbolt, 0 },
{ "fbuge", op_fbuge, 0 },
{ "fbole", op_fbole, 0 },
{ "fbugt", op_fbugt, 0 },
{ "fbogl", op_fbogl, 0 },
{ "fbueq", op_fbueq, 0 },
{ "fbor", op_fbor, 0 },
{ "fbun", op_fbun, 0 },
{ "fbt", op_fbt, 0 },
{ "fbf", op_fbf, 0 },
{ "fbst", op_fbst, 0 },
{ "fbsf", op_fbsf, 0 },
{ "fbseq", op_fbseq, 0 },
{ "fbsne", op_fbsne, 0 },
{ "fcmp",op_fcmp,0 },
{ "fcos",op_fcos,0 },
{ "fcosh",op_fcosh,0 },
{ "fdbeq", op_fdbeq, 0 },
{ "fdbne", op_fdbne, 0 },
{ "fdbgt", op_fdbgt, 0 },
{ "fdbngt", op_fdbngt, 0 },
{ "fdbge", op_fdbge, 0 },
{ "fdbnge", op_fdbnge, 0 },
{ "fdblt", op_fdblt, 0 },
{ "fdbnlt", op_fdbnlt, 0 },
{ "fdble", op_fdble, 0 },
{ "fdbnle", op_fdbnle, 0 },
{ "fdbgl", op_fdbgl, 0 },
{ "fdbngl", op_fdbngl, 0 },
{ "fdbgle", op_fdbgle, 0 },
{ "fdbngle", op_fdbngle, 0 },
{ "fdbogt", op_fdbogt, 0 },
{ "fdbule", op_fdbule, 0 },
{ "fdboge", op_fdboge, 0 },
{ "fdbult", op_fdbult, 0 },
{ "fdbolt", op_fdbolt, 0 },
{ "fdbuge", op_fdbuge, 0 },
{ "fdbole", op_fdbole, 0 },
{ "fdbugt", op_fdbugt, 0 },
{ "fdbogl", op_fdbogl, 0 },
{ "fdbueq", op_fdbueq, 0 },
{ "fdbor", op_fdbor, 0 },
{ "fdbun", op_fdbun, 0 },
{ "fdbt", op_fdbt, 0 },
{ "fdbf", op_fdbf, 0 },
{ "fdbst", op_fdbst, 0 },
{ "fdbsf", op_fdbsf, 0 },
{ "fdbseq", op_fdbseq, 0 },
{ "fdbsne", op_fdbsne, 0 },
{ "fdiv",op_fdiv,0 },
{ "fetox",op_fetox,0 },
{ "fetoxm1",op_fetoxm1,0 },
{ "fgetexp",op_fgetexp,0 },
{ "fgetman",op_fgetman,0 },
{ "fint",op_fint,0 },
{ "fintrz",op_fintrz,0 },
{ "flog10",op_flog10,0 },
{ "flog2",op_flog2,0 },
{ "flogn",op_flogn,0 },
{ "flognp1",op_flognp1,0 },
{ "fmod",op_fmod,0 },
{ "fmove",op_fmove,0 },
{ "fmovecr",op_fmovecr,0 },
{ "fmovem",op_fmovem,0 },
{ "fmul",op_fmul,0 },
{ "fneg",op_fneg,0 },
{ "fnop",op_fnop,0 },
{ "frem",op_frem,0 },
{ "fscale",op_fscale,0 },
{ "fseq", op_fseq, 0 },
{ "fsne", op_fsne, 0 },
{ "fsgt", op_fsgt, 0 },
{ "fsngt", op_fsngt, 0 },
{ "fsge", op_fsge, 0 },
{ "fsnge", op_fsnge, 0 },
{ "fslt", op_fslt, 0 },
{ "fsnlt", op_fsnlt, 0 },
{ "fsle", op_fsle, 0 },
{ "fsnle", op_fsnle, 0 },
{ "fsgl", op_fsgl, 0 },
{ "fsngl", op_fsngl, 0 },
{ "fsgle", op_fsgle, 0 },
{ "fsngle", op_fsngle, 0 },
{ "fsogt", op_fsogt, 0 },
{ "fsule", op_fsule, 0 },
{ "fsoge", op_fsoge, 0 },
{ "fsult", op_fsult, 0 },
{ "fsolt", op_fsolt, 0 },
{ "fsuge", op_fsuge, 0 },
{ "fsole", op_fsole, 0 },
{ "fsugt", op_fsugt, 0 },
{ "fsogl", op_fsogl, 0 },
{ "fsueq", op_fsueq, 0 },
{ "fsor", op_fsor, 0 },
{ "fsun", op_fsun, 0 },
{ "fst", op_fst, 0 },
{ "fsf", op_fsf, 0 },
{ "fsst", op_fsst, 0 },
{ "fssf", op_fssf, 0 },
{ "fsseq", op_fsseq, 0 },
{ "fssne", op_fssne, 0 },
{ "fsgldiv",op_fsgldiv,0 },
{ "fsglmul",op_fsglmul,0 },
{ "fsin",op_fsin,0 },
{ "fsincos",op_fsincos,0 },
{ "fsinh",op_fsinh,0 },
{ "fsqrt",op_fsqrt,0 },
{ "fsub",op_fsub,0 },
{ "ftan",op_ftan,0 },
{ "ftanh",op_ftanh,0 },
{ "ftentox",op_ftentox,0 },
{ "ftrapeq", op_ftrapeq, 0 },
{ "ftrapne", op_ftrapne, 0 },
{ "ftrapgt", op_ftrapgt, 0 },
{ "ftrapngt", op_ftrapngt, 0 },
{ "ftrapge", op_ftrapge, 0 },
{ "ftrapnge", op_ftrapnge, 0 },
{ "ftraplt", op_ftraplt, 0 },
{ "ftrapnlt", op_ftrapnlt, 0 },
{ "ftraple", op_ftraple, 0 },
{ "ftrapnle", op_ftrapnle, 0 },
{ "ftrapgl", op_ftrapgl, 0 },
{ "ftrapngl", op_ftrapngl, 0 },
{ "ftrapgle", op_ftrapgle, 0 },
{ "ftrapngle", op_ftrapngle, 0 },
{ "ftrapogt", op_ftrapogt, 0 },
{ "ftrapule", op_ftrapule, 0 },
{ "ftrapoge", op_ftrapoge, 0 },
{ "ftrapult", op_ftrapult, 0 },
{ "ftrapolt", op_ftrapolt, 0 },
{ "ftrapuge", op_ftrapuge, 0 },
{ "ftrapole", op_ftrapole, 0 },
{ "ftrapugt", op_ftrapugt, 0 },
{ "ftrapogl", op_ftrapogl, 0 },
{ "ftrapueq", op_ftrapueq, 0 },
{ "ftrapor", op_ftrapor, 0 },
{ "ftrapun", op_ftrapun, 0 },
{ "ftrapt", op_ftrapt, 0 },
{ "ftrapf", op_ftrapf, 0 },
{ "ftrapst", op_ftrapst, 0 },
{ "ftrapsf", op_ftrapsf, 0 },
{ "ftrapseq", op_ftrapseq, 0 },
{ "ftrapsne", op_ftrapsne, 0 },
{ "ftst",op_ftst,0 },
{ "ftwotox",op_ftwotox,0 },
{ 0,0,0 },
};
/* Init module */
void outcodeini(void)
{
gentype = nogen;
curseg = noseg;
outcol = 0;
datahead = datatail = 0;
phiput = FALSE;
}
/*
* Register a fixup
*/
void datalink(int flag)
{
DATALINK *p;
if (!prm_rel)
return;
global_flag++; /* Global tab */
p = xalloc(sizeof(DATALINK));
p->sp = datasp;
p->type = flag;
p->offset = dataofs;
p->next = 0;
if (datahead) {
datatail->next = p;
datatail=datatail->next;
}
else
datahead = datatail = p;
global_flag--;
}
void nl(void)
/*
* New line
*/
{ if (prm_asmfile) {
if(outcol > 0) {
fputc('\n',outputFile);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -