1 /* gencode.h - code generation for bcc */
2 
3 /* Copyright (C) 1992 Bruce Evans */
4 
5 #ifdef MC6809
6 # define CANABXCUTOFF 7		/* favour ABX over MUL before this */
7 #endif
8 #define EXPRLEVEL 126		/* level for symbols in exptree, > real levs */
9 #define OFFKLUDGELEVEL 127	/* level for expr sym with offset from name */
10 #define OPERANDSEPARATOR ','	/* char separating operands */
11 #define OPSEPARATOR '\t'	/* char separating op string and operand */
12 
13 EXTERN uoffset_T arg1size;	/* size of 1st arg to function */
14 				/* zero after allocation of 1st arg */
15 EXTERN store_pt callee1mask;	/* calleemask with doubleregs masked if nec */
16 EXTERN uoffset_T dataoffset;	/* amount of initialized data so far */
17 #ifdef DBNODE
18 EXTERN bool_t dbnodeon;		/* nonzero to print debugging messages */
19 				/* depends on zero init */
20 #endif
21 #ifdef FRAMEPOINTER
22 EXTERN store_pt framelist;	/* bit pattern for frame and saved regs */
23 EXTERN store_pt frame1list;	/* framelist with doubleregs masked if nec */
24 EXTERN offset_T framep;		/* hardware relative frame ptr */
25 #endif
26 EXTERN uoffset_T func1saveregsize;  /* choice of next two values */
27 EXTERN uoffset_T funcdsaveregsize;  /* funcsaveregsize adjusted for doubles */
28 EXTERN uoffset_T funcsaveregsize;  /* tot size of framelist/calleemask regs */
29 #ifdef I80386
30 EXTERN bool_t i386_32;		/* nonzero to generate 386 32 bit code */
31 				/* depends on zero init */
32 #endif
33 #ifdef DYNAMIC_LONG_ORDER
34 EXTERN bool_t long_big_endian;	/* nonzero if high long word is first */
35 				/* depends on zero init */
36 #endif
37 EXTERN offset_T lowsp;		/* low water sp (collects locals in switch) */
38 #ifdef POSINDEPENDENT
39 EXTERN bool_t posindependent;	/* nonzero to generate pos-independent code */
40 				/* depends on zero init */
41 #endif
42 EXTERN bool_t printf_fp;	/* nonzero if *printf called with FP arg  */
43 EXTERN bool_t regarg;		/* nonzero to show unloaded register arg */
44 				/* depends on zero init */
45 EXTERN store_t reguse;		/* registers in use */
46 EXTERN bool_t scanf_fp;		/* nonzero if *scanf called with ptr-to-FP */
47 EXTERN offset_T softsp;		/* software sp (leads sp during declares) */
48 EXTERN offset_T sp;		/* hardware relative stack ptr */
49 				/* depends on zero init */
50 EXTERN store_t regfuse;		/* registers in use in function. */
51 #ifdef FRAMEPOINTER
52 EXTERN bool_t stackarg;		/* nonzero to show function has arg on stack */
53 #endif
54 EXTERN struct switchstruct *switchnow;	/* currently active switch */
55 				/* depends on NULL init */
56 EXTERN bool_t optimise;		/* nonzero to add optimisation code */
57 
58 /* variables to be initialised to nonzero */
59 
60 extern store_pt allindregs;	/* mask (in) for index registers */
61 extern store_pt allregs;	/* mask (in) for registers */
62 extern bool_t arg1inreg;	/* nonzero to pass 1st arg in reg */
63 extern store_pt calleemask;	/* mask (in) for regs to be saved by callee */
64 extern bool_t callersaves;	/* nonzero to make caller save regs */
65 extern char *callstring;	/* opcode string for call */
66 extern store_pt doubleargregs;	/* mask (in) for regs for 1st arg if double */
67 extern store_pt doubleregs;	/* mask (in) for regs to temp contain double */
68 extern store_pt doublreturnregs;  /* mask (in) for regs for returning double */
69 extern offset_T jcclonger;	/* amount jcc long jumps are longer */
70 extern offset_T jmplonger;	/* amount long jumps is longer */
71 extern char *jumpstring;	/* opcode string for jump */
72 extern char *regpulllist;	/* reg names and sizes (0 store_t bit first) */
73 extern char *regpushlist;	/* reg names and sizes (0 store_t bit last) */
74 extern store_pt regregs;	/* mask (in) for regs which can be reg vars */
75 
76 /* register names */
77 
78 extern char *acclostr;
79 extern char *accumstr;
80 extern char *badregstr;
81 #ifdef I8088
82 extern char *dreg1str;
83 extern char *dreg1bstr;
84 extern char *dreg2str;
85 #endif
86 extern char *ireg0str;
87 extern char *ireg1str;
88 extern char *ireg2str;
89 extern char *localregstr;
90 #ifdef I8088
91 extern char *stackregstr;
92 #endif
93 
94 /* register sizes */
95 
96 extern uoffset_T accregsize;
97 #ifdef FRAMEPOINTER
98 extern uoffset_T frameregsize;
99 #endif
100 extern uoffset_T maxregsize;
101 extern uoffset_T opregsize;
102 extern uoffset_T pshregsize;
103 extern uoffset_T returnadrsize;
104