blob: bca7bfbf29c44ede8eed9a650cc64555ee76d354 [file] [log] [blame]
Richard Barton7dacc242015-10-21 10:03:55 +00001// RUN: %clang -target armv8a-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V8A %s
2// CHECK-V8A: __ARMEL__ 1
3// CHECK-V8A: __ARM_ARCH 8
4// CHECK-V8A: __ARM_ARCH_8A__ 1
5// CHECK-V8A: __ARM_FEATURE_CRC32 1
6// CHECK-V8A: __ARM_FEATURE_DIRECTED_ROUNDING 1
7// CHECK-V8A: __ARM_FEATURE_NUMERIC_MAXMIN 1
8// CHECK-V8A: __ARM_FP 0xE
9// CHECK-V8A: __ARM_FP16_ARGS 1
10// CHECK-V8A: __ARM_FP16_FORMAT_IEEE 1
Joey Gouly1e8637b2013-09-18 10:07:09 +000011
12// RUN: %clang -target armv7a-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V7 %s
13// CHECK-V7: __ARMEL__ 1
14// CHECK-V7: __ARM_ARCH 7
15// CHECK-V7: __ARM_ARCH_7A__ 1
Nico Riecke6a158252014-02-16 07:29:41 +000016// CHECK-V7-NOT: __ARM_FEATURE_CRC32
Pablo Barrio1c1b2512016-03-15 19:03:09 +000017// CHECK-V7-NOT: __ARM_FEATURE_NUMERIC_MAXMIN
James Molloy0ffb0932014-09-15 11:25:38 +000018// CHECK-V7-NOT: __ARM_FEATURE_DIRECTED_ROUNDING
Richard Barton7dacc242015-10-21 10:03:55 +000019// CHECK-V7: __ARM_FP 0xC
Silviu Barangae5690462013-10-21 10:59:33 +000020
Tim Northover525c73c2015-07-21 21:47:33 +000021// RUN: %clang -target x86_64-apple-macosx10.10 -arch armv7s -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V7S %s
22// CHECK-V7S: __ARMEL__ 1
23// CHECK-V7S: __ARM_ARCH 7
24// CHECK-V7S: __ARM_ARCH_7S__ 1
25// CHECK-V7S-NOT: __ARM_FEATURE_CRC32
26// CHECK-V7S-NOT: __ARM_FEATURE_NUMERIC_MAXMIN
27// CHECK-V7S-NOT: __ARM_FEATURE_DIRECTED_ROUNDING
Richard Barton7dacc242015-10-21 10:03:55 +000028// CHECK-V7S: __ARM_FP 0xE
Tim Northover525c73c2015-07-21 21:47:33 +000029
Bernard Ogdenda13af32013-10-24 18:32:51 +000030// RUN: %clang -target armv8a -mfloat-abi=hard -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF %s
31// CHECK-V8-BAREHF: __ARMEL__ 1
32// CHECK-V8-BAREHF: __ARM_ARCH 8
33// CHECK-V8-BAREHF: __ARM_ARCH_8A__ 1
34// CHECK-V8-BAREHF: __ARM_FEATURE_CRC32 1
James Molloy0ffb0932014-09-15 11:25:38 +000035// CHECK-V8-BAREHF: __ARM_FEATURE_DIRECTED_ROUNDING 1
36// CHECK-V8-BAREHF: __ARM_FEATURE_NUMERIC_MAXMIN 1
Richard Barton7dacc242015-10-21 10:03:55 +000037// CHECK-V8-BAREHP: __ARM_FP 0xE
Bernard Ogdenda13af32013-10-24 18:32:51 +000038// CHECK-V8-BAREHF: __ARM_NEON__ 1
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +000039// CHECK-V8-BAREHF: __ARM_PCS_VFP 1
Bernard Ogdenda13af32013-10-24 18:32:51 +000040// CHECK-V8-BAREHF: __VFP_FP__ 1
41
42// RUN: %clang -target armv8a -mfloat-abi=hard -mfpu=fp-armv8 -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF-FP %s
43// CHECK-V8-BAREHF-FP-NOT: __ARM_NEON__ 1
Richard Barton7dacc242015-10-21 10:03:55 +000044// CHECK-V8-BAREHP-FP: __ARM_FP 0xE
Bernard Ogdenda13af32013-10-24 18:32:51 +000045// CHECK-V8-BAREHF-FP: __VFP_FP__ 1
46
47// RUN: %clang -target armv8a -mfloat-abi=hard -mfpu=neon-fp-armv8 -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF-NEON-FP %s
48// RUN: %clang -target armv8a -mfloat-abi=hard -mfpu=crypto-neon-fp-armv8 -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF-NEON-FP %s
Richard Barton7dacc242015-10-21 10:03:55 +000049// CHECK-V8-BAREHP-NEON-FP: __ARM_FP 0xE
Bernard Ogdenda13af32013-10-24 18:32:51 +000050// CHECK-V8-BAREHF-NEON-FP: __ARM_NEON__ 1
51// CHECK-V8-BAREHF-NEON-FP: __VFP_FP__ 1
52
Bernard Ogden18b57012013-10-29 09:47:51 +000053// RUN: %clang -target armv8a -mnocrc -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-NOCRC %s
54// CHECK-V8-NOCRC-NOT: __ARM_FEATURE_CRC32 1
55
Silviu Barangae5690462013-10-21 10:59:33 +000056// Check that -mhwdiv works properly for armv8/thumbv8 (enabled by default).
57
58// RUN: %clang -target armv8 -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8 %s
59// ARMV8:#define __ARM_ARCH_EXT_IDIV__ 1
60
61// RUN: %clang -target armv8 -mthumb -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBV8 %s
62// THUMBV8:#define __ARM_ARCH_EXT_IDIV__ 1
63
64// RUN: %clang -target armv8-eabi -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8-EABI %s
65// ARMV8-EABI:#define __ARM_ARCH_EXT_IDIV__ 1
66
67// RUN: %clang -target armv8-eabi -mthumb -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBV8-EABI %s
68// THUMBV8-EABI:#define __ARM_ARCH_EXT_IDIV__ 1
69
70// RUN: %clang -target armv8 -mhwdiv=none -x c -E -dM %s -o - | FileCheck --check-prefix=NONEHWDIV-ARMV8 %s
71// NONEHWDIV-ARMV8-NOT:#define __ARM_ARCH_EXT_IDIV__
72
73// RUN: %clang -target armv8 -mthumb -mhwdiv=none -x c -E -dM %s -o - | FileCheck --check-prefix=NONEHWDIV-THUMBV8 %s
74// NONEHWDIV-THUMBV8-NOT:#define __ARM_ARCH_EXT_IDIV__
75
76// RUN: %clang -target armv8 -mhwdiv=thumb -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBHWDIV-ARMV8 %s
77// THUMBHWDIV-ARMV8-NOT:#define __ARM_ARCH_EXT_IDIV__
78
79// RUN: %clang -target armv8 -mthumb -mhwdiv=arm -x c -E -dM %s -o - | FileCheck --check-prefix=ARMHWDIV-THUMBV8 %s
80// ARMHWDIV-THUMBV8-NOT:#define __ARM_ARCH_EXT_IDIV__
81
82// RUN: %clang -target armv8a -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8A %s
83// ARMV8A:#define __ARM_ARCH_EXT_IDIV__ 1
Richard Barton7dacc242015-10-21 10:03:55 +000084// ARMV8A: #define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +000085
86// RUN: %clang -target armv8a -mthumb -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBV8A %s
87// THUMBV8A:#define __ARM_ARCH_EXT_IDIV__ 1
Richard Barton7dacc242015-10-21 10:03:55 +000088// THUMBV8A: #define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +000089
90// RUN: %clang -target armv8a-eabi -x c -E -dM %s -o - | FileCheck --check-prefix=ARMV8A-EABI %s
91// ARMV8A-EABI:#define __ARM_ARCH_EXT_IDIV__ 1
Richard Barton7dacc242015-10-21 10:03:55 +000092// ARMV8A-EABI: #define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +000093
94// RUN: %clang -target armv8a-eabi -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBV8A-EABI %s
95// THUMBV8A-EABI:#define __ARM_ARCH_EXT_IDIV__ 1
Richard Barton7dacc242015-10-21 10:03:55 +000096// THUMBV8A-EABI: #define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +000097
Bradley Smithf4affc12016-03-03 13:52:22 +000098// RUN: %clang -target armv8m.base-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_BASELINE %s
99// V8M_BASELINE: __ARM_ARCH 8
100// V8M_BASELINE: __ARM_ARCH_8M_BASE__ 1
101// V8M_BASELINE: __ARM_ARCH_EXT_IDIV__ 1
102// V8M_BASELINE-NOT: __ARM_ARCH_ISA_ARM
103// V8M_BASELINE: __ARM_ARCH_ISA_THUMB 1
104// V8M_BASELINE: __ARM_ARCH_PROFILE 'M'
105// V8M_BASELINE-NOT: __ARM_FEATURE_CRC32
106// V8M_BASELINE-NOT: __ARM_FEATURE_DSP
107// V8M_BASELINE-NOT: __ARM_FP 0x{{.*}}
108// V8M_BASELINE-NOT: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
109
110// RUN: %clang -target armv8m.main-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_MAINLINE %s
111// V8M_MAINLINE: __ARM_ARCH 8
112// V8M_MAINLINE: __ARM_ARCH_8M_MAIN__ 1
113// V8M_MAINLINE: __ARM_ARCH_EXT_IDIV__ 1
114// V8M_MAINLINE-NOT: __ARM_ARCH_ISA_ARM
115// V8M_MAINLINE: __ARM_ARCH_ISA_THUMB 2
116// V8M_MAINLINE: __ARM_ARCH_PROFILE 'M'
117// V8M_MAINLINE-NOT: __ARM_FEATURE_CRC32
118// V8M_MAINLINE-NOT: __ARM_FEATURE_DSP
119// V8M_MAINLINE: __ARM_FP 0xE
120// V8M_MAINLINE: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
121
122// RUN: %clang -target arm-none-linux-gnu -march=armv8-m.main+dsp -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_MAINLINE_DSP %s
123// V8M_MAINLINE_DSP: __ARM_ARCH 8
124// V8M_MAINLINE_DSP: __ARM_ARCH_8M_MAIN__ 1
125// V8M_MAINLINE_DSP: __ARM_ARCH_EXT_IDIV__ 1
126// V8M_MAINLINE_DSP-NOT: __ARM_ARCH_ISA_ARM
127// V8M_MAINLINE_DSP: __ARM_ARCH_ISA_THUMB 2
128// V8M_MAINLINE_DSP: __ARM_ARCH_PROFILE 'M'
129// V8M_MAINLINE_DSP-NOT: __ARM_FEATURE_CRC32
130// V8M_MAINLINE_DSP: __ARM_FEATURE_DSP 1
131// V8M_MAINLINE_DSP: __ARM_FP 0xE
132// V8M_MAINLINE_DSP: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
133
Bradley Smith0f28f0c2014-01-20 10:52:00 +0000134// RUN: %clang -target arm-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DEFS %s
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +0000135// CHECK-DEFS:#define __ARM_PCS 1
Bradley Smith0f28f0c2014-01-20 10:52:00 +0000136// CHECK-DEFS:#define __ARM_SIZEOF_MINIMAL_ENUM 4
137// CHECK-DEFS:#define __ARM_SIZEOF_WCHAR_T 4
138
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +0000139// RUN: %clang -target arm-none-linux-gnu -fno-math-errno -fno-signed-zeros\
140// RUN: -fno-trapping-math -fassociative-math -freciprocal-math\
141// RUN: -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s
142// RUN: %clang -target arm-none-linux-gnu -ffast-math -x c -E -dM %s -o -\
143// RUN: | FileCheck --check-prefix=CHECK-FASTMATH %s
144// CHECK-FASTMATH: __ARM_FP_FAST 1
145
Bradley Smith0f28f0c2014-01-20 10:52:00 +0000146// RUN: %clang -target arm-none-linux-gnu -fshort-wchar -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SHORTWCHAR %s
147// CHECK-SHORTWCHAR:#define __ARM_SIZEOF_WCHAR_T 2
148
149// RUN: %clang -target arm-none-linux-gnu -fshort-enums -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SHORTENUMS %s
150// CHECK-SHORTENUMS:#define __ARM_SIZEOF_MINIMAL_ENUM 1
Silviu Barangae5690462013-10-21 10:59:33 +0000151
152// Test that -mhwdiv has the right effect for a target CPU which has hwdiv enabled by default.
153// RUN: %clang -target armv7 -mcpu=cortex-a15 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-ARM %s
154// DEFAULTHWDIV-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
155
156// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a15 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-THUMB %s
157// DEFAULTHWDIV-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
158
159// RUN: %clang -target armv7 -mcpu=cortex-a15 -mhwdiv=arm -x c -E -dM %s -o - | FileCheck --check-prefix=ARMHWDIV-ARM %s
160// ARMHWDIV-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
161
162// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a15 -mhwdiv=thumb -x c -E -dM %s -o - | FileCheck --check-prefix=THUMBHWDIV-THUMB %s
163// THUMBHWDIV-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
164
165// RUN: %clang -target arm -mcpu=cortex-a15 -mhwdiv=thumb -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-THUMBHWDIV-ARM %s
166// DEFAULTHWDIV-THUMBHWDIV-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
167
168// RUN: %clang -target arm -mthumb -mcpu=cortex-a15 -mhwdiv=arm -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-ARMHWDIV-THUMB %s
169// DEFAULTHWDIV-ARMHWDIV-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
170
171// RUN: %clang -target arm -mcpu=cortex-a15 -mhwdiv=none -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-NONEHWDIV-ARM %s
172// DEFAULTHWDIV-NONEHWDIV-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
173
174// RUN: %clang -target arm -mthumb -mcpu=cortex-a15 -mhwdiv=none -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTHWDIV-NONEHWDIV-THUMB %s
175// DEFAULTHWDIV-NONEHWDIV-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
176
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000177
178// Check that -mfpu works properly for Cortex-A7 (enabled by default).
179// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a7 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A7 %s
180// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a7 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A7 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000181// DEFAULTFPU-A7:#define __ARM_FP 0xE
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000182// DEFAULTFPU-A7:#define __ARM_NEON__ 1
183// DEFAULTFPU-A7:#define __ARM_VFPV4__ 1
184
185// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a7 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A7 %s
186// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a7 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A7 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000187// FPUNONE-A7-NOT:#define __ARM_FP 0x{{.*}}
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000188// FPUNONE-A7-NOT:#define __ARM_NEON__ 1
189// FPUNONE-A7-NOT:#define __ARM_VFPV4__ 1
190
191// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a7 -mfpu=vfp4 -x c -E -dM %s -o - | FileCheck --check-prefix=NONEON-A7 %s
192// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a7 -mfpu=vfp4 -x c -E -dM %s -o - | FileCheck --check-prefix=NONEON-A7 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000193// NONEON-A7:#define __ARM_FP 0xE
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000194// NONEON-A7-NOT:#define __ARM_NEON__ 1
195// NONEON-A7:#define __ARM_VFPV4__ 1
196
Amara Emersona1daec72013-11-25 13:18:59 +0000197// Check that -mfpu works properly for Cortex-A5 (enabled by default).
198// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A5 %s
199// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A5 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000200// DEFAULTFPU-A5:#define __ARM_FP 0xE
Amara Emersona1daec72013-11-25 13:18:59 +0000201// DEFAULTFPU-A5:#define __ARM_NEON__ 1
202// DEFAULTFPU-A5:#define __ARM_VFPV4__ 1
203
204// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a5 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A5 %s
205// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a5 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A5 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000206// FPUNONE-A5-NOT:#define __ARM_FP 0x{{.*}}
Amara Emersona1daec72013-11-25 13:18:59 +0000207// FPUNONE-A5-NOT:#define __ARM_NEON__ 1
208// FPUNONE-A5-NOT:#define __ARM_VFPV4__ 1
209
John Brawn5a589ad2015-06-05 13:34:11 +0000210// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a5 -mfpu=vfp4-d16 -x c -E -dM %s -o - | FileCheck --check-prefix=NONEON-A5 %s
211// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a5 -mfpu=vfp4-d16 -x c -E -dM %s -o - | FileCheck --check-prefix=NONEON-A5 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000212// NONEON-A5:#define __ARM_FP 0xE
Amara Emersona1daec72013-11-25 13:18:59 +0000213// NONEON-A5-NOT:#define __ARM_NEON__ 1
214// NONEON-A5:#define __ARM_VFPV4__ 1
215
Silviu Barangae5690462013-10-21 10:59:33 +0000216// FIXME: add check for further predefines
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000217// Test whether predefines are as expected when targeting ep9312.
218// RUN: %clang -target armv4t -mcpu=ep9312 -x c -E -dM %s -o - | FileCheck --check-prefix=A4T %s
219// A4T-NOT:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000220// A4T-NOT:#define __ARM_FP 0x{{.*}}
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000221
222// Test whether predefines are as expected when targeting arm10tdmi.
223// RUN: %clang -target armv5 -mcpu=arm10tdmi -x c -E -dM %s -o - | FileCheck --check-prefix=A5T %s
224// A5T-NOT:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000225// A5T-NOT:#define __ARM_FP 0x{{.*}}
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000226
Silviu Barangae5690462013-10-21 10:59:33 +0000227// Test whether predefines are as expected when targeting cortex-a5.
228// RUN: %clang -target armv7 -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=A5-ARM %s
229// A5-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000230// A5-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000231// A5-ARM:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000232
233// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=A5-THUMB %s
234// A5-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000235// A5-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000236// A5-THUMB:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000237
Amara Emersona1daec72013-11-25 13:18:59 +0000238// RUN: %clang -target armv7 -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=A5 %s
239// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a5 -x c -E -dM %s -o - | FileCheck --check-prefix=A5 %s
240// A5:#define __ARM_ARCH 7
241// A5:#define __ARM_ARCH_7A__ 1
Saleem Abdulrasool52a5d412014-06-15 18:48:41 +0000242// A5:#define __ARM_ARCH_PROFILE 'A'
James Molloy0ffb0932014-09-15 11:25:38 +0000243// A5-NOT: #define __ARM_FEATURE_NUMERIC_MAXMIN
244// A5-NOT: #define __ARM_FEATURE_DIRECTED_ROUNDING
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000245// A5:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000246// A5:#define __ARM_FP 0xE
Amara Emersona1daec72013-11-25 13:18:59 +0000247
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000248// Test whether predefines are as expected when targeting cortex-a7.
Tim Northover6f3ff222015-10-30 16:30:27 +0000249// RUN: %clang -target armv7k -mcpu=cortex-a7 -x c -E -dM %s -o - | FileCheck --check-prefix=A7 %s
250// RUN: %clang -target armv7k -mthumb -mcpu=cortex-a7 -x c -E -dM %s -o - | FileCheck --check-prefix=A7 %s
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000251// A7:#define __ARM_ARCH 7
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000252// A7:#define __ARM_ARCH_EXT_IDIV__ 1
Saleem Abdulrasool52a5d412014-06-15 18:48:41 +0000253// A7:#define __ARM_ARCH_PROFILE 'A'
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000254// A7:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000255// A7:#define __ARM_FP 0xE
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000256
Silviu Barangae5690462013-10-21 10:59:33 +0000257// Test whether predefines are as expected when targeting cortex-a8.
258// RUN: %clang -target armv7 -mcpu=cortex-a8 -x c -E -dM %s -o - | FileCheck --check-prefix=A8-ARM %s
259// A8-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000260// A8-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000261// A8-ARM:#define __ARM_FP 0xC
Silviu Barangae5690462013-10-21 10:59:33 +0000262
263// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a8 -x c -E -dM %s -o - | FileCheck --check-prefix=A8-THUMB %s
264// A8-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000265// A8-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000266// A8-THUMB:#define __ARM_FP 0xC
Silviu Barangae5690462013-10-21 10:59:33 +0000267
268// Test whether predefines are as expected when targeting cortex-a9.
269// RUN: %clang -target armv7 -mcpu=cortex-a9 -x c -E -dM %s -o - | FileCheck --check-prefix=A9-ARM %s
270// A9-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000271// A9-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000272// A9-ARM:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000273
274// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a9 -x c -E -dM %s -o - | FileCheck --check-prefix=A9-THUMB %s
275// A9-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000276// A9-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000277// A9-THUMB:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000278
Richard Barton3b82ed32013-11-22 11:53:28 +0000279
280// Check that -mfpu works properly for Cortex-A12 (enabled by default).
281// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a12 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A12 %s
282// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a12 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A12 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000283// DEFAULTFPU-A12:#define __ARM_FP 0xE
Richard Barton3b82ed32013-11-22 11:53:28 +0000284// DEFAULTFPU-A12:#define __ARM_NEON__ 1
285// DEFAULTFPU-A12:#define __ARM_VFPV4__ 1
286
287// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a12 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A12 %s
288// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a12 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A12 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000289// FPUNONE-A12-NOT:#define __ARM_FP 0x{{.*}}
Richard Barton3b82ed32013-11-22 11:53:28 +0000290// FPUNONE-A12-NOT:#define __ARM_NEON__ 1
291// FPUNONE-A12-NOT:#define __ARM_VFPV4__ 1
292
293// Test whether predefines are as expected when targeting cortex-a12.
294// RUN: %clang -target armv7 -mcpu=cortex-a12 -x c -E -dM %s -o - | FileCheck --check-prefix=A12 %s
295// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a12 -x c -E -dM %s -o - | FileCheck --check-prefix=A12 %s
296// A12:#define __ARM_ARCH 7
297// A12:#define __ARM_ARCH_7A__ 1
298// A12:#define __ARM_ARCH_EXT_IDIV__ 1
Saleem Abdulrasool52a5d412014-06-15 18:48:41 +0000299// A12:#define __ARM_ARCH_PROFILE 'A'
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000300// A12:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000301// A12:#define __ARM_FP 0xE
Richard Barton3b82ed32013-11-22 11:53:28 +0000302
Silviu Barangae5690462013-10-21 10:59:33 +0000303// Test whether predefines are as expected when targeting cortex-a15.
304// RUN: %clang -target armv7 -mcpu=cortex-a15 -x c -E -dM %s -o - | FileCheck --check-prefix=A15-ARM %s
305// A15-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000306// A15-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000307// A15-ARM:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000308
309// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a15 -x c -E -dM %s -o - | FileCheck --check-prefix=A15-THUMB %s
310// A15-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000311// A15-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000312// A15-THUMB:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000313
Renato Golin5886bc32014-10-13 10:22:48 +0000314// Check that -mfpu works properly for Cortex-A17 (enabled by default).
315// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a17 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A17 %s
316// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a17 -x c -E -dM %s -o - | FileCheck --check-prefix=DEFAULTFPU-A17 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000317// DEFAULTFPU-A17:#define __ARM_FP 0xE
Renato Golin5886bc32014-10-13 10:22:48 +0000318// DEFAULTFPU-A17:#define __ARM_NEON__ 1
319// DEFAULTFPU-A17:#define __ARM_VFPV4__ 1
320
321// RUN: %clang -target armv7-none-linux-gnueabi -mcpu=cortex-a17 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A17 %s
322// RUN: %clang -target armv7-none-linux-gnueabi -mthumb -mcpu=cortex-a17 -mfpu=none -x c -E -dM %s -o - | FileCheck --check-prefix=FPUNONE-A17 %s
Richard Barton7dacc242015-10-21 10:03:55 +0000323// FPUNONE-A17-NOT:#define __ARM_FP 0x{{.*}}
Renato Golin5886bc32014-10-13 10:22:48 +0000324// FPUNONE-A17-NOT:#define __ARM_NEON__ 1
325// FPUNONE-A17-NOT:#define __ARM_VFPV4__ 1
326
327// Test whether predefines are as expected when targeting cortex-a17.
328// RUN: %clang -target armv7 -mcpu=cortex-a17 -x c -E -dM %s -o - | FileCheck --check-prefix=A17 %s
329// RUN: %clang -target armv7 -mthumb -mcpu=cortex-a17 -x c -E -dM %s -o - | FileCheck --check-prefix=A17 %s
330// A17:#define __ARM_ARCH 7
331// A17:#define __ARM_ARCH_7A__ 1
332// A17:#define __ARM_ARCH_EXT_IDIV__ 1
333// A17:#define __ARM_ARCH_PROFILE 'A'
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000334// A17:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000335// A17:#define __ARM_FP 0xE
Renato Golin5886bc32014-10-13 10:22:48 +0000336
Silviu Barangae5690462013-10-21 10:59:33 +0000337// Test whether predefines are as expected when targeting swift.
338// RUN: %clang -target armv7s -mcpu=swift -x c -E -dM %s -o - | FileCheck --check-prefix=SWIFT-ARM %s
339// SWIFT-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
Richard Barton7dacc242015-10-21 10:03:55 +0000340// SWIFT-ARM:#define __ARM_FEATURE_DSP
341// SWIFT-ARM:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000342
343// RUN: %clang -target armv7s -mthumb -mcpu=swift -x c -E -dM %s -o - | FileCheck --check-prefix=SWIFT-THUMB %s
344// SWIFT-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000345// SWIFT-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000346// SWIFT-THUMB:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000347
348// Test whether predefines are as expected when targeting cortex-a53.
349// RUN: %clang -target armv8 -mcpu=cortex-a53 -x c -E -dM %s -o - | FileCheck --check-prefix=A53-ARM %s
350// A53-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000351// A53-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000352// A53-ARM:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000353
354// RUN: %clang -target armv8 -mthumb -mcpu=cortex-a53 -x c -E -dM %s -o - | FileCheck --check-prefix=A53-THUMB %s
355// A53-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000356// A53-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000357// A53-THUMB:#define __ARM_FP 0xE
Silviu Barangae5690462013-10-21 10:59:33 +0000358
Javed Absar879d18b82015-04-09 14:12:10 +0000359// Test whether predefines are as expected when targeting cortex-r4.
360// RUN: %clang -target armv7 -mcpu=cortex-r4 -x c -E -dM %s -o - | FileCheck --check-prefix=R4-ARM %s
361// R4-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
362// R4-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000363// R4-ARM-NOT:#define __ARM_FP 0x{{.*}}
Javed Absar879d18b82015-04-09 14:12:10 +0000364
365// RUN: %clang -target armv7 -mthumb -mcpu=cortex-r4 -x c -E -dM %s -o - | FileCheck --check-prefix=R4-THUMB %s
366// R4-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
367// R4-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000368// R4-THUMB-NOT:#define __ARM_FP 0x{{.*}}
Javed Absar879d18b82015-04-09 14:12:10 +0000369
370// Test whether predefines are as expected when targeting cortex-r4f.
371// RUN: %clang -target armv7 -mcpu=cortex-r4f -x c -E -dM %s -o - | FileCheck --check-prefix=R4F-ARM %s
372// R4F-ARM-NOT:#define __ARM_ARCH_EXT_IDIV__
373// R4F-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000374// R4F-ARM:#define __ARM_FP 0xC
Javed Absar879d18b82015-04-09 14:12:10 +0000375
376// RUN: %clang -target armv7 -mthumb -mcpu=cortex-r4f -x c -E -dM %s -o - | FileCheck --check-prefix=R4F-THUMB %s
377// R4F-THUMBT:#define __ARM_ARCH_EXT_IDIV__ 1
378// R4F-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000379// R4F-THUMB:#define __ARM_FP 0xC
Javed Absar879d18b82015-04-09 14:12:10 +0000380
Silviu Barangae5690462013-10-21 10:59:33 +0000381// Test whether predefines are as expected when targeting cortex-r5.
382// RUN: %clang -target armv7 -mcpu=cortex-r5 -x c -E -dM %s -o - | FileCheck --check-prefix=R5-ARM %s
383// R5-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000384// R5-ARM:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000385// R5-ARM:#define __ARM_FP 0xC
Silviu Barangae5690462013-10-21 10:59:33 +0000386
387// RUN: %clang -target armv7 -mthumb -mcpu=cortex-r5 -x c -E -dM %s -o - | FileCheck --check-prefix=R5-THUMB %s
388// R5-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000389// R5-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000390// R5-THUMB:#define __ARM_FP 0xC
Silviu Barangae5690462013-10-21 10:59:33 +0000391
Pablo Barrio2a35ff02016-03-16 10:21:04 +0000392// Test whether predefines are as expected when targeting cortex-r7 and cortex-r8.
393// RUN: %clang -target armv7 -mcpu=cortex-r7 -x c -E -dM %s -o - | FileCheck --check-prefix=R7-R8-ARM %s
394// RUN: %clang -target armv7 -mcpu=cortex-r8 -x c -E -dM %s -o - | FileCheck --check-prefix=R7-R8-ARM %s
395// R7-R8-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
396// R7-R8-ARM:#define __ARM_FEATURE_DSP
397// R7-R8-ARM:#define __ARM_FP 0xE
Bradley Smithd86d6702015-02-18 10:34:48 +0000398
Pablo Barrio2a35ff02016-03-16 10:21:04 +0000399// RUN: %clang -target armv7 -mthumb -mcpu=cortex-r7 -x c -E -dM %s -o - | FileCheck --check-prefix=R7-R8-THUMB %s
400// RUN: %clang -target armv7 -mthumb -mcpu=cortex-r8 -x c -E -dM %s -o - | FileCheck --check-prefix=R7-R8-THUMB %s
401// R7-R8-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
402// R7-R8-THUMB:#define __ARM_FEATURE_DSP
403// R7-R8-THUMB:#define __ARM_FP 0xE
Bradley Smithd86d6702015-02-18 10:34:48 +0000404
Silviu Barangae5690462013-10-21 10:59:33 +0000405// Test whether predefines are as expected when targeting cortex-m0.
406// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m0 -x c -E -dM %s -o - | FileCheck --check-prefix=M0-THUMB %s
Bradley Smithd86d6702015-02-18 10:34:48 +0000407// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m0plus -x c -E -dM %s -o - | FileCheck --check-prefix=M0-THUMB %s
408// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m1 -x c -E -dM %s -o - | FileCheck --check-prefix=M0-THUMB %s
409// RUN: %clang -target armv7 -mthumb -mcpu=sc000 -x c -E -dM %s -o - | FileCheck --check-prefix=M0-THUMB %s
Silviu Barangae5690462013-10-21 10:59:33 +0000410// M0-THUMB-NOT:#define __ARM_ARCH_EXT_IDIV__
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000411// M0-THUMB-NOT:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000412// M0-THUMB-NOT:#define __ARM_FP 0x{{.*}}
Silviu Barangae5690462013-10-21 10:59:33 +0000413
414// Test whether predefines are as expected when targeting cortex-m3.
415// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m3 -x c -E -dM %s -o - | FileCheck --check-prefix=M3-THUMB %s
Bradley Smithd86d6702015-02-18 10:34:48 +0000416// RUN: %clang -target armv7 -mthumb -mcpu=sc300 -x c -E -dM %s -o - | FileCheck --check-prefix=M3-THUMB %s
Silviu Barangae5690462013-10-21 10:59:33 +0000417// M3-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000418// M3-THUMB-NOT:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000419// M3-THUMB-NOT:#define __ARM_FP 0x{{.*}}
Silviu Barangae5690462013-10-21 10:59:33 +0000420
421// Test whether predefines are as expected when targeting cortex-m4.
422// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m4 -x c -E -dM %s -o - | FileCheck --check-prefix=M4-THUMB %s
423// M4-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000424// M4-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000425// M4-THUMB:#define __ARM_FP 0x6
Ana Pazosdd6068d2013-12-06 22:43:17 +0000426
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000427// Test whether predefines are as expected when targeting cortex-m7.
428// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m7 -x c -E -dM %s -o - | FileCheck --check-prefix=M7-THUMB %s
429// M7-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000430// M7-THUMB:#define __ARM_FEATURE_DSP
Richard Barton7dacc242015-10-21 10:03:55 +0000431// M7-THUMB:#define __ARM_FP 0xE
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000432
Ana Pazosdd6068d2013-12-06 22:43:17 +0000433// Test whether predefines are as expected when targeting krait.
434// RUN: %clang -target armv7 -mcpu=krait -x c -E -dM %s -o - | FileCheck --check-prefix=KRAIT-ARM %s
435// KRAIT-ARM:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000436// KRAIT-ARM:#define __ARM_FEATURE_DSP
Ana Pazosdd6068d2013-12-06 22:43:17 +0000437// KRAIT-ARM:#define __ARM_VFPV4__ 1
438
439// RUN: %clang -target armv7 -mthumb -mcpu=krait -x c -E -dM %s -o - | FileCheck --check-prefix=KRAIT-THUMB %s
440// KRAIT-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
Sergey Dmitrouk745f5302014-11-25 08:57:36 +0000441// KRAIT-THUMB:#define __ARM_FEATURE_DSP
Ana Pazosdd6068d2013-12-06 22:43:17 +0000442// KRAIT-THUMB:#define __ARM_VFPV4__ 1
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000443
444// RUN: %clang -target armv8.1a-none-none-eabi -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V81A %s
445// CHECK-V81A: __ARM_ARCH 8
446// CHECK-V81A: __ARM_ARCH_8_1A__ 1
447// CHECK-V81A: #define __ARM_ARCH_PROFILE 'A'
Alexandros Lamprineas502592c2015-11-29 10:43:59 +0000448// CHECK-V81A: __ARM_FEATURE_QRDMX 1
Richard Barton7dacc242015-10-21 10:03:55 +0000449// CHECK-V81A: #define __ARM_FP 0xE
Oliver Stannard3086c042016-02-11 16:05:52 +0000450
451// RUN: %clang -target armv8.2a-none-none-eabi -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V82A %s
452// CHECK-V82A: __ARM_ARCH 8
453// CHECK-V82A: __ARM_ARCH_8_2A__ 1
454// CHECK-V82A: #define __ARM_ARCH_PROFILE 'A'
455// CHECK-V82A: #define __ARM_FP 0xE