1 | /* Definitions of target machine for GCC for IA-32. |
2 | Copyright (C) 2002-2017 Free Software Foundation, Inc. |
3 | |
4 | This file is part of GCC. |
5 | |
6 | GCC is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 3, or (at your option) |
9 | any later version. |
10 | |
11 | GCC is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ |
19 | |
20 | /* The x86_64 ABI specifies both XF and TF modes. |
21 | XFmode is __float80 is IEEE extended; TFmode is __float128 |
22 | is IEEE quad. */ |
23 | |
24 | FRACTIONAL_FLOAT_MODE (XF, 80, 12, ieee_extended_intel_96_format); |
25 | FLOAT_MODE (TF, 16, ieee_quad_format); |
26 | |
27 | /* In ILP32 mode, XFmode has size 12 and alignment 4. |
28 | In LP64 mode, XFmode has size and alignment 16. */ |
29 | ADJUST_FLOAT_FORMAT (XF, (TARGET_128BIT_LONG_DOUBLE |
30 | ? &ieee_extended_intel_128_format |
31 | : TARGET_96_ROUND_53_LONG_DOUBLE |
32 | ? &ieee_extended_intel_96_round_53_format |
33 | : &ieee_extended_intel_96_format)); |
34 | ADJUST_BYTESIZE (XF, TARGET_128BIT_LONG_DOUBLE ? 16 : 12); |
35 | ADJUST_ALIGNMENT (XF, TARGET_128BIT_LONG_DOUBLE ? 16 : 4); |
36 | |
37 | /* Add any extra modes needed to represent the condition code. |
38 | |
39 | For the i386, we need separate modes when floating-point |
40 | equality comparisons are being done. |
41 | |
42 | Add CCNO to indicate comparisons against zero that require |
43 | Overflow flag to be unset. Sign bit test is used instead and |
44 | thus can be used to form "a&b>0" type of tests. |
45 | |
46 | Add CCGC to indicate comparisons against zero that allow |
47 | unspecified garbage in the Carry flag. This mode is used |
48 | by inc/dec instructions. |
49 | |
50 | Add CCGOC to indicate comparisons against zero that allow |
51 | unspecified garbage in the Carry and Overflow flag. This |
52 | mode is used to simulate comparisons of (a-b) and (a+b) |
53 | against zero using sub/cmp/add operations. |
54 | |
55 | Add CCGZ to indicate comparisons that allow unspecified garbage |
56 | in the Zero flag. This mode is used in double-word comparisons. |
57 | |
58 | Add CCA to indicate that only the Above flag is valid. |
59 | Add CCC to indicate that only the Carry flag is valid. |
60 | Add CCO to indicate that only the Overflow flag is valid. |
61 | Add CCP to indicate that only the Parity flag is valid. |
62 | Add CCS to indicate that only the Sign flag is valid. |
63 | Add CCZ to indicate that only the Zero flag is valid. */ |
64 | |
65 | CC_MODE (CCGC); |
66 | CC_MODE (CCGOC); |
67 | CC_MODE (CCNO); |
68 | CC_MODE (CCGZ); |
69 | CC_MODE (CCA); |
70 | CC_MODE (CCC); |
71 | CC_MODE (CCO); |
72 | CC_MODE (CCP); |
73 | CC_MODE (CCS); |
74 | CC_MODE (CCZ); |
75 | |
76 | CC_MODE (CCFP); |
77 | |
78 | /* Vector modes. Note that VEC_CONCAT patterns require vector |
79 | sizes twice as big as implemented in hardware. */ |
80 | VECTOR_MODES (INT, 4); /* V4QI V2HI */ |
81 | VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI */ |
82 | VECTOR_MODES (INT, 16); /* V16QI V8HI V4SI V2DI */ |
83 | VECTOR_MODES (INT, 32); /* V32QI V16HI V8SI V4DI */ |
84 | VECTOR_MODES (INT, 64); /* V64QI V32HI V16SI V8DI */ |
85 | VECTOR_MODES (INT, 128); /* V128QI V64HI V32SI V16DI */ |
86 | VECTOR_MODES (FLOAT, 8); /* V2SF */ |
87 | VECTOR_MODES (FLOAT, 16); /* V4SF V2DF */ |
88 | VECTOR_MODES (FLOAT, 32); /* V8SF V4DF V2TF */ |
89 | VECTOR_MODES (FLOAT, 64); /* V16SF V8DF V4TF */ |
90 | VECTOR_MODES (FLOAT, 128); /* V32SF V16DF V8TF */ |
91 | VECTOR_MODES (FLOAT, 256); /* V64SF V32DF V16TF */ |
92 | VECTOR_MODE (INT, TI, 1); /* V1TI */ |
93 | VECTOR_MODE (INT, DI, 1); /* V1DI */ |
94 | VECTOR_MODE (INT, SI, 1); /* V1SI */ |
95 | VECTOR_MODE (INT, QI, 2); /* V2QI */ |
96 | VECTOR_MODE (INT, QI, 12); /* V12QI */ |
97 | VECTOR_MODE (INT, QI, 14); /* V14QI */ |
98 | VECTOR_MODE (INT, HI, 6); /* V6HI */ |
99 | VECTOR_MODE (INT, SI, 64); /* V64SI */ |
100 | |
101 | POINTER_BOUNDS_MODE (BND32, 8); |
102 | POINTER_BOUNDS_MODE (BND64, 16); |
103 | |
104 | INT_MODE (OI, 32); |
105 | INT_MODE (XI, 64); |
106 | |
107 | /* Keep the OI and XI modes from confusing the compiler into thinking |
108 | that these modes could actually be used for computation. They are |
109 | only holders for vectors during data movement. */ |
110 | #define MAX_BITSIZE_MODE_ANY_INT (128) |
111 | |
112 | /* The symbol Pmode stands for one of the above machine modes (usually SImode). |
113 | The tm.h file specifies which one. It is not a distinct mode. */ |
114 | |