[gforth] / gforth / Attic / 386.h  

gforth: gforth/Attic/386.h


1 : anton 1.1 /*
2 : anton 1.11 This is the machine-specific part for Intel 386 compatible processors
3 :    
4 :     Copyright (C) 1995 Free Software Foundation, Inc.
5 :    
6 :     This file is part of Gforth.
7 : anton 1.1
8 : anton 1.11 Gforth is free software; you can redistribute it and/or
9 :     modify it under the terms of the GNU General Public License
10 :     as published by the Free Software Foundation; either version 2
11 :     of the License, or (at your option) any later version.
12 :    
13 :     This program is distributed in the hope that it will be useful,
14 :     but WITHOUT ANY WARRANTY; without even the implied warranty of
15 :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     GNU General Public License for more details.
17 :    
18 :     You should have received a copy of the GNU General Public License
19 :     along with this program; if not, write to the Free Software
20 :     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 : anton 1.1 */
22 :    
23 : anton 1.7 #include "32bit.h"
24 : anton 1.1
25 : anton 1.7 /* indirect threading is faster on the 486, on the 386 direct
26 :     threading is probably faster. Therefore we leave defining
27 :     DIRECT_THREADED to configure */
28 : anton 1.1
29 : anton 1.3 /* define this if the processor cannot exploit instruction-level
30 : anton 1.4 parallelism (no pipelining or too few registers) */
31 : anton 1.3 #define CISC_NEXT
32 :    
33 : anton 1.9 /* 386 and below have no cache, 486 has a shared cache, and the
34 :     Pentium probably employs hardware cache consistency, so
35 :     flush-icache is a noop */
36 : pazsan 1.10 #define FLUSH_ICACHE(addr,size)
37 : anton 1.9
38 : anton 1.1 #ifdef DIRECT_THREADED
39 : pazsan 1.10
40 :     #define CALL 0xe8 /* call */
41 :     #define JMP 0xe9 /* jmp */
42 :     #define GETCFA(reg) ({ asm("popl %0" : "=r" (reg)); (int)reg -= 5;});
43 :    
44 : anton 1.1 /* PFA gives the parameter field address corresponding to a cfa */
45 :     #define PFA(cfa) (((Cell *)cfa)+2)
46 :     /* PFA1 is a special version for use just after a NEXT1 */
47 :     #define PFA1(cfa) PFA(cfa)
48 :     /* CODE_ADDRESS is the address of the code jumped to through the code field */
49 : pazsan 1.2 #define CODE_ADDRESS(cfa) \
50 : anton 1.5 ({long _cfa = (long)(cfa); (Label)(_cfa+*((long *)(_cfa+1))+5);})
51 : anton 1.1 /* MAKE_CF creates an appropriate code field at the cfa; ca is the code address */
52 : pazsan 1.2 #define MAKE_CF(cfa,ca) ({long _cfa = (long)(cfa); \
53 :     long _ca = (long)(ca); \
54 : pazsan 1.10 *(char *)_cfa = CALL; \
55 : pazsan 1.2 *(long *)(_cfa+1) = _ca-(_cfa+5);})
56 : anton 1.1
57 :     /* this is the point where the does code starts if label points to the
58 :     * jump dodoes */
59 : pazsan 1.12 #define DOES_CODE(xt) \
60 : anton 1.13 ({ long _xt = (long)(xt); \
61 :     long _ca = (long)(CODE_ADDRESS(_xt)); \
62 : anton 1.14 ((((*(unsigned char *)_xt) == CALL) \
63 :     && ((*(unsigned char *)_ca) == JMP) \
64 :     && ((long)(CODE_ADDRESS(_ca)) == (long)&&dodoes)) \
65 :     ? _ca+DOES_HANDLER_SIZE : 0L); })
66 : anton 1.1
67 :     /* this is a special version of DOES_CODE for use in dodoes */
68 : pazsan 1.12 #define DOES_CODE1(label) (CODE_ADDRESS(label)+DOES_HANDLER_SIZE)
69 : anton 1.1
70 :     /* this stores a jump dodoes at addr */
71 : pazsan 1.10 #define MAKE_DOES_CF(addr,doesp) ({long _addr = (long)(addr); \
72 :     long _doesp = (long)(doesp)-8; \
73 :     *(char *)_addr = CALL; \
74 :     *(long *)(_addr+1) = _doesp-(_addr+5);})
75 :    
76 :     #define MAKE_DOES_HANDLER(addr) ({long _addr = (long)(addr); \
77 :     long _dodo = (long)symbols[DODOES]; \
78 :     *(char *)_addr = JMP; \
79 :     *(long *)(_addr+1) = _dodo-(_addr+5);})
80 : anton 1.1 #endif
81 : anton 1.4
82 :     #ifdef FORCE_REG
83 : anton 1.8 #if (__GNUC__==2 && defined(__GNUC_MINOR__) && __GNUC_MINOR__==5)
84 :     /* i.e. gcc-2.5.x */
85 :     /* this works with 2.5.7; nothing works with 2.5.8 */
86 : anton 1.4 #define IPREG asm("%esi")
87 :     #define SPREG asm("%edi")
88 :     #ifdef USE_TOS
89 :     #define CFAREG asm("%ecx")
90 :     #else
91 :     #define CFAREG asm("%edx")
92 :     #endif
93 : anton 1.8 #else /* gcc-version */
94 :     /* this works with 2.6.3 (and quite well, too) */
95 :     /* since this is not very demanding, it's the default for other gcc versions */
96 : pazsan 1.10 #if defined(USE_TOS) && !defined(CFA_NEXT)
97 :     #define IPREG asm("%ebx")
98 :     #else
99 : anton 1.8 #define SPREG asm("%ebx")
100 : pazsan 1.10 #endif /* USE_TOS && !CFA_NEXT */
101 : anton 1.8 #endif /* gcc-version */
102 : anton 1.4 #endif /* FORCE_REG */

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help