ack/mach/i386/as/mach1.c

128 lines
3.4 KiB
C
Raw Normal View History

1989-01-19 16:20:46 +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".
*/
1994-06-24 07:25:30 +00:00
#define RCSID1 "$Id$"
1989-01-19 16:20:46 +00:00
/*
* INTEL 80386 C declarations
*/
1989-11-29 09:49:35 +00:00
#define low6(z) (z & 077)
#define fit6(z) (low6(z) == z)
#define low3(z) (z & 07)
#define fit3(z) (low3(z) == z)
#define FESC 0xD8 /* escape for 80[23]87 processor */
1989-01-19 16:20:46 +00:00
#define ufitb(z) ((unsigned)(z) <= 255)
1989-11-29 09:49:35 +00:00
#define IS_R8 0x100
1989-01-19 16:20:46 +00:00
#define IS_R32 0x200
#define IS_EXPR 0x400
#define IS_RSEG 0x800
#define is_expr(reg) ((reg)&IS_EXPR)
#define is_segreg(reg) ((reg)&IS_RSEG)
#define is_reg(reg) (((reg)&(IS_R8|IS_R32)) != 0)
1990-03-19 14:46:55 +00:00
#define is_acc(reg) (is_reg(reg) && ((reg & 07) == 0))
1989-01-19 16:20:46 +00:00
struct operand {
int mod;
int rm;
int reg;
int sib; /* scale-index-base */
expr_t exp;
};
extern struct operand op_1, op_2;
1989-11-29 09:49:35 +00:00
#define mod_1 op_1.mod
#define mod_2 op_2.mod
#define rm_1 op_1.rm
#define rm_2 op_2.rm
#define reg_1 op_1.reg
#define reg_2 op_2.reg
#define sib_1 op_1.sib
#define sib_2 op_2.sib
#define exp_1 op_1.exp
1989-01-19 16:20:46 +00:00
#define exp_2 op_2.exp
#ifdef RELOCATION
extern int rel_1, rel_2;
#endif
#ifndef extern
extern char regindex_ind[8][8];
#else
/* First index is base register; second index is index register;
sp cannot be an index register.
For base and index register indirect mode, bp cannot be the
base register, but this info is not included in this array.
This can always be handled by using the base and index register with
displacement mode.
*/
char regindex_ind[8][8] = {
000, 010, 020, 030, -1, 050, 060, 070,
001, 011, 021, 031, -1, 051, 061, 071,
002, 012, 022, 032, -1, 052, 062, 072,
003, 013, 023, 033, -1, 053, 063, 073,
004, 014, 024, 034, -1, 054, 064, 074,
005, 015, 025, 035, -1, 055, 065, 075,
006, 016, 026, 036, -1, 056, 066, 076,
007, 017, 027, 037, -1, 057, 067, 077,
};
#endif
extern int address_long INIT(1), operand_long INIT(1);
1990-03-12 16:24:58 +00:00
extern int use32 INIT(1);
/* For 16-bit addressing: copied from i86 assembler */
#ifndef extern
extern char sr_m[8];
#else
char sr_m[8] = {
-1, -1, -1, 7, -1, 6, 4, 5
};
#endif
#ifndef extern
extern char dr_m[8][8];
#else
char dr_m[8][8] = {
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 0, 1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 2, 3,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
#endif
2019-03-24 16:11:31 +00:00
/* 80386 specific routines */
void ea_1_16(int param);
void ea_1(int param);
void ea_2(int param);
int checkscale(valu_t val);
void reverse(void);
void badsyntax(void);
void regsize(int sz);
void indexed(void);
void ebranch(register int opc,expr_t exp);
void branch(register int opc,expr_t exp);
void pushop(register int opc);
void opsize_exp(expr_t exp, int nobyte);
void adsize_exp(expr_t exp, int relpc);
void addop(register int opc);
void rolop(register int opc);
void incop(register int opc);
void callop(register int opc);
void xchg(register int opc);
void test(register int opc);
void mov(register int opc);
void extshft(int opc, int reg);
void bittestop(int opc);
void imul(int reg);