mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
329 lines
9.3 KiB
C
329 lines
9.3 KiB
C
/*
|
|
Copyright 1982
|
|
Alcyon Corporation
|
|
8716 Production Ave.
|
|
San Diego, Ca. 92121
|
|
|
|
@(#)optab.c 1.5 11/21/83
|
|
*/
|
|
|
|
#include "cgen.h"
|
|
#include "cskel.h"
|
|
|
|
#define I_NULL 0
|
|
#define I_ADD 1
|
|
#define I_INC 2
|
|
#define I_SUB 3
|
|
#define I_DEC 4
|
|
#define I_MULS 5
|
|
#define I_MULU 6
|
|
#define I_DIVS 7
|
|
#define I_DIVU 8
|
|
#define I_ASR 9
|
|
#define I_LSR 10
|
|
#define I_ASL 11
|
|
#define I_LSL 12
|
|
#define I_AND 13
|
|
#define I_OR 14
|
|
#define I_EOR 15
|
|
#define I_NEG 16
|
|
#define I_NOT 17
|
|
#define I_MOVE 18
|
|
#define I_CLR 19
|
|
#define I_CMP 20
|
|
#define I_TST 21
|
|
#define I_LMUL 22
|
|
#define I_LDIV 23
|
|
#define I_LREM 24
|
|
#define I_LEML 25
|
|
#define I_LERM 27
|
|
#define I_BEQ 28
|
|
#define I_BNE 29
|
|
#define I_BGT 30
|
|
#define I_BGE 31
|
|
#define I_BLT 32
|
|
#define I_BLE 33
|
|
#define I_BLS 34
|
|
#define I_BLO 35
|
|
#define I_BCC 36
|
|
#define I_BHI 37
|
|
#define I_BRA 38
|
|
#define I_NOP 39
|
|
#define I_BTST 40
|
|
|
|
char *mnemonics[] = {
|
|
"",
|
|
"add",
|
|
"inc",
|
|
"sub",
|
|
"dec",
|
|
"muls",
|
|
"mulu",
|
|
"divs",
|
|
"divu",
|
|
"asr",
|
|
"lsr",
|
|
"asl",
|
|
"lsl",
|
|
"and",
|
|
"or",
|
|
"eor",
|
|
"neg",
|
|
"not",
|
|
"move",
|
|
"clr",
|
|
"cmp",
|
|
"tst",
|
|
"lmul",
|
|
"_ldiv",
|
|
"lrem",
|
|
"almul",
|
|
"aldiv",
|
|
"alrem",
|
|
"beq",
|
|
"bne",
|
|
"bgt",
|
|
"bge",
|
|
"blt",
|
|
"ble",
|
|
"bls",
|
|
"blo",
|
|
"bcc",
|
|
"bhi",
|
|
"jmp",
|
|
"*nop",
|
|
"btst",
|
|
};
|
|
|
|
#define FE_EQOP 1
|
|
#define FE_ASSIGN 2
|
|
#define FE_EQSHFT 3
|
|
#define FE_EQXOR 4
|
|
#define FE_EQADDR 5
|
|
#define FC_FIX 6
|
|
#define FC_REL 7
|
|
#define FC_BTST 8
|
|
#define FS_OP 9
|
|
#define FS_ITL 10
|
|
#define FS_LD 11
|
|
#define FR_ADD 12
|
|
#define FR_MULT 13
|
|
#define FR_DIV 14
|
|
#define FR_SHFT 15
|
|
#define FR_XOR 16
|
|
#define FR_NEG 17
|
|
#define FR_EQOP 18
|
|
#define FR_POSTOP 19
|
|
#define FR_ASSIGN 20
|
|
#define FR_EQMULT 21
|
|
#define FR_EQDIV 22
|
|
#define FR_EQSHFT 23
|
|
#define FR_EQXOR 24
|
|
#define FR_CALL 25
|
|
#define FR_ITL 26
|
|
#define FR_LTI 27
|
|
#define FR_LD 28
|
|
#define FR_EQADDR 29
|
|
#define FR_EQNOT 30
|
|
#define FE_EQNOT 31
|
|
#define FR_DOCAST 32
|
|
#define FS_DOCAST 33
|
|
#define FR_FTOL 34
|
|
#define FR_LTOF 35
|
|
#define FR_FTOI 36
|
|
#define FR_ITOF 37
|
|
#define FE_EQMULT 38
|
|
#define FE_EQDIV 39
|
|
#define FE_EQMOD 40
|
|
#define FR_TOCHAR 41
|
|
#define FR_LDIV 42
|
|
|
|
extern struct skeleton /*char /* really struct skeleton.... */
|
|
fe_eqop[], /* 1=FE_EQOP */
|
|
fe_assign[], /* 2=FE_ASSIGN */
|
|
fe_eqshft[], /* 3=FE_EQSHFT */
|
|
fe_eqxor[], /* 4=FE_EQXOR */
|
|
fe_eqaddr[], /* 5=FE_EQADDR */
|
|
fc_fix[], /* 6=FC_FIX */
|
|
fc_rel[], /* 7=FC_REL */
|
|
fc_btst[], /* 8=FC_BTST */
|
|
fs_op[], /* 9=FS_OP */
|
|
fs_itl[], /* 10=FS_ITL */
|
|
fs_ld[], /* 11=FS_LD */
|
|
fr_op[], /* 12=FR_OP */
|
|
fr_mult[], /* 13=FR_MULT */
|
|
fr_div[], /* 14=FR_DIV */
|
|
fr_shft[], /* 15=FR_SHFT */
|
|
fr_xor[], /* 16=FR_XOR */
|
|
fr_neg[], /* 17=FR_NEG */
|
|
fr_eqop[], /* 18=FR_EQOP */
|
|
fr_postop[], /* 19=FR_POSTOP */
|
|
fr_assign[], /* 20=FR_ASSIGN */
|
|
fr_eqmult[], /* 21=FR_EQMULT */
|
|
fr_eqdiv[], /* 22=FR_EQDIV */
|
|
fr_eqshft[], /* 23=FR_EQSHFT */
|
|
fr_eqxor[], /* 24=FR_EQXOR */
|
|
fr_call[], /* 25=FR_CALL */
|
|
fr_itl[], /* 26=FR_ITL */
|
|
fr_lti[], /* 27=FR_LTI */
|
|
fr_ld[], /* 28=FR_LD */
|
|
fr_eqaddr[], /* 29=FR_EQADDR */
|
|
fr_eqnot[], /* 30=FR_EQNOT */
|
|
fe_eqnot[], /* 31=FE_EQNOT */
|
|
fr_docast[], /* 32=FR_DOCAST */
|
|
fs_docast[], /* 33=FS_DOCAST */
|
|
fr_ftol[], /* 34=FE_FTOL */
|
|
fr_ltof[], /* 35=FE_LTOF */
|
|
fr_ftoi[], /* 36=FE_FTOI */
|
|
fr_itof[], /* 37=FE_ITOF */
|
|
fe_eqmult[], /* 38=FE_EQMULT */
|
|
fe_eqdiv[], /* 39=FE_EQDIV */
|
|
fe_eqmod[], /* 40=FE_EQMOD */
|
|
fr_tochar[], /* 41=FR_TOCHAR */
|
|
fr_ldiv[]; /* 42=FR_LDIV */
|
|
|
|
char *codeskels[] = {
|
|
0, /*NULL*/
|
|
fe_eqop, /*1=FE_EQOP*/
|
|
fe_assign, /*2=FE_ASSIGN*/
|
|
fe_eqshft, /*3=FE_EQSHFT*/
|
|
fe_eqxor, /*4=FE_EQXOR*/
|
|
fe_eqaddr, /*5=FE_EQADDR*/
|
|
fc_fix, /*6=FC_FIX*/
|
|
fc_rel, /*7=FC_REL*/
|
|
fc_btst, /*8=FC_BTST*/
|
|
fs_op, /*9=FS_OP*/
|
|
fs_itl, /*10=FS_ITL*/
|
|
fs_ld, /*11=FS_LD*/
|
|
fr_op, /*12=FR_OP*/
|
|
fr_mult, /*13=FR_MULT*/
|
|
fr_div, /*14=FR_DIV*/
|
|
fr_shft, /*15=FR_SHFT*/
|
|
fr_xor, /*16=FR_XOR*/
|
|
fr_neg, /*17=FR_NEG*/
|
|
fr_eqop, /*18=FR_EQOP*/
|
|
fr_postop, /*19=FR_POSTOP*/
|
|
fr_assign, /*20=FR_ASSIGN*/
|
|
fr_eqmult, /*21=FR_EQMULT*/
|
|
fr_eqdiv, /*22=FR_EQDIV*/
|
|
fr_eqshft, /*23=FR_EQSHFT*/
|
|
fr_eqxor, /*24=FR_EQXOR*/
|
|
fr_call, /*25=FR_CALL*/
|
|
fr_itl, /*26=FR_ITL*/
|
|
fr_lti, /*27=FR_LTI*/
|
|
fr_ld, /*28=FE_LD*/
|
|
fr_eqaddr, /*29=FE_EQADDR*/
|
|
fr_eqnot, /*30=FE_EQNOT*/
|
|
fe_eqnot, /*31=FE_EQNOT*/
|
|
fr_docast, /*32=FE_DOCAST*/
|
|
fs_docast, /*33=FS_DOCAST*/
|
|
fr_ftol, /*34=FE_FTOL*/
|
|
fr_ltof, /*35=FE_LTOF*/
|
|
fr_ftoi, /*36=FE_FTOI*/
|
|
fr_itof, /*37=FE_ITOF*/
|
|
fe_eqmult, /*38=FE_EQMULT*/
|
|
fe_eqdiv, /*39=FE_EQDIV*/
|
|
fe_eqmod, /*40=FE_EQMOD*/
|
|
fr_tochar, /*41=FR_TOCHAR*/
|
|
fr_ldiv, /*42=FR_LDIV*/
|
|
};
|
|
/*
|
|
*This is the major table directing the code generation process.
|
|
*It is indexed by an O_op operator, which is obtained from the
|
|
*opinfo table for an intermediate code operator. The actual
|
|
*code skeleton macros are in cskels.c, which are in a linked
|
|
*list in order of decreasing order of difficulty.
|
|
*/
|
|
char optab[][6] = {
|
|
|
|
/* I I2 effect cc's stack register*/
|
|
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, /*0=NULL*/
|
|
I_ADD, I_INC, I_NULL, FC_FIX, FS_OP, FR_ADD, /*1=ADD*/
|
|
I_SUB, I_DEC, I_NULL, FC_FIX, FS_OP, FR_ADD, /*2=SUB*/
|
|
I_MULS, I_MULU, I_NULL, FC_FIX, I_NULL, FR_MULT, /*3=MULT*/
|
|
I_DIVS, I_DIVU, I_NULL, FC_FIX, I_NULL, FR_DIV, /*4=DIV*/
|
|
I_DIVS, I_DIVU, I_NULL, I_NULL, I_NULL, FR_DIV, /*5=MOD*/
|
|
I_ASR, I_LSR, I_NULL, FC_FIX, I_NULL, FR_SHFT, /*6=RSH*/
|
|
I_ASL, I_LSL, I_NULL, FC_FIX, I_NULL, FR_SHFT, /*7=LSH*/
|
|
I_AND, I_AND, I_NULL, FC_FIX, FS_OP, FR_ADD, /*8=AND*/
|
|
I_OR, I_OR, I_NULL, FC_FIX, FS_OP, FR_ADD, /*9=OR*/
|
|
I_EOR, I_EOR, I_NULL, FC_FIX, I_NULL, FR_XOR, /*10=XOR*/
|
|
I_NULL, I_NULL, I_NULL, FC_FIX, I_NULL, I_NULL, /*11=NOT*/
|
|
I_NEG, I_NEG, I_NULL, FC_FIX, I_NULL, FR_NEG, /*12=NEG*/
|
|
I_NOT, I_NOT, I_NULL, I_NULL, I_NULL, FR_NEG, /*13=COMPL*/
|
|
I_SUB, I_DEC, FE_EQOP, FC_FIX, I_NULL, FR_EQOP, /*14=PREDEC*/
|
|
I_ADD, I_INC, FE_EQOP, FC_FIX, I_NULL, FR_EQOP, /*15=PREINC*/
|
|
I_SUB, I_DEC, FE_EQOP, I_NULL, I_NULL, FR_POSTOP, /*16=POSTDEC*/
|
|
I_ADD, I_INC, FE_EQOP, I_NULL, I_NULL, FR_POSTOP, /*17=POSTINC*/
|
|
I_MOVE, I_CLR, FE_ASSIGN, I_NULL, I_NULL, FR_ASSIGN, /*18=ASSIGN*/
|
|
I_ADD, I_INC, FE_EQOP, I_NULL, I_NULL, FR_EQOP, /*19=EQADD*/
|
|
I_SUB, I_DEC, FE_EQOP, I_NULL, I_NULL, FR_EQOP, /*20=EQSUB*/
|
|
I_MULS, I_MULU, FE_EQMULT, FC_FIX, I_NULL, FR_EQMULT, /*21=EQMULT*/
|
|
I_DIVS, I_DIVU, FE_EQDIV, FC_FIX, I_NULL, FR_EQDIV, /*22=EQDIV*/
|
|
I_DIVS, I_DIVU, FE_EQMOD, I_NULL, I_NULL, FR_EQDIV, /*23=EQMOD*/
|
|
I_ASR, I_LSR, FE_EQSHFT, I_NULL, I_NULL, FR_EQSHFT, /*24=EQRSH*/
|
|
I_ASL, I_LSL, FE_EQSHFT, I_NULL, I_NULL, FR_EQSHFT, /*25=EQLSH*/
|
|
I_AND, I_AND, FE_EQOP, I_NULL, I_NULL, FR_EQOP, /*26=EQAND*/
|
|
I_OR, I_OR, FE_EQOP, I_NULL, I_NULL, FR_EQOP, /*27=EQOR*/
|
|
I_EOR, I_EOR, FE_EQXOR, FC_FIX, I_NULL, FR_EQXOR, /*28=EQXOR*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_CALL, /*29=FJSR*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*30=EQUALS*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*31=NEQUALS*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*32=GREAT*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*33=GREATEQ*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*34=LESS*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, I_NULL, I_NULL, /*35=LESSEQ*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, FS_ITL, FR_ITL, /*36=INT2L*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_LTI, /*37=LONG2I*/
|
|
I_BTST, I_BTST, I_NULL, FC_BTST, I_NULL, I_NULL, /*38=BTST*/
|
|
I_CMP, I_TST, I_NULL, FC_REL, FS_LD, FR_LD, /*39=LOAD*/
|
|
I_MULS, I_MULU, I_NULL, I_NULL, I_NULL, FR_MULT, /*40=LMULT*/
|
|
I_DIVS, I_DIVU, I_NULL, I_NULL, I_NULL, FR_LDIV, /*41=LDIV*/
|
|
I_DIVS, I_DIVU, I_NULL, I_NULL, I_NULL, FR_DIV, /*42=LMOD*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, /*43=NULL*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, /*44=NULL*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, /*45=NULL*/
|
|
I_NULL, I_NULL, FE_EQADDR, I_NULL, I_NULL, FR_EQADDR, /*46=EQADDR*/
|
|
I_NOT, I_NOT, FE_EQNOT, I_NULL, I_NULL, FR_EQNOT, /*47=EQNOT*/
|
|
I_NEG, I_NEG, FE_EQNOT, I_NULL, I_NULL, FR_EQNOT, /*48=EQNEG*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, FS_DOCAST, FR_DOCAST, /*49=DOCAST*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, /*50=STASSIGN*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_LTOF, /*51=LONG2F*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_FTOL, /*52=FLOAT2L*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_ITOF, /*53=INT2F*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_FTOI, /*54=FLOAT2I*/
|
|
I_NULL, I_NULL, I_NULL, I_NULL, I_NULL, FR_TOCHAR, /*55=TOCHAR*/
|
|
};
|
|
|
|
|
|
/*this maps comparison operators and comparison types into the*/
|
|
/*actual branch opcode used.*/
|
|
char brtab[][2] = {
|
|
I_BEQ, I_BEQ, /*EQUALS*/
|
|
I_BNE, I_BNE, /*NEQUALS*/
|
|
I_BGT, I_BHI, /*GREAT*/
|
|
I_BGE, I_BCC, /*GREATEQ*/
|
|
I_BLT, I_BLO, /*LESS*/
|
|
I_BLE, I_BLS, /*LESSEQ*/
|
|
};
|
|
|
|
/*turns !x>y into x<=y*/
|
|
short invrel[] = { NEQUALS, EQUALS, LESSEQ, LESS, GREATEQ, GREAT };
|
|
|
|
/*turns x>y into y<=x*/
|
|
short swaprel[] = { EQUALS, NEQUALS, LESS, LESSEQ, GREAT, GREATEQ };
|
|
|
|
/*code skeleton built-in strings*/
|
|
char *strtab[] = {
|
|
"move", /*MOV*/
|
|
"move.l", /*MOVL*/
|
|
"jsr", /*JSR*/
|
|
"clr", /*CLR*/
|
|
"clr.l", /*CLRL*/
|
|
"ext.w", /*EXTW*/
|
|
"ext.l", /*EXTL*/
|
|
"lea", /*LEA*/
|
|
"(sp)", /*STK*/
|
|
};
|