version 1.4, 1995/12/10 19:02:06
|
version 1.5, 1995/12/15 01:54:08
|
Line 28
|
Line 28
|
|
|
#ifndef INDIRECT_THREADED |
#ifndef INDIRECT_THREADED |
#ifndef DIRECT_THREADED |
#ifndef DIRECT_THREADED |
/* #define DIRECT_THREADED */ |
#define DIRECT_THREADED |
#endif |
#endif |
#endif |
#endif |
|
|
Line 54
|
Line 54
|
Another way is to use a special DOES_HANDLER, like most other CPUs */ |
Another way is to use a special DOES_HANDLER, like most other CPUs */ |
#endif |
#endif |
|
|
#warning Direct threading for Alpha may not work with all compiler versions |
#warning Direct threading for Alpha may not work with all gcc versions |
|
#warning CODE does not (yet) work on the Alpha with direct threading |
|
/* Currently CODE tries to put a jump to the PFA into the code field. |
|
Since the PFA is far away from docol, the present code generated |
|
for the jump does not work. The solution would be, of course, to do |
|
away with this foolish jump. ";CODE" is harder to get right, |
|
however. |
|
*/ |
|
|
typedef int Int32; |
typedef int Int32; |
typedef short Int16; |
typedef short Int16; |
Line 82 typedef short Int16;
|
Line 89 typedef short Int16;
|
How do we tell gcc all this? We declare the registers as variables: |
How do we tell gcc all this? We declare the registers as variables: |
_alpha_docol as explicit variable, to avoid spilling; _alpha_ca is |
_alpha_docol as explicit variable, to avoid spilling; _alpha_ca is |
so short-lived, so it hopefully won't be spilled. A |
so short-lived, so it hopefully won't be spilled. A |
pseudo-primitive cpu_dep is created with code that let's gcc's data |
pseudo-primitive cpu_dep is created with code that lets gcc's data |
flow analysis know that _alpha_docol is used and that _alpha_ca may |
flow analysis know that _alpha_docol is used and that _alpha_ca may |
be defined and used after any NEXT and before any primitive. We |
be defined and used after any NEXT and before any primitive. We |
let gcc choose the register for _alpha_ca and simply change the |
let gcc choose the register for _alpha_ca and simply change the |
Line 107 typedef short Int16;
|
Line 114 typedef short Int16;
|
#define _DOCOL_LABEL (symbols[DOCOL]) |
#define _DOCOL_LABEL (symbols[DOCOL]) |
|
|
/* MAKE_CF creates an appropriate code field at the wa; ca is the |
/* MAKE_CF creates an appropriate code field at the wa; ca is the |
code address. For the Alpha, this is a lda followed by a jmp */ |
code address. For the Alpha, this is a lda followed by a jmp. |
|
We patch the jmp with a good hint (on the 21064a this save 5 cycles!) */ |
|
/* !!do special case for docol */ |
#define MAKE_CF(wa,ca) ({ \ |
#define MAKE_CF(wa,ca) ({ \ |
Int32 *_wa=(Int32 *)(wa); \ |
Int32 *_wa=(Int32 *)(wa); \ |
Int32 *_ca=(Int32 *)(ca); \ |
Int32 *_ca=(Int32 *)(ca); \ |