ack/mach/m68020/as/mach1.c

163 lines
4.4 KiB
C
Raw Normal View History

1994-06-24 14:02:31 +00:00
/* $Id$ */
1987-03-09 19:15:41 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1987-01-29 20:15:14 +00:00
/*
* Motorola 68020 dependent C declarations
*/
#define low3(z) ((short)(z) & 07)
#define low4(z) ((short)(z) & 017)
#define low5(z) ((short)(z) & 037)
#define low6(z) ((short)(z) & 077)
#define low7(z) ((short)(z) & 0177)
1987-01-29 20:15:14 +00:00
#define fit3(z) ((((z)-1) & ~((int)07)) == 0)
#define fit4(z) (((z) & ~((int)017)) == 0)
#define fit5(z) (((z) & ~((int)037)) == 0)
#define fit6(z) (((z) & ~((int)077)) == 0)
#define fit7(z) (((z) & ~((int)0177)) == 0)
#define sfit7(z) (fit7((z)+64))
#define fit8(z) (((z) & ~((int)0xFF)) == 0)
#define fit16(z) (((z) & ~(0xFFFFL)) == 0)
1987-01-29 20:15:14 +00:00
#define SIZE_B 0000
#define SIZE_W 0100
#define SIZE_L 0200
#define SIZE_NON 0300
#define SIZE_DEF SIZE_W
#define FSIZE_L 00
#define FSIZE_S 01
#define FSIZE_X 02
#define FSIZE_P 03
#define FSIZE_W 04
#define FSIZE_D 05
#define FSIZE_B 06
#define DEF_FP 01000 /* default floating point processor */
#define DEF_MM 00000 /* default memory management */
extern int co_id; /* coprocessor id */
1987-01-29 20:15:14 +00:00
extern int mrg_1,mrg_2; /* Mode and ReGister */
extern short ffew_1, ffew_2; /* Full Format Extension Word */
extern expr_t bd_1,bd_2,od_1,od_2; /* base and outer displacements */
#ifndef ASLD
extern valu_t bd_rel1,bd_rel2,od_rel1,od_rel2;
#endif
#ifdef RELOCATION
#ifdef ASLD
1988-06-28 13:55:25 +00:00
#define T_EMIT2(a,b,c,d) t_emit2(a,b,c,(valu_t)0)
#define T_EMIT4(a,b,c,d) t_emit4(a,b,c,(valu_t)0)
#else /* ALSD */
1988-06-28 13:55:25 +00:00
#define T_EMIT2(a,b,c,d) t_emit2(a,b,c,(valu_t)d)
#define T_EMIT4(a,b,c,d) t_emit4(a,b,c,(valu_t)d)
#endif /* ASLD */
1987-01-29 20:15:14 +00:00
#else
#define T_EMIT2(a,b,c,d) t_emit2(a)
#define T_EMIT4(a,b,c,d) t_emit4(a)
#endif
struct instr_t {
short i_word; /* word to be emitted */
#ifdef RELOCATION
short i_relotype;
int i_reloinfo;
valu_t i_relonami;
#endif
};
typedef struct instr_t instr_t;
1991-10-25 11:13:43 +00:00
extern instr_t instr[30]; /* temporary area for instructions */
extern instr_t *instrp; /* index into instr[] */
extern int dot_offset;
1987-01-29 20:15:14 +00:00
/* flags used when reading effective addresses */
#define INDEX 0300
#define PRE_INDEX 0100
#define POST_INDEX 0200
#define DBL_INDEX 0300
#define PC_MODE 0400
/* addressing mode bits */
#define DTA 0x01
#define MEM 0x02
#define CTR 0x04
#define ALT 0x08
#define FITB 0x10
#define FITW 0x20
#define PUTW 0x40
#define PUTL 0x80
extern int curr_instr;
extern int curr_size;
1987-01-29 20:15:14 +00:00
#ifndef extern
extern short eamode[];
#else
short eamode[] = {
/* 00A */ DTA |ALT,
/* 01A */ ALT,
/* 02A */ DTA|MEM|CTR|ALT,
/* 03A */ DTA|MEM |ALT,
/* 04A */ DTA|MEM |ALT,
/* 05A */ DTA|MEM|CTR|ALT|FITW|PUTW, /* if relocation wanted, use 06A */
/* 06A */ DTA|MEM|CTR|ALT |PUTW, /* relocation handled by ea_1() */
/* 07x */ 0,
/* 070 */ DTA|MEM|CTR|ALT|FITW|PUTW | (RELO2)<<8,
/* 071 */ DTA|MEM|CTR|ALT |PUTL | (RELO4)<<8,
/* 072 */ DTA|MEM|CTR |FITW|PUTW, /* if relocation wanted, use 073 */
/* 073 */ DTA|MEM|CTR |PUTW, /* relocation handled by ea_1() */
/* 074x */ 0,
/* 074B */ DTA|MEM |FITB|PUTW | (RELO1)<<8,
/* 074W */ DTA|MEM |FITW|PUTW | (RELO2)<<8,
/* 074L */ DTA|MEM |PUTL | (RELO4)<<8,
};
/* RELO2 had to go with mode 070, because the assembly
* language programmer can use addresses like
* '(expression).w', which still have to be relocatable.
*/
#endif
2019-03-24 16:11:55 +00:00
/* 680x0 specific routines */
void emit_instr(void);
#ifdef RELOCATION
void t_emit2(short word, short relotype, int reloinfo, valu_t relnm);
#else
void t_emit2(short word);
#endif
#ifdef RELOCATION
void t_emit4(long words, short relotype, int reloinfo, valu_t relnm);
#else
void t_emit4(long words);
#endif
void ea_1(int sz, int bits);
void ea_2(int sz, int bits);
void checksize(int sz, int bits);
void check_fsize(int sz, int size);
void ch_sz_dreg(int size, int mode);
int checkscale(valu_t val);
void badoperand(void);
void shift_op(int opc, int sz);
void bitop(int opc);
void bitfield(int opc, int extension);
void add(int opc, int sz);
void and(int opc, int sz);
int to_dreg(int opc, int sz, int bits);
int from_dreg(int opc, int sz, int bits);
void cmp(int sz);
void link_instr(int sz, int areg);
void move(int sz);
void move_special(int sz);
void movem(int dr, int sz, int regs);
int reverse(register int regs, int max);
void movep(int sz);
void branch(int opc, expr_t exp);
void cpbcc(int opc, expr_t exp);
void ea7071(int sz);
void fbranch(int opc, expr_t exp);