Better sparse support.
[bertos.git] / cfg / cpu_detect.h
1 /**
2  * \file
3  * <!--
4  * Copyright 2004, 2005 Develer S.r.l. (http://www.develer.com/)
5  * Copyright 2004 Giovanni Bajo
6  * This file is part of DevLib - See README.devlib for information.
7  * -->
8  *
9  * \brief CPU detection through special preprocessor macros
10  */
11 #ifndef CPU_DETECT_H
12 #define CPU_DETECT_H
13
14 #if defined(__arm__) /* GCC */ \
15         || defined(__ARM4TM__) /* IAR: defined for all cores >= 4tm */
16         #define CPU_ARM                 1
17         #define CPU_ID                  arm
18 #else
19         #define CPU_ARM                 0
20 #endif
21
22 #if (defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)) \
23         && !defined(__ARM4TM__) /* IAR: if not ARM assume I196 */
24         #define CPU_I196                1
25         #define CPU_ID                  i196
26 #else
27         #define CPU_I196                0
28 #endif
29
30 #if defined(__i386__) /* GCC */ \
31         || (defined(_M_IX86) && !defined(_WIN64)) /* MSVC */
32         #define CPU_X86                 1
33         #define CPU_X86_32              1
34         #define CPU_X86_64              0
35         #define CPU_ID                  x86
36 #elif defined(__x86_64__) /* GCC */ \
37         || (defined(_M_IX86) && defined(_WIN64)) /* MSVC */
38         #define CPU_X86                 1
39         #define CPU_X86_32              0
40         #define CPU_X86_64              1
41         #define CPU_ID                  x86
42 #else
43         #define CPU_X86                 0
44         #define CPU_I386                0
45         #define CPU_X86_64              0
46 #endif
47
48 #if defined (_ARCH_PPC) || defined(_ARCH_PPC64)
49         #define CPU_PPC                 1
50         #define CPU_ID                  ppc
51         #if defined(_ARCH_PPC)
52                 #define CPU_PPC32       1
53         #else
54                 #define CPU_PPC32       0
55         #endif
56         #if defined(_ARCH_PPC64)
57                 #define CPU_PPC64       1
58         #else
59                 #define CPU_PPC64       0
60         #endif
61 #else
62         #define CPU_PPC                 0
63         #define CPU_PPC32               0
64         #define CPU_PPC64               0
65 #endif
66
67 #if defined(__m56800E__) || defined(__m56800__)
68         #define CPU_DSP56K              1
69         #define CPU_ID                  dsp56k
70 #else
71         #define CPU_DSP56K              0
72 #endif
73
74 #if defined (__AVR__)
75         #define CPU_AVR                 1
76         #define CPU_ID                  avr
77
78         #if defined(__AVR_ATmega64__)
79                 #define CPU_AVR_ATMEGA64    1
80         #else
81                 #define CPU_AVR_ATMEGA64    0
82         #endif
83
84         #if defined(__AVR_ATmega103__)
85                 #define CPU_AVR_ATMEGA103   1
86         #else
87                 #define CPU_AVR_ATMEGA103   0
88         #endif
89
90         #if defined(__AVR_ATmega128__)
91                 #define CPU_AVR_ATMEGA128   1
92         #else
93                 #define CPU_AVR_ATMEGA128   0
94         #endif
95
96         #if defined(__AVR_ATmega8__)
97                 #define CPU_AVR_ATMEGA8     1
98         #else
99                 #define CPU_AVR_ATMEGA8     0
100         #endif
101
102         #if defined(__AVR_ATmega168__)
103                 #define CPU_AVR_ATMEGA168   1
104         #else
105                 #define CPU_AVR_ATMEGA168   0
106         #endif
107
108         #if defined(__AVR_ATmega1281__)
109                 #define CPU_AVR_ATMEGA1281  1
110         #else
111                 #define CPU_AVR_ATMEGA1281  0
112         #endif
113 #else
114         #define CPU_AVR                 0
115         #define CPU_AVR_ATMEGA8         0
116         #define CPU_AVR_ATMEGA168       0
117         #define CPU_AVR_ATMEGA64        0
118         #define CPU_AVR_ATMEGA103       0
119         #define CPU_AVR_ATMEGA128       0
120         #define CPU_AVR_ATMEGA1281      0
121 #endif
122
123
124 /* Self-check for the detection: only one CPU must be detected */
125 #if CPU_ARM + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR == 0
126         #error Unknown CPU
127 #elif !defined(CPU_ID)
128         #error CPU_ID not defined
129 #elif CPU_ARM + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR != 1
130         #error Internal CPU configuration error
131 #endif
132
133
134 #endif /* CPU_DETECT_H */