[gforth] / gforth / Attic / 386.h  

gforth: gforth/Attic/386.h


1 : anton 1.1 /*
2 :     Copyright 1992 by the ANSI figForth Development Group
3 :    
4 :     This is the machine-specific part for Intel 386 compatible processors
5 :     */
6 :    
7 : anton 1.7 #include "32bit.h"
8 : anton 1.1
9 : anton 1.7 /* indirect threading is faster on the 486, on the 386 direct
10 :     threading is probably faster. Therefore we leave defining
11 :     DIRECT_THREADED to configure */
12 : anton 1.1
13 : anton 1.3 /* define this if the processor cannot exploit instruction-level
14 : anton 1.4 parallelism (no pipelining or too few registers) */
15 : anton 1.3 #define CISC_NEXT
16 :    
17 : anton 1.1 #ifdef DIRECT_THREADED
18 :     /* PFA gives the parameter field address corresponding to a cfa */
19 :     #define PFA(cfa) (((Cell *)cfa)+2)
20 :     /* PFA1 is a special version for use just after a NEXT1 */
21 :     #define PFA1(cfa) PFA(cfa)
22 :     /* CODE_ADDRESS is the address of the code jumped to through the code field */
23 : pazsan 1.2 #define CODE_ADDRESS(cfa) \
24 : anton 1.5 ({long _cfa = (long)(cfa); (Label)(_cfa+*((long *)(_cfa+1))+5);})
25 : anton 1.1 /* MAKE_CF creates an appropriate code field at the cfa; ca is the code address */
26 : pazsan 1.2 #define MAKE_CF(cfa,ca) ({long _cfa = (long)(cfa); \
27 :     long _ca = (long)(ca); \
28 : anton 1.1 *(char *)_cfa = 0xe9; /* jmp */ \
29 : pazsan 1.2 *(long *)(_cfa+1) = _ca-(_cfa+5);})
30 : anton 1.1
31 :     /* this is the point where the does code starts if label points to the
32 :     * jump dodoes */
33 : pazsan 1.2 #define DOES_HANDLER_SIZE 8
34 :     #define DOES_CODE(label) ((Xt *)(CODE_ADDRESS(label)+DOES_HANDLER_SIZE))
35 : anton 1.1
36 :     /* this is a special version of DOES_CODE for use in dodoes */
37 :     #define DOES_CODE1(label) DOES_CODE(label)
38 :    
39 :     /* this stores a jump dodoes at addr */
40 : pazsan 1.2 #define MAKE_DOES_HANDLER(addr) MAKE_CF(addr,symbols[DODOES])
41 :    
42 :     #define MAKE_DOES_CF(addr,doesp) MAKE_CF(addr,((int)(doesp)-8))
43 : anton 1.1 #endif
44 : anton 1.4
45 :     #ifdef FORCE_REG
46 :     #define IPREG asm("%esi")
47 :     #define SPREG asm("%edi")
48 :     #ifdef USE_TOS
49 :     #define CFAREG asm("%ecx")
50 :     #else
51 :     #define CFAREG asm("%edx")
52 :     #endif
53 :     #endif /* FORCE_REG */

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help